日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Keyboard驱动中button中断的处理机制

發(fā)布時間:2025/4/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Keyboard驱动中button中断的处理机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Keyboard驅(qū)動中button中斷的處理機制

?

********************************LoongEmbedded************************

作者:LoongEmbedded(kandi)

時間:2011.05.015

類別:WINCE驅(qū)動開發(fā)

********************************LoongEmbedded************************

?

備注:本博文基于Real6410開發(fā)板的BSP,這里按鍵的處理部分是作為keyboard驅(qū)動的一部分的。

?

1.? 硬件設(shè)計

1

?

2.? 文件架構(gòu)

2.1 KeypadMDD

?

MDD層的入口函數(shù)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.2KeypadPDD

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的入口函數(shù)是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.? 驅(qū)動工作流程

3.1 keyboard驅(qū)動的加載過程

系統(tǒng)啟動過程中,GWES根據(jù)注冊表HKEY_LOCAL_MACHINE/Hardware/DeviceMap/KEYBD 下的”Drivername”下去獲取Keyboard Driver的名字,如果沒找到,則使用默認的名字Keybddr.dll,此系統(tǒng)中keyboard驅(qū)動的PDD層的laymgr.reg內(nèi)容如下:

3

然后GWES會去驗證Keyboard Driver的導出接口是否存在,見圖4,接下來去調(diào)用導出函數(shù)KeybdDriverInitializeEx(),對Keyboard Driver進行初始

化。

3.2 smdk6410_keypad.dll的導出函數(shù)

4

上面這些函數(shù)的定義及實現(xiàn)是在MDD層的PUBLIC/COMMON/OAK/DRIVERS/KEYBD中實現(xiàn)的,那為什么Pdd層最終導出的smdk6410_keypad.dll可以編譯通過呢?是因為此dll包含了實現(xiàn)這些函數(shù)的lib

?

3.3MDD層和pdd層的交互

這里只是介紹本設(shè)計中按鍵驅(qū)動的部分,不是鍵盤驅(qū)動部分,系統(tǒng)會調(diào)用KeybdDriverInitializeEx函數(shù),此函數(shù)主要用于初始化每個PDD的內(nèi)容,調(diào)用圖2g_rgpfnPddEntries數(shù)組來調(diào)用PDD的入口函數(shù)。從理論上,Layout Manager可以管理多個PDD層,這些PDD層會組成一個鏈表,而全局變量g_rgpfnPddEntries就是好來表示所有PDD層的入口。其中按鍵處理的入口函數(shù)Matrix_Entry函數(shù),下面就來看看這個函數(shù)的工作流程,如下圖所示

?

5

Matrix_Entry函數(shù)體如下所示:

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

這個函數(shù)會創(chuàng)建按鍵處理的IST函數(shù)KBDISRThread,而KBDISRThread函數(shù)通過調(diào)用KeyMatrix::IsrThreadProc()來完成,KeyMatrix::IsrThreadProc函數(shù)體如下

8

下面就繼續(xù)分析KeyIOInitGetKeyValue函數(shù)

KeyIOInit函數(shù)

9

GetKeyValue函數(shù)

先看此函數(shù)體的第一部分

10

接著看GetKeyValue函數(shù)的后面部分

11

?

參考鏈接:

Keyboard驅(qū)動介紹

http://blog.csdn.net/guopeixin/archive/2009/11/10/4792370.aspx

?

?

總結(jié)

以上是生活随笔為你收集整理的Keyboard驱动中button中断的处理机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。