在 Beaglebone black/Debian 上編譯 linux 核心模組時 crc8 未定義
我正在嘗試在我的 beaglebone black (BBB) 上使用 TI 電池監視器 BQ76PL536 的設備驅動程序。驅動程式碼位於:https ://github.com/tommessick/bq76pl536 。
儘管作者已經測試了交叉編譯的 Ubuntu 工具鏈,但我嘗試直接在我的 BBB 上編譯核心模組。
我做了
sudo apt-get install linux-headers-4.4.9-ti-r25
安裝相關的核心標頭檔,然後使用以下
Makefile
DRIVER = bq76pl536 ifneq ($(KERNELRELEASE),) obj-m += $(DRIVER).o else PWD := $(shell pwd) default: ifeq ($(strip $(KERNELDIR)),) $(error "KERNELDIR is undefined!") else $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif
我定義了
KERNELDIR=/lib/modules/4.4.9-ti-r25/build/
. 我按照這裡的說明進行操作:http: //derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/我的輸出
make
是:make make -C /lib/modules/4.4.9-ti-r25/build/ M=/var/lib/cloud9/bq76_driver/bq76pl536 modules make[1]: Entering directory '/usr/src/linux-headers-4.4.9-ti-r25' Building modules, stage 2. MODPOST 1 modules WARNING: "crc8_populate_msb" [/var/lib/cloud9/bq76_driver/bq76pl536/bq76pl536.ko] undefined! WARNING: "crc8" [/var/lib/cloud9/bq76_driver/bq76pl536/bq76pl536.ko] undefined! make[1]: Leaving directory '/usr/src/linux-headers-4.4.9-ti-r25'
在創建 .o、.ko 等文件時。當我嘗試使用載入模組時
insmod
出現錯誤:sudo insmod ./bq76pl536.ko insmod: ERROR: could not insert module ./bq76pl536.ko: Unknown symbol in module
我的
dmesg
輸出如下dmesg | tail [ 21.564768] eqep 48304180.eqep: failed to get clock [ 21.605265] c_can_platform 481cc000.can: c_can_platform device registered (regs=fa1cc000, irq=207) [ 21.661309] c_can_platform 481d0000.can: c_can_platform device registered (regs=fa1d0000, irq=208) [ 21.768584] eqep: probe of 48304180.eqep failed with error -2 [161381.366409] bq76pl536: Unknown symbol crc8 (err 0) [161381.366768] bq76pl536: Unknown symbol crc8_populate_msb (err 0) [162501.175612] bq76pl536: Unknown symbol crc8 (err 0) [162501.175973] bq76pl536: Unknown symbol crc8_populate_msb (err 0)
我無法理解此錯誤的起源 - 編譯器無法找到函式:
crc8
並且crc8_populate_msb
,當它們在 crc8.h 中定義時,可在標頭中訪問:/linux/crc8.h
錯誤不是來自編譯器,而是來自連結器。標頭檔只包含函式的聲明,它們不包含函式的程式碼,因此在標頭檔中聲明函式不足以執行它。建構時連結器警告您它沒有找到定義函式的位置。當您嘗試載入模組時,核心會執行最後的連結步驟。在那個階段,載入的模組使用的所有函式都必須由正在執行的核心定義。在您的情況下,
crc8
模組需要,但核心未定義,因此無法載入模組。該
crc8
功能是一個可選功能,必須在建構時使用CONFIG_CRC8
(“庫常式”下的“CRC8 功能”)啟用。它可以作為模組載入,也稱為crc8
. 嘗試modprobe crc8
如果這可行,那麼您的安裝具有該
crc8
模組。編譯bq76pl536
安裝後/lib/modules
,執行depmod -a
;這會生成一個依賴文件,然後bq76pl536
正常載入(即 withmodprobe bq76pl536
,而不是直接 withinsmod
)也將載入crc8
模組。如果這不起作用,那麼您的安裝沒有該
crc8
模組,您需要使用它重新編譯核心。使用 Ubuntu 的打包和配置(改變那一項配置項除外)。請參閱Ubuntu wiki了解演練。由於您已經修改了配置,因此請確保debian.master/changelog
按照 wiki 中的說明添加版本修飾符。然後在新核心下重新啟動並針對新核心重新編譯bq76pl536
模組。