网站大量收购独家精品文档,联系QQ:2885784924

linux键盘驱动注释.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux键盘驱动注释

键盘在所有的驱动之中最为简单的一种,但它却包含了驱动的基本框架,对以后继续深入学习其他复杂的驱动大有裨益,以下便为你逐步剖析驱动的开发。采用的是查询方式。转载请注明出处: 一.内核模块的注册和撤销 在加载模块的时候,首先运行的是内核模块的注册函数。它的功能包括内核注册设备以及变量的初始化。 static int head,tail; int? _init Keypad_init(void) { int result; result=register_chrdev(KEY_LED_MAJOR,KEY_LED_NAME,Keypad_fops); Keypad_clear(); init_waitqueue_head(queue); prink(%s %s initialized.\n,KEY_LED_NAME,KEY_LED_VERSION);//不能用prinf return 0; } module_init(Keypad_init);//加载模块 void _exit Keypad_cleanup(void) { del_timer(timer); unregister_chrdev(KEY_LED_MAJOR,KEY_LED_NAME); prink(Keypad driver removed \n); } module_exit(Keypad_cleanup);//卸载该模块 二.虚拟文件系统与硬件驱动的接口 static struct file_operations Keypad_fops={ open:Keypad_open, read:Keypad_read, poll:Keypad_poll, fasync:Keypad_fasync, release:Keypad_release, }; 该接口定义完之后一些便是对这几个具体函数的实现了!现在我们一起进入下一步吧,是不是觉得其实没什么难度的呢?别那么早开心着呢?这几个函数的实现时候,涉及到很多技术,包括内核定时器,*等待队列的具体实现(阻塞方式),异步方式的具体实现技巧,循环队列。看到这么多技术你是否感到很兴奋呢?以下本人将以通俗的方式为你讲解,希望你能理解。 三.设备的打开操作接口函数具体实现(Keypad_open) 设备打开一般包括两大操作,一是完成设备的初始化,二是设备引用计数器加1 static int Keypad_open(struct inode *inode,struct file *filp) { read_xy(); try_module_get(THIS_MODULE);//此函数为Linux 2.6内核增加的,不同于2.4内核,功能是计数器的值加1 return 0; } static void read_xy(void) { new_data();//获取键值函数 keypad_starttimer();//开启内核定时器,在固定周期时间内获取键盘新的变化 } 以下实现键盘键值获取函数read_xy() 主要是从KEY_CS(对应的读入地址,之前可以根据具体的硬件设备定义,比如#define kEY_CS(*(volatile unsigned short *)(0xf820000))此处应该根据具体的不同而不同! 将读入的键值存入buf[]缓存中,环形缓冲的写指针是head,读指针是tail,前面已经定义过了 ////////////////////////////////键盘事件的数据结构定义///////////////////////////////// typedef struct{ ulong status;//按键的值 ulong click;//是否有按键按下,1表示有,0表示没有 }KEY_EVENT static KEY_EVENT cur_data,buf[BUFSIZE];//BUFSIZE为宏定义,用于定义环形缓冲的大小 static void new_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.click=1; } else if(KEY_CS 0xff==0xff){ cur_data.click=0; cur_data.status=0; } if(

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档