|
论坛元老
  
|
2楼
大 中
小 发表于 2008-6-5 08:04 只看该作者
3.3 矩阵键盘驱动重要函数设计 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( s3 ?6 O) }$ l Z$ R" _8 n2 _
www.520diannao.com; q- b6 z- s, e1 ~
流接口驱动程序的主要任务就是把外设的使用传递给应用程序。这是通过把设备表示为文件系统的一个特殊文件来实现的,每个流接口的驱动程序都必须实现一组标准的接口函数。由于矩阵键盘驱动采用了流驱动模式设计,故矩阵键盘驱动使用标准的流驱动接口函数,也称“矩阵键盘驱动的DLL接口”。DLL接口的具体描述如表1所列。
8 t) h3 C4 ?4 c# B; v. A
+ Y+ G! N* e o3 n+ {2 H$ \电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 表1 矩阵键盘流驱动程序的DLL接口 ! q: q" p, n+ {* _1 M4 c: S
我爱电脑技术论坛$ I/ X. U$ d, l, ^9 D2 R* J; A6 d
* B7 P* `$ A! s' o
3 F$ n0 d8 ^4 l3 F/ `* Gwww.520diannao.com 矩阵键盘作为一种输入设备与其他外围设备有很大的区别,应用层不能对其发布命令来操作它。因此一般流驱动接口函数中对设备进行操作的接口函数在矩阵键盘驱动中只是作了保留,并未有实质性的功能。接口函数中比较重要的是PWR_Init和PWR_DllEntry。下面简单介绍这两个函数: ( ~! j9 \1 g6 o0 f. T: W& e# ?
7 b5 ?) P {2 z: m8 f# ^% wwww.520diannao.com ① PWR_DllEntry。驱动程序的入口函数,当Windows CE.NET加载或断开DLL时调用,其中dwReason指明了调用的原因。
/ s( B* v& Y- _* n5 H0 c4 C2 L- {www.520diannao.com ② PWR_Init。接口函数PWR_Init完成矩阵键盘流驱动程序的初始化,首先完成矩阵键盘驱动涉及的CPU的I/O口寄存器和中断控制寄存器的地址映射工作。接下来设置中断服务线程优先级,最后创建中断服务线程和初始化I/O口。
; u: t; ] b* ^打造最好的电脑自学交流论坛
7 h! ^$ v' Z: t4 r% v/ d电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 3.4 矩阵键盘驱动中断处理设计 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站2 w, [; a* a, N* j
7 H9 n; c X! K/ y' O我爱电脑技术社区--打造最好的电脑技术自学交流平台 (1) 矩阵键盘驱动实现原理概述 www.520diannao.com" d9 G" y% x1 X# u3 p9 A
打造最好的电脑自学交流论坛' P( X W% D' F0 X
矩阵键盘驱动的主要作用就是实时监测外部按键中断,一旦发现外部有键按下就向内核发送键盘消息实现键盘输入功能。键盘驱动创建了中断服务线程和4个键盘中断事件,每行按键对应一个键盘中断事件。有键被按下时,中断服务例程得到对应的中断标识符并报告给系统任务调度进程,同时产生键盘中断事件,键盘中断服务线程响应键盘中断事件,开始扫描矩阵键盘。根据产生的中断事件类型不同,可以首先确定被按下键的行位置。由于键盘被按下后,该键对应的行和列被连通,因此根据判断各列对应的I/O口的电平,可以得到被按下键的列位置;得到按键的准确位置后,通过向操作系统发送键盘消息KEYBD_EVENT,实现一次键盘输入。循环扫描键盘,直到按键被弹起则发送KEYEVENTF_KEYUP事件。响应键盘中断输入的整个流程如图2所示。
/ @# b6 O/ i. b* |" Y我爱电脑技术社区--打造最好的电脑技术自学交流平台
" ?, a3 i, l: T/ ^: w% |我爱电脑技术社区--打造最好的电脑技术自学交流平台
$ n4 |; B8 E! d- a0 K% Z
; [. g" z: P: n" z9 D) x0 q我爱电脑技术论坛 图2 响应键盘中断输入流程图 我爱电脑技术社区--打造最好的电脑技术自学交流平台# S# `6 P9 l# A6 X
( d8 w; Z" a& H0 B3 s3 W6 Pwww.520diannao.com 实际上,矩阵键盘驱动的设计就是键盘中断处理的设计。下面就对矩阵键盘驱动中的中断处理设计作详细的介绍。
8 M0 L) `. O* Q' R/ N C# _打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站& W: Q' u3 s2 V$ R9 O
(2) 在OAL层加入中断源 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( ?' Y) i4 {2 F" B
' Y2 r" w: h5 ^# y% }6 l我爱电脑技术论坛 矩阵键盘采用4路I/O口中断,每路中断对应1个中断源。矩阵键盘驱动首先要在OAL层加入这些中断源。以其中一路中断为例: 我爱电脑技术论坛( B2 R0 U8 H3 ]2 h
#define SYSINTR_KEYONE(SYSINTR_FIRMWARE+0) 我爱电脑技术论坛5 M% B& {3 D6 h& j
我爱电脑技术论坛& s7 g L3 K/ ^3 @: Y. d: F2 D, N1 U
(3) 中断服务例程(ISR)设计
8 k$ m. k- B* k我爱电脑技术论坛" k0 d: O/ b4 `& i7 f+ H
本键盘驱动将GPIO_6、GPIO_7、GPIO_16、GPIO_17四个I/O口作为中断I/O口。有键被按下时将产生一个I/O中断,内核首先进入异常中断处理程序,由它屏蔽所有中断,再调用中断服务例程ISR得到该中断的逻辑中断标识。鉴于ISR的任务比较单一,ISR通常都要求越短、越快越好。矩阵键盘驱动的ISR设计如下:
9 }9 @: p' e+ f9 ]我爱电脑技术社区--打造最好的电脑技术自学交流平台电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 ~: h6 g8 V2 y2 N
if(v_pGPIOReg﹥GEDR_x & GPIO_6) {//中断触发
! Q) v) a2 L5 f5 Q+ {' h我爱电脑技术社区--打造最好的电脑技术自学交流平台 v_pGPIOReg﹥GEDR_x = GPIO_6;//清除中断 ! q! i' v7 k3 Z5 @- k. N" }3 ~
return SYSINTR_KEYONE;//返回中断标识}
2 p4 H- C) s# @( c- [我爱电脑技术社区--打造最好的电脑技术自学交流平台打造最好的电脑自学交流论坛; U2 @( o1 }$ q2 p% I8 ~, ?3 h8 o
其他三路中断的ISR设计与此类似。 www.520diannao.com& f8 T( U, b+ D/ [0 V" \. E
打造最好的电脑自学交流论坛 Z* |. `9 e" n+ N/ a8 ], Q& z
(4) 中断服务线程(IST)设计
9 B, b' Y$ B5 |www.520diannao.com
) _6 V! L* x- t. V( o3 i我爱电脑技术社区--打造最好的电脑技术自学交流平台 中断服务例程以键盘中断的逻辑中断标识符形式返回给系统任务调度进程,中断服务线程则在矩阵键盘驱动中负责具体中断处理。因为中断服务例程较小,并且只做很少的处理工作,中断服务线程就必须完成大多数中断处理工作,功能主要包括响应中断、扫描按键位置、发送键盘消息等。 打造最好的电脑自学交流论坛+ K( H# s/ M1 `0 w- n$ b' f" j3 u0 B
矩阵键盘驱动的IST设计如下:矩阵键盘驱动设计了4个中断事件HANDLE hKEYEvents[4],分别对应矩阵键盘4行产生的中断。在矩阵键盘驱动的IST中,调用CreateEvent函数创建4个事件对象,接着调用系统函数InterruptInitialize完成中断和事件的关联并使能中断。完成这些初始化工作后,就可以调用WaitForMultipleObjects (hKEYEvents)函数进入键盘事件的等待队列中。当有事件被捕获后,根据不同的事件类型进入不同的键盘扫描处理程序(以其中一路中断为例):
4 z/ [1 Z7 T, m; }电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 我爱电脑技术论坛) `3 S& {8 ]$ G' Y3 K3 O) v$ ]
* w, m- ~6 B' L4 ?5 iwww.520diannao.comswitch (dwEventWAIT_OBJECT_0){//事件类型 case 0://第1行键盘有键按下 v_pGPIOReg﹥GPDR_x &= ~ (GPIO_13);//设为输入 v_pGPIOReg﹥GPDR_x |= (GPIO_6);//中断I/O输出 v_pGPIOReg﹥GPCR_x |= (GPIO_6);//输出低电平 while(!(v_pGPIOReg﹥GPLR_x & GPIO_13)) {//扫描矩阵键盘,判断按键列位置 if(num==1)//第1次连发延时400 ms Sleep(400); else Sleep(100);//按键延时去抖 if(!(v_pGPIOReg﹥GPLR_x & GPIO_13)){//列位置 keybd_event(0 ,0x71, 0, 0);//发键盘消息 num++;//连发计数 } else{ if((v_pGPIOReg->GPLR_x & GPIO_13)&&num>0){ num=0;//按键弹起 keybd_event(0,0x71, KEYEVENTF_KEYUP, 0);} } }
( n' U: X7 i; n8 q$ awww.520diannao.com www.520diannao.com% s# }$ Z% m9 W& G
打造最好的电脑自学交流论坛# Y7 m0 w$ ]+ s! `2 S
) D" ]# q; x! V& a7 |打造最好的电脑自学交流论坛 中断处理完成后恢复I/O口的初始电平,调用InterruptDone函数恢复中断,使其能响应下一次同样的中断。
1 I0 _5 p2 y0 I; n# B5 q. R我爱电脑技术论坛我爱电脑技术论坛1 E: a5 }* l; D; Y x% {2 U* r
编者注:驱动程序源码见本刊网站 www.mesnet.com.cn。 我爱电脑技术社区--打造最好的电脑技术自学交流平台+ j. F) j1 Z) B6 e7 _3 M
4 T3 v [4 ?0 w# h4 I我爱电脑技术论坛 结语
% O4 B6 V: R o5 pwww.520diannao.comwww.520diannao.com/ G) J4 `8 D, d
随着嵌入式设备应用的日益广泛,特别是微软的嵌入式操作系统Windows CE.NET的普及,Windows CE.NET下矩阵键盘设计得到了越来越多开发者的重视。本文所讨论的Windows CE.NET下矩阵键盘设计方案简单、高效、实用。特别适合于I/O口资源充足的嵌入式PDA上,现已成功应用于某卫星定位系统的键盘设计上。
|