2440驱动奇谭--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

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:= <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  查看日记   )

开发板端:

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

时间: 2024-12-17 05:13:03

2440驱动奇谭--helloworld的相关文章

mini2440驱动奇谭——LED驱动与测试(动态加载)

我的博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态加载led驱动模块并能通过测试程序 系统:Ubuntu 14.04 驱动交叉编译内核:linux-2.6.32.2               //建立交叉编译 开发板:mini2440 (128M nandflash)     //关于怎么烧写linux到开发板请点击,Linux RootFs 选择rootfs_rtm_2440.img  (光盘目录:image/linux/rtm ) 开发所需工具:

linux驱动开发之HelloWorld

最近实习,公司项目搞的是平板开发,而我分配的任务是将驱动加载到内核中. 准备工作,必要知识了解:加载有两种方式,一种是动态加载和卸载即模块加载,另一种是直接编译进入内核:Linux内核把驱动程序划分为3种类型:字符设备.块设备和网络设备.字符设备和块设备可以像文件一样被访问.它们的主要区别不在于能否seek,而是 在于系统对于这两种类型设备的管理方式.应用程序对于字符设备的每一个I/O操作,都会直接传递给系统内核对应的驱动程序:而应用程序对于块设备的操作, 要经过系统的缓冲区管理,间接传递给驱动

Linux内核驱动学习(三)----内核模块基础 | 设计 | 可选项

内核模块基础--特点及其命令使用 1.模块本身并不被编译进内核文件(zImage或bzImage) 2.可以根据需要在内核运行时动态加载.卸载---->进而达到节省空间的目的 命令详解(以下载驱动DNW为例): insmod 模块名称(注意有.ko后缀)--安装 insmod dnw_usb.ko lsmod-->查看安装的内核模块 rmmod 模块名称(注意没有.ko后缀)---->卸载内核模块 rmmod dnw_usb 内核模块设计--简单的模块编写 根据上图范例代码,比较应用程序

win7(X64)+wdk7驱动环境搭建

-----  蓝 屏 警 告 --- 加载驱动的操作请在虚拟机中完成, 可以有效避免物理机蓝屏 或者其他情况出现 带来的损失. 1.准备 wdk7下载地址:   https://www.microsoft.com/en-us/download/details.aspx?id=11800   vmware12: (我选择vmware12是因为 其对win7的支持,有些版本对操作系统的是有要求的) win7:   https://msdn.itellyou.cn/        打开后,选择左侧的操

OKR实施方法——关于思路和流程的思考

关于本文 本文是个人对OKR的思考,重点关注实施方法. 本文参考了明道云.飞书OKR.嗨马OKR.辉哥奇谭等. 其实没有标准的OKR,重点是思想的升华和合适的方法. 个人理解一定存在差异,欢迎同我沟通探讨. 本文的当前版本:v1.0 (发表于20200301) 本文的部分内容存在引用,如有侵犯请联系我删除. 了解OKR 听说OKR 听说OKR时,罗孚只知道OKR ≠ KPI,不需要KPI的考核就能把事情做好,看上去比KPI更厉害似的. 翻了翻<OKR:源于英特尔和谷歌的目标管理利器>,知道OK

使用Wine 1.6.2 在OS X El Capitan下运行Galgame

经过一些尝试,我成功在OS X El Capitan下使用wine运行了一些windows游戏,下面来逐一介绍运行这些游戏的经验. 魔法使之夜 引擎:Kirikiki 2 语言:日本语 打开游戏iso后拷贝游戏所在目录到本地文件夹(我用的是$HOME/mahoyo),打好免cd补丁,假设可执行文件为“nodvd.exe”. 使用命令“LANG=ja_JP wine nodvd.exe”,发现plugins目录下“魔法使いの夜.tpm”文件无法打开,这是因为该文件的文件名为UTF-8编码的日语字符

全球100部最佳影片排行

全球100部最佳影片排行 以下是IMDB(美国著名影评网站)网民评出全球100部最佳影片 :  1. <教父>The Godfather 1972年 8.9 分  科波拉黑帮经典<教父>的首部,派拉蒙公司最成功的影片之一,坐稳IMDB头把交椅应属,众望所归.虽然评论界一致对<教父>系列的第2集推崇有佳,但大多数影迷似乎还是对<教父>情有独钟,这可能与马龙·白兰度极具个力的表演有关,直到今天他那种含 糊沙哑的声音与神秘莫测的表情都依然叫人着迷.  2. <

Android开发的十个建议

尽管现在Android智能手机和平板电脑的运行的速率越来越快,但开发者仍需牢记,应用的运行环境仍受到电池和处理器等诸多资源的限制.以下是如何为应用“瘦身”的十条建议,以便能在当前和以后的所有Android设备都能运行出最佳效果. 1) 首先要有良好的编码习惯   一个优秀的开发者应该善于运用知识.完善的算法和标准设计模式.要有资源意识,打开了就要记得关闭,尽量做到晚获取.早释放.这些由来已久的编码准则同样适用Android应用开发,尤其是使用基础设备服务时. 2) 让阻塞操作原理UI线程   通

C语言中数据的两种属性及static的作用

C语言中数据有两种属性:数据类型和存储类别.数据类型定义了数据格式(长度),存储类别定义了数据的作用域和生命期. 1.变量的声明 1.1 变量的声明的一般形式:存储类别 数据类型 变量名;数据类型以int为例: 自动变量:auto int i;//自动变量是局部变量 局部变量:在函数内部定义的变量,局部变量缺省存储类别时就是自动变量 作用域:从定义开始到函数结束. 生命期:从函数调用开始到函数推出为止. 外部变量/全局变量:在函数外部定义而没有指出存储类别的变量 定义外部变量:extern in