准备实现EINT中断驱动,所以参看了SMDK2440中Userkey驱动。
在Userkey.cpp文件中,有如下函数
BOOL InitInterruptThread()
{
...
KeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!KeyEvent)
return FALSE;
bSuccess = InterruptInitialize(SYSINTR_USER_KEY, KeyEvent, NULL, 0);
...
}
请问InterruptInitialize函数中第一个参数SYSINTR_USER_KEY是怎么和硬件中断联系起来的?
是一个宏定义,在intoal.h中的吧,具体的文件名忘了,代码很简单,一看就明白
1.HC->hDMAREvent = CreateEvent(NULL, FALSE, FALSE, NULL);
定义一个事件
2.获得逻辑中断号 KernelIoControl( IOCTL_HAL_REQUEST_SYSINTR, &dwDMAIrq, sizeof(DWORD), &pHC->dwDMASysIntr, sizeof(DWORD), &dwRetSize )
3.将中断与事件绑定InterruptInitialize(pHC->dwDMASysIntr,pHC->hDMAISTEvent,0,0)
驱动中中断就这三个步骤
SYSINTR_USER_KEY是逻辑中断号,是在PLATFORM\SMDK2440\INC\oalintr.h中定义的,在PLATFORM\SMDK2440\KERNEL\HAL\ARM\armint.c中与相应硬件中断关联。
关于中断的问题 可以参考下这篇文章
http://blog.chinaunix.net/u2/83682/showart_1929359.html
里面分析的很不错.