Keyboard驱动中button中断的处理机制
Keyboard驅動中button中斷的處理機制
?
********************************LoongEmbedded************************
作者:LoongEmbedded(kandi)
時間:2011.05.015
類別:WINCE驅動開發
********************************LoongEmbedded************************
?
備注:本博文基于Real6410開發板的BSP,這里按鍵的處理部分是作為keyboard驅動的一部分的。
?
1.? 硬件設計
圖1
?
2.? 文件架構
2.1 Keypad的MDD層
?
MDD層的入口函數DllMain()
?
⑴PUBLIC/COMMON/OAK/DRIVERS/KEYBD/LAYMGR
生成:Layout_Manager.lib
源文件:
LayMgr.cpp /
??? Zones.cpp? /
??? profiler.cpp? /
?
⑵PUBLIC/COMMON/OAK/DRIVERS/KEYBD/NOP/PDD
生成:Nop_KbdCommon.lib
源文件:NopKbd.cpp
?
⑶PUBLIC/COMMON/OAK/DRIVERS/KEYBD/DEVICELAYOUTS/REMAP/NUMPADRMP
生成:NumPadRmp.lib
源文件:NumPadRmp.cpp
?
2.2Keypad的PDD層
PDD層的入口點
圖2
?
⑴KEYBD/KeyUserDef
生成KeyPadCommon.lib
源文件:keymatrix.cpp /
??? KBD.cpp /
Power.s /
?
⑵KEYBD/Matrix_0409
生成S3C6410_Layout.lib
源文件s3c6410_layout.cpp
?
⑶KEYBD/PddList
生成PddList.lib
源文件:PddList.cpp
?
⑷KEYBD/kbds3c6410
生成smdk6410_keypad.dll,此dll的入口函數是DllMain(),此dll需要連接一些lib,如下:
SOURCELIBS=/
??? $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/S3C6410_Layout.lib /
??? $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/KeyPadcommon.lib /
??? $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/PddList.lib /
??? $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/LayoutManager.lib /
??? $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/Nop_KbdCommon.lib /
??? $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/NumPadRmp.lib
?
?
3.? 驅動工作流程
3.1 keyboard驅動的加載過程
系統啟動過程中,GWES根據注冊表HKEY_LOCAL_MACHINE/Hardware/DeviceMap/KEYBD 下的”Drivername”下去獲取Keyboard Driver的名字,如果沒找到,則使用默認的名字Keybddr.dll,此系統中keyboard驅動的PDD層的laymgr.reg內容如下:
圖3
然后GWES會去驗證Keyboard Driver的導出接口是否存在,見圖4,接下來去調用導出函數KeybdDriverInitializeEx(),對Keyboard Driver進行初始
化。
3.2 smdk6410_keypad.dll的導出函數
圖4
上面這些函數的定義及實現是在MDD層的PUBLIC/COMMON/OAK/DRIVERS/KEYBD中實現的,那為什么Pdd層最終導出的smdk6410_keypad.dll可以編譯通過呢?是因為此dll包含了實現這些函數的lib。
?
3.3MDD層和pdd層的交互
這里只是介紹本設計中按鍵驅動的部分,不是鍵盤驅動部分,系統會調用KeybdDriverInitializeEx函數,此函數主要用于初始化每個PDD的內容,調用圖2的g_rgpfnPddEntries數組來調用PDD的入口函數。從理論上,Layout Manager可以管理多個PDD層,這些PDD層會組成一個鏈表,而全局變量g_rgpfnPddEntries就是好來表示所有PDD層的入口。其中按鍵處理的入口函數Matrix_Entry函數,下面就來看看這個函數的工作流程,如下圖所示
?
圖5
Matrix_Entry函數體如下所示:
圖6
3.3.1? KeybdDriverInitializeAddresses
圖7
其中const DWORD Key_IRQ[10] = { IRQ_EINT0,IRQ_EINT1,IRQ_EINT2,IRQ_EINT5,IRQ_EINT9,IRQ_EINT10,IRQ_EINT11,IRQ_EINT16,IRQ_EINT17,IRQ_EINT20};
?
3.3.2? IsrThreadStart
這個函數會創建按鍵處理的IST函數KBDISRThread,而KBDISRThread函數通過調用KeyMatrix::IsrThreadProc()來完成,KeyMatrix::IsrThreadProc函數體如下
圖8
下面就繼續分析KeyIOInit和GetKeyValue函數
⑴KeyIOInit函數
圖9
⑵GetKeyValue函數
先看此函數體的第一部分
圖10
接著看GetKeyValue函數的后面部分
圖11
?
參考鏈接:
Keyboard驅動介紹
http://blog.csdn.net/guopeixin/archive/2009/11/10/4792370.aspx
?
?
總結
以上是生活随笔為你收集整理的Keyboard驱动中button中断的处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开始Windows Embedded C
- 下一篇: WINCE6.0+S3C6410串口驱动