欢迎来到天天文库
浏览记录
ID:14036502
大小:43.00 KB
页数:6页
时间:2018-07-25
《基于linux2.6下的按键驱动开发步骤》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于Linux2.6下的按键驱动开发步骤实验平台:友善之臂s3c2410编译环境:ubuntu>arm-linux-gcc3.4.5内核版本:Linux2.6实验目的:在Linux下完成arm板上的8*8按键驱动开发,最终实现用一个中断程序实现 64个按键的中断触发,按键由16个io口实现矩阵键盘。 初次接触linux的驱动开发,很多的知识只能边学边做,虽说上是比较慢的,可这也是一个需要经历的过程,最终不管怎样,也是实现了项目的基本要求,在此期间的也学到了一些很基础性的知识,当然,很多东西只看是不能解决问题的,只需实验一下,
2、调试一下,结果比看要好的多了,在此也把我如何接触并如何面对一个毫无头绪的驱动问题下手总结如下。 入门:对于一个刚接触Linux的人来说只能是先了解驱动开发的原理了,动态加载驱动可以说是我了解的第一个概念了,在系统跑起来之后,把所编译的驱动用insmod再加载进去也就是所谓的动态加载了,当然也有卸载驱动的rmmod了,在这个基础上才正式的了解了一些很基础的命令知识。 理解驱动:这个过程也许是最为抽象的了,只能找了一个示例驱动来读,比较的难啃,有种只缘身陷此山中的感觉,幸亏还只是个按键驱动,短一点,这样的话最终还是了解了驱动的架构,主
3、要还是由几个函数组成,各个函数各有用途,总体结构是不变的,staticint__inits3c2410_button_init(void) //初始化硬件模块staticvoid__exits3c2410_button_exit(void) //卸载硬件模块module_init(s3c2410_button_init); //加载硬件模块module_exit(s3c2410_button_exit); //卸载 最主要的也是最基本的就是上面的几个子函数了,也可以说是格式化的东西了,一个
4、驱动中所必须拥有的函数,初始化和卸载其实都是些相反的过程,正如初始化干了些什么,而卸载再把所做得事情按相反的顺序去掉就行了,初始化硬件s3c2410_button_init(void)包括了:register_chrdev(0,DEVICE_NAME,&s3c2410_button_fops); //注册设备的函数,各参数含义: 0:需要动态分配一个设备号,如果注册成功的话,把设备号返回出来,当然这 个设备号以后卸载时要用到的 DEVICE_NAME:所定义的设备名,自己定义,加载模块后就可以查到的。
5、 &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); //卸载设备
6、的函数,主要传递了设备号和设备名。 接下来主要是&s3c2410_button_fops这个表的建立了,其实主要是一些对应的关系了staticstructfile_operationss3c2410_button_fops={ .owner=THIS_MODULE, .open =s3c2410_button_open, .release=s3c2410_button_close, .read =s3c2410_button_read,};在这里主要实现打开文件,关闭文件,读文件这几个功能,在驱动所写的程序中
7、也就是这三个函数:s3c2410_button_close()s3c2410_button_open()s3c2410_button_read()也就是通过这个结构表的建立,我们可以在应用程序中通过open,release,read来调用这几个函数,作用还是挺大的,接下来也该看看这几个函数的内部结构了。其中的open,close函数其实系统已经默认的做了很多的调用,也就是说如果只是打开文件关闭文件的话,里面置空就行了,系统会自动完成你所需要的。而read函数则是自己所要编写的。实现的一个基本功能就是内核到用户之间参数的传递,也就是把通过系统模式所读到
8、的数据通过 copy_to_user(buff,(char*)&button_ret,sizeof(un
此文档下载收益归作者所有