【ARM】Linux驱动移植

【ARM】Linux驱动移植

#1驱动模块移植过程
##1.1模块的第一种编译方法——改kconfig

 

  • 第一步:改kconfig

文件在:Drivers/char/kconfig;
tristate三态表示可以编译在模块<M>
bool表示只能被选择编[*]或不编[ ]

 

 

  • 第二步:配置内核

make menuconfig后会自动生成供编译的.config文件。

 

 

 

如果make menuconfig没有出来该选项,可先cp config_n35 .config->make-> make menuconfig,然后成生如下.config文件。

 

 

如果选择是[*],即yes,则该驱动在系统运行自动加载;如果选择是<M>,则要使用该驱动要手工加载。

第三步:编译内核得到驱动模块
make,后生成对应的驱动模块.ko文件。

 

qq2440_leds.ko

 

 ./mkimage.sh

 

  • 第四步:拷贝到文件系统,挂载板子,插入模块

 

 

 运行示例程序编译出来的./a.out,板子的LED就会亮了。
License问题很需要在驱动代码加入MODULE_LICENSE("GPL");

 

 

  • 示例程序

应用程序,通过驱动调用板子LED。

 

 

##1.2模块的第二种编译方法——Makefile

  • 第一步:写Makefile
  • 第二步:直接把内核驱动拷贝出来

  • 第三步:编译

  • 第四步:安装

  • 第五步:插入模块看现象

 

 #2Linux驱动原理
##2.0从哪里切入
开发板自带的led程序(qq2440_leds_init)【被module_init调用----知道这里就行了】

##2.1什么是注册

##2.2register_chrdev提交哪些数据

 

 ###2.2.1设备号为什么是231
怎么知道设置231

 

 http://blog.csdn.net/zjjyliuweijie/article/details/7001383
设置为231是因为231没有人使用。
###2.2.2设备名随便给

 

 

 ###2.2.3文件操作结构体怎么设置

 

 

file_operations中各项解析
http://blog.csdn.net/sunsea1026/article/details/6586143
####什么是THIS_MODULE?
THIS_MODULE在代码中复制给了owner,owner顾名思义是属主的意思,当把THIS_MODULE复制给owner,表示该结构体属于当前模块,那么当前模块又是谁呢?当前模块就是:

 

 

####Open,close,read这些都好理解

##2.3register_chrdev返回什么?

 

 

###2.3.1 简洁而高效的goto
用不用goto一直是一个著名的争议话题,Linux内核源码中对goto的应用非常广泛,但一般只局限于错误处理中!这种goto用于错误处理的用法实在是简单而高效,只需保证在错误处理的时候记得注销,释放资源等!(与正常的注册,申请资源顺序相反)
###2.3.2 还记得什么是三目运算符吗?

 

 

###2.3.3 返回0表示什么?
当major为真的时候返回0,是什么意思呢?
Major为真的情况,只有可能>0,因为major的类型是unsigned。所以,当major大于0的时候,函数返回0,表示函数执行成功!
###2.3.4 什么情况下返回cd->major?
Major为假的情况,只有一种情况,等于零。那么major=0,表示什么呢?
当在调用register_chrdev函数的时候,

  • 如果传进去的major=0,表示自己不定义设备号,由系统自动分配!
  • 如果传进去的major>0,表示传入自己定义的设备号,不用系统自动分配!

我们是怎么知道的?

 

 ###2.3.5 次设备号怎么分配呢?

 

 ###2.3.6 出错返回什么?

 

 ENOMEM是什么?

 

 现在能猜出cdev_add返回什么吗?

 

 

##2.4字符设备到底注册到了哪里?

##2.5devfs_mk_cdev实现了什么?
Device FileSystem Make CharDevice

 

 主要实现在文件系统下面建立一个设备文件,设备文件的名称就是DEVICE_NAME;

 

 ###2.5.1 devfs_mk_cdev参数怎么用?

 

 ###2.5.2 MKDEV功能
Make Device

 

 ###2.5.3 访问模式
Chmod ,0777,umask

 

 [转载]stat函数与结构体
http://blog.sina.com.cn/s/blog_6dd1df4e0100o50q.html
###2.5.4 现象
下面是驱动成功注册后,在文件系统中生成的设备文件。

 

 ##2.6file_operations结构体如何实现

 

 ###2.6.1 qq2440_leds_ioctl要实现哪些功能?

 

 ###2.6.2 s3c2410_gpio_setpin在哪里

 

 ##2.7引脚控制

这里s3c2410_gpio_cfgpins3c2410_gpio_setpin就对接上篇文章《ARM接口技术》原理了。

 

 ##2.8代码调用关系

 

 ##2.9module_init函数
参考《linux驱动的入口函数module.docx》
#附录
工具下载链接:
https://github.com/1040003585/Mini2440/tree/master/Tools

————————————————
版权声明:本文为CSDN博主「Wu_Being」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014134180/article/details/72887673

posted @   blankjyn  阅读(457)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示