由於 build module 需要用到 kernel 的 Makefile (和 Kbuild)。
所以必須要有 kernel 的 Makefile。
而用 make headers_install 做出來的 kernel headers 是不含 Makefile 。
所以必須要完整的 kernel source。
另外,必須要知道 kernel 的 配置,所以要包含 target 的 .config。
另外,還包含 arch link 和 generated header。
簡單的說,就是 source 還必須要 build 過。
Makefile 中,可以用 -C 指定 source,O 指定 output (當初build kernel 的 output)。
不然,就要放在一起。用 -C 指定。
先用標準的方法來試試看...
這個 就是hello.ko。
先 clone and build kernel:
- git clone --depth=1 https://github.com/raspberrypi/linux -b rpi-5.4.y pilinux
- git clone https://github.com/raspberrypi/tools.git pitool
- export PATH="/home/charles-chang/pitools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:$PATH"
- cd pilinux
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
- make -j 40 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
之後,一樣把 path 設好,到 helloko 下 make 舊可以 build 出給 pi 用的 hello.ko 了。
這是用完整的kernel source,但是make external module 只需要 Makefile, Kbuild, header,config。
所以可以把所有的 .c, .o, configs 目錄,都刪掉,
build kernel module 就是利用 kernel source 的 Makefile。
kernel 的 Makefile 有 support 一堆 option..
ref:kernel makehelp
helloko 的Makefile 用到..
- V=1 : 印出所有的 make 時的動作
- CROSS_COMPILE=arm-linux-gnueabihf-
- ARCH=arm
- -C $(KERNEL_DIR) : kernel source 位置
- M=$(PWD) : module 位置
遇到很有趣的事...
在把 cypress wifi 移出 kernel source ,改 external module 來 build 的時候...
Kbuild 中,有..
DHDCFLAGS += -DCONFIG_BCMDHD_FW_PATH=$(BCMDHD_FW_PATH)BCMDHD_FW_PATH 是環境變數,在 make 前先 export 好..
因為是字串,所以用 esc '\' 來加 '"' 符號...
export BCMDHD_FW_PATH="\"/lib/firmware/cypress/cyw88373/fw_cyw88373.bin\""結果 fail..
source code 中說 BCMDHD_FW_PATH 是 null..
對照成功的 log (build within kernel source),發現這個字串包含 esc code..
所以再esc 一次..
export BCMDHD_FW_PATH="\\\"/lib/firmware/cypress/cyw88373/fw_cyw88373.bin\\\""就 OK 了。
從一般的SDK 的 kernel source 準備一份可以 build external module 的 kernel header 的方法:
- make kernel image OK (好像是 make config 跟 make prepare 就可以?)
- copy kernel source (include hidden file)to /tmp/linuxheader
- copy kernel out (include hidden files) to /tmp/linuxheader
- remove all *.o,*.c,*.cmd
- copy kernel source/Makefile to /tmp/linuxheader because it was overwritten by the out source
- modify driver Makefile, obj-$(DRIVER_TYPE) += 要改成 obj-m :=
沒有留言:
張貼留言