linux键盘驱动注释

linux键盘驱动注释

ID:38364139

大小:41.50 KB

页数:8页

时间:2019-06-11

linux键盘驱动注释_第1页
linux键盘驱动注释_第2页
linux键盘驱动注释_第3页
linux键盘驱动注释_第4页
linux键盘驱动注释_第5页
资源描述:

《linux键盘驱动注释》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、键盘在所有的驱动之中最为简单的一种,但它却包含了驱动的基本框架,对以后继续深入学习其他复杂的驱动大有裨益,以下便为你逐步剖析驱动的开发。采用的是查询方式。转载请注明出处:一.内核模块的注册和撤销在加载模块的时候,首先运行的是内核模块的注册函数。它的功能包括内核注册设备以及变量的初始化。staticinthead,tail;int _initKeypad_init(void){intresult;result=register_chrdev(KEY_LED_MAJOR,KEY_LED_NAME,&Keypad_fo

2、ps);Keypad_clear();init_waitqueue_head(&queue);prink("%s%sinitialized.",KEY_LED_NAME,KEY_LED_VERSION);//不能用prinfreturn0;}module_init(Keypad_init);//加载模块void_exitKeypad_cleanup(void){del_timer(&timer);unregister_chrdev(KEY_LED_MAJOR,KEY_LED_NAME);prink("Keyp

3、addriverremoved");}module_exit(Keypad_cleanup);//卸载该模块二.虚拟文件系统与硬件驱动的接口staticstructfile_operationsKeypad_fops={open:Keypad_open,read:Keypad_read,poll:Keypad_poll,fasync:Keypad_fasync,release:Keypad_release,};该接口定义完之后一些便是对这几个具体函数的实现了!现在我们一起进入下一步吧,是不是觉得其实没什么难度

4、的呢?别那么早开心着呢?这几个函数的实现时候,涉及到很多技术,包括内核定时器,*等待队列的具体实现(阻塞方式),异步方式的具体实现技巧,循环队列。看到这么多技术你是否感到很兴奋呢?以下本人将以通俗的方式为你讲解,希望你能理解。三.设备的打开操作接口函数具体实现(Keypad_open)设备打开一般包括两大操作,一是完成设备的初始化,二是设备引用计数器加1staticintKeypad_open(structinode*inode,structfile*filp){read_xy();try_module_get(

5、THIS_MODULE);//此函数为Linux2.6内核增加的,不同于2.4内核,功能是计数器的值加1return0;}staticvoidread_xy(void){new_data();//获取键值函数keypad_starttimer();//开启内核定时器,在固定周期时间内获取键盘新的变化}以下实现键盘键值获取函数read_xy()主要是从KEY_CS(对应的读入地址,之前可以根据具体的硬件设备定义,比如#definekEY_CS(*(volatileunsignedshort*)(0xf820000)

6、)此处应该根据具体的不同而不同!将读入的键值存入buf[]缓存中,环形缓冲的写指针是head,读指针是tail,前面已经定义过了////////////////////////////////键盘事件的数据结构定义/////////////////////////////////typedefstruct{ulongstatus;//按键的值ulongclick;//是否有按键按下,1表示有,0表示没有}KEY_EVENTstaticKEY_EVENTcur_data,buf[BUFSIZE];//BUFSIZE

7、为宏定义,用于定义环形缓冲的大小staticvoidnew_data(void){if((KEY_CS&0xff)!=0xff) //从KEY_CS地址读入数据,若有一个为0则表示有一个按键被按下了(此处硬件电路为低电平有效){switch(KEY_CS&0xff){case~KEY0&0xff:cur_data.status=1;///////1被按下break;case~KEY1&0xff:cur_data.status=2;//2被按下break;/////////其他一样添加,懂吗??}cur_data.

8、click=1;}elseif(KEY_CS&0xff==0xff){cur_data.click=0;cur_data.status=0;}if(head!=tail){////////循环队列缓冲区的应用在此开始了^_^intlast=head--;if(last<0)////////若已经到了对首之前,则跳到队尾,以实现循环队列last=BUFSIZE-1;}///

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。