12.1.4 按键设备驱动中断、定时器处理程序
在键被按下后,将发生中断,在中断处理程序中,应该关闭中断进入查询模式,延迟20ms以实现去抖动,如代码清单12.8所示,这个中断处理过程只包含顶半部,无底半部。
代码清单12.8 按键设备驱动的中断处理程序
1 static void s3c2410_eint_key(int irq, void *dev_id, struct pt_regs *reg)
2 {
3 int key = dev_id;
4 disable_irq(key_info_tab[key].irq_no); //关中断,转入查询模式
5
6 keydev.keyStatus[key] = KEYSTATUS_DOWNX;//状态为按下
7 key_timer[key].expires == jiffies + KEY_TIMER_DELAY1;//延迟
8 add_timer(&key_timer[key]); //启动定时器
9 }
|
在定时器处理程序中,查询按键是否仍然被按下,如果是被按下的状态,则将该按键记录入缓冲区。同时启动新的定时器延迟,延迟一个相对于去抖更长的时间(如100ms),每次定时器到期后,查询按键是否仍然处于按下状态,如果是,则重新启用新的100ms延迟;若查询到已经没有按下,则认定键已抬起,这个时候应该开启对应按键的中断,等待新的按键。每次记录新的键值时,应唤醒等待队列。定时器处理流程如图12.3所示,代码清单如12.9所示。
代码清单12.9 按键设备驱动的定时器处理函数
1 static void key_timer_handler(unsigned long data)
2 {
3 int key = data;
4 if (ISKEY_DOWN(key))
5 {
6 if (keydev.keyStatus[key] == KEYSTATUS_DOWNX)
7 //从中断进入
8 {
9 keydev.keyStatus[key] = KEYSTATUS_DOWN;
10 key_timer[key].expires == jiffies + KEY_TIMER_DELAY; //延迟
11 keyEvent(); //记录键值,唤醒等待队列
12 add_timer(&key_timer[key]);
13 }
14 else
15 {
16 key_timer[key].expires == jiffies + KEY_TIMER_DELAY; //延迟
17 add_timer(&key_timer[key]);
18 }
19 }
20 else //键已抬起
21 {
22 keydev.keyStatus[key] = KEYSTATUS_UP;
23 enable_irq(key_info_tab[key].irq_no);
24 }
25 }
|
![]() |
| 图12.3 定时器处理函数流程 |
| 回书目 上一节 下一节 |
|
||||
| · 国际文档格式标准开战 · 华为员工自杀频频拷问.. · CISSP认证成长之路 · 珊瑚虫QQ作者侵权案开庭 · 微软出价446亿美元收购.. · Windows Server 2008专.. · 隐私保护技术探讨 · 贝恩资本携手华为22亿.. |
· 802.11n:下一代的无线.. · 体验Visual Studio 200.. · 运营商封堵非法ADSL共享 · ADSL应用面面俱到 · 龙芯要做中国的“奔腾” · 华为七千人主动辞职规.. · 华为路由器配置 · 2007盘点专题:有多少.. |
|||
|
||||
| · VPN技术 · SQL Server 2008/2005.. · SOA 面向服务架构 · 子网掩码教程 · SQL Server 2008/2005.. · 中间件应用技术专题 · 深入了解PGP加密技术 · MySQL数据库备份 |
· 病毒查杀专题 · VPN技术 · Solaris 10 配置管理 · Linux 基础 · SSL VPN详细知识 · Linux防火墙 · Linux 集群技术专题 · 打造安全服务器 |
|||
|
||||
| · VPN技术 · SQL Server 2008/2005.. · 中间件应用技术专题 · SQL Server 2008/2005.. · SOA 面向服务架构 · 子网掩码教程 · MySQL数据库备份 · 身份认证技术 |
· 病毒查杀专题 · 清除流氓软件——51CTO.. · SSL VPN详细知识 · Sniffer安全技术从入门.. · Linux 集群技术专题 · VPN技术 · Linux 基础 · SOA 面向服务架构 |
|||