|
这块是对于新手来讲比较麻烦,我当时也是比较费劲,我可以大致给楼主个流程,有兴趣的话自己再细看看代码,以后一起交流一下:
自己总结:
调用过程:keymatrix.cpp中的KernelIoControl()-> common\src\common\ioctl\ioctl.c中的OEMIoControl函数,在该函数中 通过rc = g_oalIoCtlTable.pfnHandler( code, pInBuffer, inSize, pOutBuffer, outSize, pOutSize);(这里要注意一下以前的4.2的时候都是用的case的形式,但是到6.0(或者是从5.0开始)就用的这种数结构里面一个一个对应的形式了)这句调用了OALIoCtlHalRequestSysIntr()这个函数调用的过程还是比较曲折的,呵呵,具体如下:g_oalIoCtlTable[],(这个数组是code和相应的函数对应的)具体在ioctl.tab.h中,而且这个数组的定义就很搞笑,利用了const OAL_IOCTL_HANDLER g_oalIoCtlTable[] = {
#include "ioctl_tab.h"
};这种形式,还是第一次见到,呵呵。在这个数组中,kerneliocontrol中的标志为 IOCTL_HAL_REQUEST_SYSINTR,对应的函数就是OALIoCtlHalRequestSysIntr。在 for (i = 0; g_oalIoCtlTable.pfnHandler != NULL; i++) {
if (g_oalIoCtlTable.code == code) break;
}中实现了和来自kerneliocontrol
函数中的code的配对,再利用 rc = g_oalIoCtlTable.pfnHandler(
code, pInBuffer, inSize, pOutBuffer, outSize, pOutSize
);实现了调用这个OALIoCtlHalRequestSysIntr()函数。在这个函数中又通过sysIntr = OALIntrRequestSysIntr(inpElems - 2, &pInpData[2], pInpData[1]);调用了C:\WINCE600\PLATFORM\COMMON\SRC\COMMON\INTR\BASE\map.c中的OALIntrRequestSysIntr这个函数,在这个函数中实现了逻辑中断和物理中断的对应。(具体如何实现的,本人还没太搞清楚。涉及到的两个数组是:g_oalSysIntr2Irq[sysIntr] = irq和g_oalIrq2SysIntr[irq] = sysIntr,这个地方有时间还得具体看下)
这一大段主要是实现了,物理和逻辑中断在数组中对应起来了,在这个基础上,在OEMInterruptHandler中才能根据nkcallchain()实现物理中断和逻辑中断的对应。 |
|