标签:invalid module forma 2440驱动开发入门 helloworld驱动 驱动奇谭helloworld insmod helloworld.ko
要不要这样,还没写好过驱动就要我去裁剪内核? 好吧,看到用户手册上“ LED 驱动已经被编译到缺省内核中,因此不能再使用 insmod 方式加载。 ” 我重新把手册上手工定制内核走了一遍,把自己之后要写的一些驱动给否掉,以便可以insmod
去掉的驱动有:lcd驱动(包括其中有个logo的选项),触摸屏驱动,音频驱动,看门狗驱动,I2C驱动,pwm驱动,led驱动,按键驱动,A/D驱动,RTC驱动
由于把lcd驱动否掉了,开发板里也就没烧写qt,之烧写了文件系统rootfs,文件名为:rootfs_rtm_2440.img (光盘目录:image/linux/rtm )
这是第一篇驱动,为了纪念下追剧一个暑假,越演越狗血的电视剧--古剑奇谭,就写成驱动奇谭吧
系统:Ubuntu 12.04
驱动交叉编译内核:linux-2.6.32.2 //建立交叉编译
开发板:mini2440 (128M nandflash) //关于怎么烧写linux到开发板请点击,Linux RootFs 选择rootfs_rtm_2440.img (光盘目录:image/linux/rtm )
首先新建一个自己写的驱动的文件夹
1. # mkdir /home/lianghuiyong/my2440drivers //新建文件夹
2. # cd /home/lianghuiyong/my2440drivers //进入文件夹
3. # VIM helloworld.c
helloworld.c 内容为:
#include<linux/init.h> #include<linux/module.h> static int hello_init(void) { printk(KERN_ALERT "Hello,mini2440 module is installed!\n"); return 0; } static void hello_cleanup(void) { printk(KERN_ALERT "Good-bye,mini2440 module was removed!\n"); } module_init(hello_init); module_exit(hello_cleanup); MODULE_LICENSE("Daul BSD/GPL");
代码中module_init ,module_exit是驱动模块加载、卸载函数,MODULE_LICENSE("Daul BSD/GPL");是模块许可证声明,依照 Daul BSD/GPL 协议
4. VIM Makefile
Makefile内容:(2.4内核和2.6内核的写法有点不同,以下为2.6的写法)
PWD = $(shell pwd) KDIR =/opt/FriendlyARM/mini2440/linux-2.6.32.2/ obj-m:= <span style="color:#ff0000;">helloworld</span>.o all: $(MAKE) -C $(KDIR) M=$(PWD) CONFIG_DEBUG_SECTION_MISMATCH=y clean: rm -rf *.o *~core.depend. *.cmd *.ko *.mod.c .tmp_versions rm -rf *.order Module.* insmod: insmod <span style="color:#ff0000;">helloworld</span>.ko rmmod: rmmod <span style="color:#ff0000;">helloworld</span> active: echo -e "$(MAKE) \n" $(MAKE) -C $(KDIR) M=$(PWD)注意一:KDIR后接的目录要为友善之臂提供的内核所安装的目录,之前我使用网友的一段:KDIR :=/lib/modules/$(shell uname -r)/build,其实这里的目录是ubuntu内核目录,ubuntu内核版本(3.2)和开发板的内核版本(2.6)是不相同的,所以如果在ubuntu内核下编译生成的驱动是不能在开发板上insmod的!会提示 invalid module format错误,其中三个helloworld(红色)要随helloworld.c更改
5、# make
6、# cp ./helloworld.ko /NFSboot/
注意二:由于编写驱动的内核是开发板的内核(2.6),而ubuntu的内核是3.2,所以这个驱动在ubuntu上是insmod不了的。附( 如果是用ubuntu的内核写的驱动的话,insmod后没有打印相关信息,可以使用 cat
/var/log/kern.log | tail 查看日记 )
helloworld: module license 'Daul BSD/GPL' taints kernel. Disabling lock debugging due to kernel taint Hello,mini2440 module is installed!
1丶 make: *** /opt/FriendlyARM/mini2440/linux-2.6.32.2M=/home/lianghuiyong/my2440driversmodeles: 没有那个文件或目录。 停止。
这个应该是makefile书写问题,不同的内核版本,书写有些不同,详情点击
2丶insmod: can‘t read ‘helloworld‘: No such file or directory
insmod需要加文件后缀 .ko
3丶insmod: error inserting ‘****.ko‘: -1 File exists
之前insmod后没有rmmod,解决方法:rmmod ****
4丶insmod: cannot insert ‘helloworld.ko‘: invalid module format
这是因为修改了makefile之后没有将之前编译所产生的文件删除。除了makefile和 .c 文件,其余删除,再make
还有一个重要的原因是KDIR要为开发板内核所在的目录,即linux-2.6.32.2的目录
标签:invalid module forma 2440驱动开发入门 helloworld驱动 驱动奇谭helloworld insmod helloworld.ko
原文地址:http://blog.csdn.net/muyang_ren/article/details/39562639