2020/9/15

Prepare minimum kernel sources for building external module

build external module

由於 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
這樣就完成了需要的 kernel source

之後,一樣把 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 :=

沒有留言:

張貼留言