du2he 发表于 2016-01-05 18:00

驱动移植 inmod不成功

最近在做海思3518E摄像头 无线网卡的驱动移植,遇到以下的问题,困惑了几天还没能解决。

********************************************************************************************

我用虚拟机安装Ubuntu10.04,内核的版本是3.0.8;

海思3518E摄像头的内核版本也是3.0.8;

摄像头的开发资料提供了内核源码:linux-3.0.y;交叉编译工具arm-hisiv100nptl-linux;mt7601无线驱动包;

********************************************************************************************

我在虚拟机安装交叉编译工具arm-hisiv100nptl-linux,并重新编译了内核源码:linux-3.0.y;

然后我进入mt7601无线驱动包,修改Makefile文件的内容,主要是选好目标平台,内核源码路径,交叉编译工具路径

ifeq ($(PLATFORM),HI3518)

LINUX_SRC = ../linux-3.0.y

CROSS_COMPILE = /opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-

endif

*******************************************************************************************

接着我执行make命令顺利编译出mt7601Usta.ko文件。

然后我打开摄像头,用nfs服务挂载到存放mt7601Usta.ko的目录上。

那么问题来了,

当我执行insmod mt7601Usta.ko命令时,出现如下错误:

# insmod mt7601Usta.ko
mt7601Usta: Unknown symbol usb_alloc_urb (err 0)
mt7601Usta: Unknown symbol usb_free_urb (err 0)
mt7601Usta: Unknown symbol usb_alloc_coherent (err 0)
mt7601Usta: Unknown symbol usb_register_driver (err 0)
mt7601Usta: Unknown symbol usb_put_dev (err 0)
mt7601Usta: Unknown symbol usb_get_dev (err 0)
mt7601Usta: Unknown symbol usb_submit_urb (err 0)
mt7601Usta: Unknown symbol usb_free_coherent (err 0)
mt7601Usta: Unknown symbol warn_slowpath_null (err 0)
mt7601Usta: Unknown symbol usb_control_msg (err 0)
mt7601Usta: Unknown symbol wireless_send_event (err 0)
mt7601Usta: Unknown symbol usb_deregister (err 0)
mt7601Usta: Unknown symbol usb_kill_urb (err 0)
insmod: can't insert 'mt7601Usta.ko': unknown symbol in module, or unknown parameter

********************************************************************************************

于是我度娘了关于insmod:unknown symbol in module, or unknown parameter的信息,发现有很多遇到过同样问题的朋友,解决方法是添加MODULE_LICENSE("GPL");

那么问题来了,包中有很多.c的源文件,我该如何定位把这句添加上去呢?

********************************************************************************************

daniel_kohler 发表于 2016-01-06 10:15

回复 1# du2he


    在有module_init的那些文件里面添加。

shiweixingcn 发表于 2016-01-07 13:21

你用modprobe试试,可能是你依赖的其他module没有加载,因为insmod是不会自动加载依赖的module的,但是modprobe会。
或者是你知道这个module的依赖,然后自己手动加载其他module

EXPORT_SYMBOL 发表于 2016-01-08 20:44

关于你的驱动移植insmod失败的问题,是由kernel的符号表没有包含相关依赖模块引起的,insmod时提示Unknown symbol ***(err 0)中的内容。你可以cat /proc/kallsyms|grep ***查看是否包含在其中。
usb_alloc_urb,usb_deregister等函数明显是在头文件usb/serial.h中的。
解决办法有2:
首先提取现有内核的符号表与内核配置,放到源代码目录下,然后重新编译驱动。(但首先确定未定义的函数符号表中是否存在)
另外的办法就是重定义缺失的函数,在驱动源码中输出符号表到系统内核中即可解决该问题。
如果上面的办法还是失败了,说明你该好好闭关一下了。最后,重新编写一个额外的内核模块,调用缺失的函数,输出符号表,将缺失函数的符号表记录下来,在内核源码目录下打开Module.symvers文件(符号表),设定好对应缺失函数的符号表假地址(16进制,比如0xaabbccdd),当驱动编译后,用16进制编辑器手工修改符号表地址,地址是反过来的,比如符号表中地址是0xaabbccdd,hex中就是ddccbbaa。
如果还是做不到,请自行恶补linux系统相关知识。
root@rolllamp.com

du2he 发表于 2016-01-09 18:01

谢谢耐心的回答。
我在源码包重新make menuconfig,配置好usb driver的功能,重新烧写板子内核就好了。

回复 4# EXPORT_SYMBOL


   

岳达 发表于 2016-01-22 08:58

楼主威武{:1_1:}
页: [1]
查看完整版本: 驱动移植 inmod不成功