2011-10-18 102 views
3

我將一個外部驅動程序模塊添加到Android薑餅內核(類似於Linux)。我之前已經完成了它,它的工作,但這次我有一個問題。我按照O'Reilly的「Linux設備驅動程序第三版」,這是發現的食譜:內核驅動程序外部模塊不完全構建

在當地的Makefile

,添加這些語句:

obj-m := GobiNet.o 
    GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o 

在人類語言就意味着打造我GobiNet。來自GobiUSBNet.c + QMIDevice.c + QMI.c.

這是在構建整個內核時調用makefile的情況。我在Ubuntu x86-64bit上交叉編譯ARM-EABI系統(Cortex-A8)。

不知何故,構建系統瞭解我想要的東西,因爲它在編譯時說:

/home/sylvain/Projects/android_gingerbread_realv210_ver_1_0/kernel 
    CHK  include/linux/version.h 
    CHK  include/generated/utsrelease.h 
make[1]: `include/generated/mach-types.h' is up to date. 
    CALL scripts/checksyscalls.sh 
    CHK  include/generated/compile.h 
    LD  drivers/cell/OptionGobiNet/built-in.o 
    CC [M] drivers/cell/OptionGobiNet/GobiUSBNet.o 
    CC [M] drivers/cell/OptionGobiNet/QMIDevice.o 
    CC [M] drivers/cell/OptionGobiNet/QMI.o 
    LD [M] drivers/cell/OptionGobiNet/GobiNet.o 
    Kernel: arch/arm/boot/Image is ready 
    SHIPPED arch/arm/boot/compressed/lib1funcs.S 
    AS  arch/arm/boot/compressed/lib1funcs.o 
    LD  arch/arm/boot/compressed/vmlinux 
    OBJCOPY arch/arm/boot/zImage 
    Kernel: arch/arm/boot/zImage is ready  
    Building modules, stage 2. 
    MODPOST 5 modules 
ERROR: "usbnet_suspend" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined! 
ERROR: "usbnet_resume" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined! 
ERROR: "usbnet_disconnect" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined! 
ERROR: "usbnet_probe" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined! 
make[1]: *** [__modpost] Error 1 
make: *** [modules] Error 2 

它也產生了典型的「GobiNet.mod.c」和「GobiNet.o」時產生,當你希望驅動程序作爲一個模塊,但它不會與我期望的「GobiNet.ko」完成。我在主目錄中運行了「find -name * .ko」,並且「GobiNet.ko」無處可尋。

我也查看了WEB和kernel/documentation/kbuild/*。txt。有三種方法可以做到這一點。我選擇了上面描述的一個,因爲所有的環境變量都是在頂層構建腳本中設置的,並且我不編譯本地,但是我交叉編譯。無論如何,內核樹中的其他「.ko」都會生成,所以構建腳本應該很好地生成「.ko」模塊。

任何想法是什麼讓這個過程開始,但沒有完成「.ko」文件?

回答

5

我找到了解決方案。我真的誤解了錯誤信息以及「.ko」模塊如何與內核交互。外部模塊在編譯/鏈接時不是在運行時解析外部(至少有一些)。這就是我得到4個「錯誤」的原因。

也就是說,我的「GobiNet」正在尋找我的內核設置中不存在的外部符號。幾個快速greps讓我找到它需要的「drivers/net/usb/usbnet.c」。這需要在「.config」文件中設置CONFIG_USBNET = y(通過「make xconfig」設置)。希望它可以幫助別人。

+0

我收到了一些錯誤:aml_unregister_fe_drv ite9133_fe.ko undefined –

相關問題