- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于Linux2.6下的按键驱动开发步骤
实验平台:友善之臂s3c2410
编译环境:ubuntu arm-linux-gcc3.4.5
内核版本:Linux2.6
实验目的:在Linux下完成arm板上的8*8按键驱动开发,最终实现用一个中断程序实现????? ???? 64个按键的中断触发,按键由16个io口实现矩阵键盘。
?????? 初次接触linux的驱动开发,很多的知识只能边学边做,虽说上是比较慢的,可这也是一个需要经历的过程,最终不管怎样,也是实现了项目的基本要求,在此期间的也学到了一些很基础性的知识,当然,很多东西只看是不能解决问题的,只需实验一下,调试一下,结果比看要好的多了,在此也把我如何接触并如何面对一个毫无头绪的驱动问题下手总结如下。
?????? 入门:对于一个刚接触Linux的人来说只能是先了解驱动开发的原理了,动态加载驱动可以说是我了解的第一个概念了,在系统跑起来之后,把所编译的驱动用insmod再加载进去也就是所谓的动态加载了,当然也有卸载驱动的rmmod了,在这个基础上才正式的了解了一些很基础的命令知识。
?????? 理解驱动:这个过程也许是最为抽象的了,只能找了一个示例驱动来读,比较的难啃,有种只缘身陷此山中的感觉,幸亏还只是个按键驱动,短一点,这样的话最终还是了解了驱动的架构,主要还是由几个函数组成,各个函数各有用途,总体结构是不变的,
static int __init s3c2410_button_init(void)? //初始化硬件模块
static void __exit s3c2410_button_exit(void)? //卸载硬件模块
module_init(s3c2410_button_init); ????????? //加载硬件模块
module_exit(s3c2410_button_exit);???????? //卸载?????????????????
最主要的也是最基本的就是上面的几个子函数了,也可以说是格式化的东西了,一个驱动中所必须拥有的函数,初始化和卸载其实都是些相反的过程,正如初始化干了些什么,而卸载再把所做得事情按相反的顺序去掉就行了,
初始化硬件s3c2410_button_init(void)包括了:
register_chrdev(0,DEVICE_NAME,s3c2410_button_fops);
?????? //注册设备的函数,各参数含义:
?????? 0: 需要动态分配一个设备号,如果注册成功的话,把设备号返回出来,当然这??????? 个设备号以后卸载时要用到的
?????? DEVICE_NAME:所定义的设备名,自己定义,加载模块后就可以查到的。
?????? s3c2410_button_fops:一个应用文件表,其中定义了通过映射怎么操作设备等等。
devfs_mk_cdev(MKDEV(s3c2410_button_major,0), S_IWUSR,DEVICE_NAME);
?????? 加载设备到文件系统,很格式化的东西
当然卸载硬件则是一个相反的过程了, s3c2410_button_exit()包括了:
devfs_remove(DEVICE_NAME);//刚好相反的过程
unregister_chrdev(s3c2410_button_major,DEVICE_NAME);
?????? //卸载设备的函数,主要传递了设备号和设备名。
?
?
接下来主要是s3c2410_button_fops这个表的建立了,其实主要是一些对应的关系了
static struct file_operations s3c2410_button_fops = {
?????? .owner = THIS_MODULE,
?????? .open? = s3c2410_button_open,
?????? .release=s3c2410_button_close,
?????? .read? = s3c2410_button_read,
};
在这里主要实现打开文件,关闭文件,读文件这几个功能,在驱动所写的程序中也就是这三个函数:
s3c2410_button_close()
s3c2410_button_open()
s3c2410_button_read()
也就是通过这个结构表的建立,我们可以在应用程序中通过open,release,read来调用这几个函数,作用还是挺大的,接下来也该看看这几个函数的内部结构了。
其中的open,close函数其实系统已经默认的做了很多的调用,也就是说如果只是打开文件关闭文件的话,里面置空就行了,系统会自动完成你所需要的。而read函数则是自己所要编写的。实现的一个基本
原创力文档


文档评论(0)