主题 : 请问两个按键扫描驱动的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 7830
精华: 0
发帖: 45
金钱: 335 两
威望: 183 点
综合积分: 90 分
注册时间: 2009-07-30
最后登录: 2017-09-13
楼主  发表于: 2009-09-26 18:03

 请问两个按键扫描驱动的问题

第一个问题:
在按键驱动里面,我想不用中断来实现按键驱动,比如4*4键盘,总共有8根输入pin,如果这8个输入都接到普通的IO口上面,
那么我就想问下,在驱动里面就是要不断的去扫描,请问下要怎么写呢?
我有个想法就是定义一个定时器,然后定时去读8个IO口的状态,来判断是否有按键按下。
第二个问题就是:
按键的状态都是有应用程序主动来读取的吗?能不能驱动主动告诉应用层有按键按下了?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-09-27 10:33
第一个问题:
在按键驱动里面,我想不用中断来实现按键驱动,比如4*4键盘,总共有8根输入pin,如果这8个输入都接到普通的IO口上面,
那么我就想问下,在驱动里面就是要不断的去扫描,请问下要怎么写呢?
我有个想法就是定义一个定时器,然后定时去读8个IO口的状态,来判断是否有按键按下。

如果你不想用中断,定时的查询硬件是唯一的办法。但我想只要GPIO支持中断,你完全没必要那么做,毕竟中断比轮询效率高很多。

第二个问题就是:
按键的状态都是有应用程序主动来读取的吗?能不能驱动主动告诉应用层有按键按下了?

通常情况下,按键和触摸屏这样的事件都是由上层AP通过select()或poll()系统调用这样的Blocking IO的方式从驱动中主动查询出来的。除此之外,你也可以通过Singal + Asynchronous Notification的方式让驱动主动通知应用程序(详细信息参考Linux Device Driver 3rd edition的第6章 http://lwn.net/images/pdf/LDD3/ch06.pdf)。在我看来,这两种方式并没有本质区别。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."