Linux 移植之驱动编译出现的问题
Linux 设备驱动 2010-05-22 09:24:51 阅读 173 评论 0 字号:大中小 订阅 中
近期搞 Linux 移植,出现了很多不可预知的问题。后来在师父及其客服的帮助下,完美解 决,没辜负我这几天的辛勤努力!我的内核是 Linux-2.6.30.4,以 EmbedSky_hello.c 为例。 我是根据 Linux 移植手册一步步移植的,以下是我出现的问题: 问题 1:在编译驱动模块时出现以下错误提示: GZIP IKCFG kernel/config_data.gz kernel/config_data.h
CC kernel/configs.o make[3]: *** No rule to make target `net/ipv4/netfilter/ipt_ECN.c', needed by `net/ipv4/netfilter/ipt_ECN.o'. Stop. make[2]: *** [net/ipv4/netfilter] Error 2 make[1]: *** [net/ipv4] Error 2 make: *** [net] Error 2 解决办法:本来移植手册里的选项如下所示:
我们仅需要添加这么多选项就够了, 别的全部去除, 但是里面有个默认选项不能去 除,否则会出现编译内核镜像不成功的情况。
如果不选这个默认选项,编译内核镜像时出现以下问题: drivers/net/dm9000.c: In function 'dm9000_probe': drivers/net/dm9000.c:1356: error: 'structnet_device' has no member named 'open' drivers/net/dm9000.c:1357: error: 'structnet_device' has no member named 'hard_start_xmit' drivers/net/dm9000.c:1358: error: 'structnet_device' has no member named 'tx_timeout' drivers/net/dm9000.c:1360: error: 'structnet_device' has no member named 'stop' drivers/net/dm9000.c:1361: error: 'structnet_device' has no member named 'set_multicast_list' drivers/net/dm9000.c:1363: error: 'structnet_device' has no member named
'do_ioctl' make[2]: *** [drivers/net/dm9000.o] Error 1 make[1]: *** [drivers/net] Error 2 make: *** [drivers] Error 2 ] 所以一定要加哦! 现在我用 make modules 编译驱动,出现以下问题: make[1]: *** No rule to make target `|', needed by `firmware/dabusb/firmware.fw'. Stop. make: *** [modules] Error 2 从网上搜了一下, make M=drivers/char modules 编译模块 ,用 编译模块,成功生 成.ko 文件。那个开心 。
问题 2:我用 insmod EmbedSky_hello.c 来加载模块,出现以下问题 出现以下问题: EmbedSky_hello: version magic '2.6.30.4EmbedSky mod_unload ARMv4 ' should be '2. 6.30.4-EmbedSky mod_unload ARMv4 ' EmbedSky insmod: cannot insert 'EmbedSky_hello.ko': invalid module format 一看就知道是版本问题,然后 make menuconfig 进入内核配置, 一看就知道是版本问题 General setup——>()Local version append to kernel release, >()Local version-append release,配置成 Local version-append to kernel release,就 OK 啦~ ~ (-EmbedSky)Local version 重新编译内核,驱动模块 驱动模块,将 EmbedSky_hello.ko 放到开发板中,重新加载 insmodEmbedSky_hello.ko,又出现问题了: insmodEmbedSky_hello.ko, EmbedSky_hello: Unknown symbol __aeabi_unwind_cpp_pr0 insmod: cannot insert 'EmbedSky_hello.ko': unknown symbol in module,
or annot unknown parameter 通过客服,刚开始以为是交叉编译器的问题,可是测试后交叉编译器是 可是测试后交叉编译器是 我相当郁闷了,通过客服 正常的,快崩溃了,最后才知道 是我的开发板里烧的是光盘提供给的镜像,而我自己移植 最后才知道,是我的开发板里烧的是光盘提供给的镜像 的驱动是在我自己编写的内核里生成.ko 文件, 的驱动是在我自己编写的内核里生成 导致了致命的错误, 模块和内核镜像不匹配, 模块和内核镜像不匹配 后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了 后来烧入我自己的内核和文件
系统 总算守得云开见月明了,终 于可以加载和卸载模块了! !