主要是bsp包里面的3个cpp文件的分析。
首先是pddlist.cpp文件
这个文件介绍了3种键盘的wince的api入口函数名前面加winapi),本文只关心第二种矩阵键盘。
然后在kbd.cpp文件中可以找到这个入口函数Matrix_Entry。
这里值得注意的是,本驱动是全键盘驱动,里面涉及到一些shift键和fn键的处理,即组合键的处理,这里先不分析,因为暂时没有用到。
分析这个函数可知,上层初始化键盘的过程如下
KeybdDriverInitializeAddresses→
这些函数的实现全部在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键盘驱动的流程。