积极答复者
请教,按键驱动

问题
-
这是我在PB帮助keyboard driver里看到的一段话。
When an interrupt is signaled
{
the keyboard driver is responsible for
converting the hardware scan code into a virtual-key code
passing both to GWES through either the callback passed to PFN_KEYBD_DRIVER_INITIALIZE_EX
or the keybd_event API
}这里的both指的是什么? the callback passed to PFN_KEYBD_DRIVER_INITIALIZE_EX 怎么翻译呢?
我的开发板带的BSP里的按键驱动是5个GPIO(映射成上下左右确定键),它用了流式驱动的方式,用了keybd_event 这个函数实现。我想知道keybd_event 这个函数是属于谁的?我这个驱动是属于单体,还是分层的PDD?
我也尝试着看了
1,C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD
2,C:\WINCE500\PLATFORM\SMDK2410\SRC\DRIVERS\KEYBD
下的代码。有点犯晕。
我的总结:1下面是一个完整的分层驱动的参考(PS2_8042),包括了mdd,pdd;
2下面是pdd,编译时需要结合1的mdd部分。证据:KeybdIstLoop(&keybdIst),这个函数是在1的IST\keybdist.cpp实现的。
KeybdIstLoop函数里的代码,不是很明了。它的方式属于the callback passed to PFN_KEYBD_DRIVER_INITIALIZE_EX ,还是 the keybd_event API呢?
答案
全部回复
-
谢谢何老师的解答。
通过看BSP里的代码,仿照它写程序问题不大。它的逻辑比较简单,思路也清晰。
我看文档里的代码是因为我想理解键盘驱动,日后也要写这样复杂一些的驱动,看的过程中自然会和我的BSP的代码比较,产生了一些疑惑。主要是刚开始接触驱动,尽管反复看了何老师的书,总是要在实践中体会、印证才比较深刻。
书上讲的DDI MDD DDSI PDD,如果不看代码,在具体的驱动中什么是 DDI ,什么是 MDD 呢?
我BSP里的流式驱动和文档里的分层驱动,按书上讲应该都要和DDI扯上关系吧。但到底如何呢?
MDD的特性之一:对于操作系统实现DDI函数,供操作系统与驱动程序交互。
那么在文档里的键盘驱动哪几个函数是DDI呢?
-
代码最到KeybdIstLoop,
for (UINT iEvent = 0; iEvent < cEvents; ++iEvent) {
(*pKeybdIst->pfnKeybdEvent)(pKeybdIst->uiPddId,
rguiScanCode[iEvent], rgfKeyUp[iEvent]);pKeybdIst->pfnKeybdEvent可以最到typedef void (*PFN_KEYBD_EVENT)(UINT uiPddId, UINT32 uiScanCode,
BOOL fKeyDown);它是调用了下面这个函数。
void
KeybdEventCallback(
UINT uiPddId,
UINT32 uiScanCode,
BOOL fKeyUp
)但是如何扯上关系的,我还不太明白。
还会发现和KeybdEventThreadProc这个函数有关系,
这个函数里执行了ScanCodeToVKey
接着执行了SendRemappedEvent这个函数。
跳到SendRemappedEvent里发现了
keybd_event((BYTE) uiCurrVk, (BYTE) uiCurrSc, dwFlags, 0);
由此至少知道了,这个分层驱动也用到了keybd_event。
我的简单流式接口的按键驱动也用到它,同时注册表也加入了C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD下的两个*.reg文件。
这是怎么回事,我还要继续看。