基于Windows CE的7×3手機鍵盤驅動實現
對于7×3的矩陣鍵盤,下圖為物理按鍵和掃描碼的對應關系(掃描碼為16進制):
| 5列(KP_MKOUT4) | 6列(KP_MKOUT5) | 7列(KP_MKOUT6) |
1行(KP_MKIN0) | 0x04 | 0x05 | 0x06 |
2行(KP_MKIN1) | 0x14 | 0x15 | 0x16 |
3行(KP_MKIN2) | 0x24 | 0x25 | 0x26 |
4行(KP_MKIN3) | 0x34 | 0x35 | 0x36 |
5行(KP_MKIN4) | 0x44 | 0x45 | 0x46 |
6行(KP_MKIN5) | 0x54 | 0x55 | 0x56 |
7行(KP_MKIN6) | 0x64 | 0x65 | 0x66 |
7. ScanCodeToVKeyEx函數
此函數提供掃描碼到虛擬鍵的映射操作,主要調用MapVkeyFromSCode函數完成從掃描碼到虛擬按鍵的映射。在 MapVkeyFromSCode函數的實現過程中,首先需要按照自己的要求和物理鍵盤的布局確定SC2VKMap[i][j]二維數組,其中數組的第一列為物理鍵盤上每個按鍵所對應的掃描碼,第二列為第一列掃描碼所對應的虛擬按鍵,開發者可以根據實際需要確定掃描碼和虛擬按鍵的對應關系,通過這個二維數組的設定,就可以在程序運行的過程中,當檢測到有按鍵被按下時,通過KeypdPdd_GetEventEx函數產生的掃描碼,然后通過查表的方式得到掃描碼所對應的虛擬按鍵值。下表為掃描碼與虛擬碼的對應關系表:
| 5列 | 6列 | 7列 | ||||||
掃描碼 | 虛擬碼 | 物理按鍵 | 掃描碼 | 虛擬碼 | 物理按鍵 | 掃描碼 | 虛擬碼 | 物理按鍵 | |
1行 | 0x04 | VK_A | 預留 | 0x05 | VK_B | 上 | 0x06 | VK_C | 預留 |
2行 | 0x14 | VK_D | 左 | 0x15 | VK_E | 菜單鍵 | 0x16 | VK_F | 右 |
3行 | 0x24 | VK_G | OK鍵 | 0x25 | VK_H | 下 | 0x26 | VK_I | Cancel鍵 |
4行 | 0x34 | VK_1 | 1 | 0x35 | VK_2 | 2 | 0x36 | VK_3 | 3 |
5行 | 0x44 | VK_4 | 4 | 0x45 | VK_5 | 5 | 0x46 | VK_6 | 6 |
6行 | 0x54 | VK_7 | 7 | 0x55 | VK_8 | 8 | 0x56 | VK_9 | 9 |
7行 | 0x64 | VK_J | * | 0x65 | VK_0 | 0 | 0x66 | VK_K | # |
其中VK_A、VK_B、VK_C、VK_D、VK_E、VK_F、VK_G、VK_H、VK_I、VK_J、VK_K、VK_1、VK_2、 VK_3、VK_4、VK_5、VK_6、VK_7、VK_8、VK_9、VK_0對應的輸出為A、B、C、D 、E、F、G、H、I、J、K、1、2、3、4、5、6、7、8、9、0,但實際顯示的時候可以按照具體的要求進行定義,完成物理按鍵對應的輸出值,每個按鍵所實現的功能是由上層應用程序定義的,這里再不詳細敘述。
8. KeyPadGpioConfigure函數
此函數的功能是完成矩陣鍵盤所對應GPIO口的配置,在具體函數的實現和開發中必須按照物理鍵盤的布局及芯片引腳占用情況進行相應的更改的。下面為KeyPadGpioConfigure函數的實現:
XLLP_UINT32_T GpioDirOutList[]={3,107,108,96, }; //矩陣鍵盤3個輸出端口引腳號
XLLP_UINT32_T GpioDirInList[]={7,100,101,102,97,39,90,91}; //矩陣鍵盤7個輸出端口引腳號XLLP_UINT32_T GpioAltFnPinList[]={10,39,90,91,96,97,100,101,102,107,108};//矩陣鍵盤GPIO引腳 XLLP_UINT32_T GpioAltFnValList[]={10,1,1,1,3,1,1,1,1,2,2}; // GPIO對應的附加功能選擇
if(v_pGPIOReg != 0) //判斷鍵盤GPIO寄存器是否已經被配置
{
XllpGpioSetDirectionIn(v_pGPIOReg, GpioDirInList); //設置GPIO輸入端口方向
XllpGpioSetDirectionOut(v_pGPIOReg, GpioDirOutList); //設置GPIO輸出端口方向
XllpGpioSetOutput0(v_pGPIOReg, GpioDirOutList); //設置GPIO輸出端口
XllpGpioSetAlternateFn(v_pGPIOReg, GpioAltFnPinList, GpioAltFnValList); //設置GPIO附加功能
}
if(v_pKeyPadRegs != 0) //判斷鍵盤寄存器是否已經被配置
{
v_pKeyPadRegs->kpControlReg=(MATRIX_KP_NUMBER_OF_ROWS| MATRIX_KP_NUMBER_OF_COLUMNS | MAT_SCAN_LINE4 | MAT_SCAN_LINE5 | MAT_SCAN_LINE6 | AUTO_SCAN_ON_ACTIVITY | MATRIX_INTR_ENABLE | MATRIX_KP_ENABLE ) ; //設置矩陣鍵盤控制寄存器初值
retval = XLLP_TRUE;
}
return(retval);
9. 結束語
本文作者創新點:完整地分析了Windows CE操作系統中7×3矩陣鍵盤的基本原理及其驅動程序模型,此設計是按照目前通用的手機鍵盤開發。并從實現方法的角度深入剖析了Windows CE中矩陣鍵盤掃描碼的獲取流程、將掃描碼映射到虛擬碼的方法,最后給出了矩陣鍵盤所對應GPIO口的配置方法,對于類似系統的矩陣鍵盤驅動開發具有重要的參考價值。
參考文獻
[1] 阿蘭特嵌入式實驗室.PXA27x處理器開發手冊,2005:825-826.
[2] 楊翠娥,王麗敏,王景敏.實時系統VxWorks下設備驅動程序的編寫[J].微計算機信息2004年第一期
[3] 傅曦.Windows CE 嵌入式開發入門——基于Xscale架構[M] 北京.人民郵電出版社,2006 :227-230.
[4] 微軟.Platform Builder幫助文檔.
[5] Windows CE設備驅動程序開發指南:15-16.
評論