mini2440驱动奇谭——helloworld

        要不要这样,还没写好过驱动就要我去裁剪内核?  好吧,看到用户手册上“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 )

开发所需工具:NFS网络文件  minicom 

linux文件目录:/opt/FriendlyARM/mini2440/linux-2.6.32.2

自己驱动目录: /home/lianghuiyong/my2440drivers


pc端:

首先新建一个自己写的驱动的文件夹

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:= helloworld.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 helloworld.ko
rmmod:
	rmmod helloworld
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  查看日记   )




开发板端:

1、打开minicom (minicom带颜色启动是:minicom -c on),开发板上电
2、# mount -t nfs -o nolock 192.168.1.102:/NFSboot /mnt     //挂载 /NFSboot 目录到开发板 /mnt 下   //配置NFS网络文件
3、# cd /mnt
4、# ls
5、#  insmod helloworld.ko
6、#  lsmod
7、#  rmmod helloworld 



有可能第一次加载驱动时出现:
helloworld: module license 'Daul BSD/GPL' taints kernel.
Disabling lock debugging due to kernel taint
Hello,mini2440 module is installed!
只是内核的一个提示,没关系的,第三行就是我们要的信息,当我第二次insmod的时候,上面两行就没了


错误笔记:

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路径问题,KDIR要为开发板内核所在的目录,即linux-2.6.32.2的目录

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值