210板wince键盘驱动分析和移植

主要是bsp包里面的3个cpp文件的分析。

首先是pddlist.cpp文件

这个文件介绍了3种键盘的wince的api入口函数名前面加winapi),本文只关心第二种矩阵键盘。

然后在kbd.cpp文件中可以找到这个入口函数Matrix_Entry。

这里值得注意的是,本驱动是全键盘驱动,里面涉及到一些shift键和fn键的处理,即组合键的处理,这里先不分析,因为暂时没有用到。

分析这个函数可知,上层初始化键盘的过程如下

KeybdDriverInitializeAddresses

Keyboard->KeybdPowerOn

Keyboard->IsrThreadStart

这些函数的实现全部在keymatrix.cpp文件中

1:KeybdDriverInitializeAddresses函数建立基本的io地址映射,即把keyboard可能使用到的gpio和keyif设备地址映射成相应的虚拟地址。这里是驱动移植需要修改的地方,即BASE_REG_PA_GPIO和BASE_REG_PA_KEYIF和BASE_REG_PA_CMU_CLK换成实际板子的物理地址,其余代码不变。

这一步是后面的基础,后面使用到的基地址加偏移中的基地址就是这个映射后的虚拟地址。

2:Keyboard->KeybdPowerOn函数是对这个模块硬件初始化的过程,包括到系统clock模块打开keyif对应的clock开关,设置keyboard的时钟频率,使用的gpio的寄存器配置等。

这部分是keyboard所有硬件初始化的过程,这个全部改成6410平台寄存器的初始化,主要是改gpio和clock。

3:Keyboard->IsrThreadStart函数是注册keypad中断并创建键盘的守护线程。

这个函数首先用CreateThread函数创建了KBDISRThread线程,这个线程实际是KeyMatrix::IsrThreadProc()的封装。可以看到这个函数是对keypad中断服务程序的注册,然后是一个while(1)的主线程流程.这个线程首先是调用WaitForSingleObject等待键盘事件,如果等到了就调用KEYIF_Status_Clear和KScan_ProcIO清掉这次中断并读取键盘矩阵。然后后面调用v_pfnKeybdEvent把这次的键值传到上层。不要看这个函数很长,其实吧fb和shift和num lock等处理一去,实际没有多少。这里就需要参考矩阵数组了,由代码可以看出有4中键盘布局LAYOUT0~3,把其中自己的键盘布局替代其中一种,并定义MATRIX_LAYOUT=对应的那个layout。

然后就是创造了一个eint15的守护线程,等待eint15中断到来。Eint15IST这个线程的主要意义就是把gbBoardKeyDown置为ture。这个是为了区分按键是按下还是弹起做的,对于6410可以参照datasheet自己找一个。

这个就是wince键盘驱动的流程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值