免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4562 | 回复: 5
打印 上一主题 下一主题

[驱动] 驱动移植 inmod不成功 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-05 18:00 |只看该作者 |倒序浏览
最近在做海思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),HI351

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的源文件,我该如何定位把这句添加上去呢?

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

论坛徽章:
0
2 [报告]
发表于 2016-01-06 10:15 |只看该作者
回复 1# du2he


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

论坛徽章:
0
3 [报告]
发表于 2016-01-07 13:21 |只看该作者
你用modprobe试试,可能是你依赖的其他module没有加载,因为insmod是不会自动加载依赖的module的,但是modprobe会。
或者是你知道这个module的依赖,然后自己手动加载其他module

论坛徽章:
0
4 [报告]
发表于 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

论坛徽章:
0
5 [报告]
发表于 2016-01-09 18:01 |只看该作者
谢谢耐心的回答。
我在源码包重新make menuconfig,配置好usb driver的功能,重新烧写板子内核就好了。

回复 4# EXPORT_SYMBOL


   

论坛徽章:
0
6 [报告]
发表于 2016-01-22 08:58 |只看该作者
楼主威武
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP