首先是映射物理地址了。应该都知道。
常见的是virtualalloc和virtualcopy,用完后需要virtualfree.
也可以使用:
PHYSICAL_ADDRESS potadress = {0x56000000 ,0};//根据需要自己定义自己的地址
(volatile IOPreg*)MmMapIoSpace(potadress, sizeof(IOPreg),FALSE);
释放使用:MmUnmapIoSpace((PVOID)gpio_base,sizeof(IOPreg));
然后操作是:配置具体io实现中断,然后通过开发板提供bsp的XXXIntr.h。找到对应的中断号
比如:
UINT g_CAN_EINT = IRQ_EINT11; // Determined by 2440 board layout.
UINT g_CAN_SYSTR = SYSINTR_UNDEFINED;
然后申请中断:
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CAN_EINT, sizeof(UINT32), &g_CAN_SYSTR, sizeof(UINT32), NULL);//是驱动/应用程序和kernel通讯的一个接口函数,具体的调用意义是看该函数的IOCTRL是什么以及kernel中对应的处理函数(ioctrl table);当然需要判断是否执行成功。
然后创建event,将该事件与中断号绑定
g_CAN_LISTEN_EVENT = CreateEvent(NULL, FALSE, FALSE, NULL);
(InterruptInitialize(g_CAN_SYSTR, g_CAN_LISTEN_EVENT, 0, 0))//也需要判断绑定成功与否。
然后就可以创建中断线程CreateThread
;;;WaitForSingleObject(g_CAN_LISTEN_EVENT, INFINITE) == WAIT_OBJECT_0
每次中断响应完后需要使用 InterruptDone(g_CAN_SYSTR);
释放的时候就需要做一下几步:
CloseHandle 中断线程(可以在创建线程后就执行)
CloseHandle event
InterruptDisable g_CAN_SYSTR
KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&g_CAN_SYSTR, sizeof(UINT32),NULL,0, NULL);//释放。
呵呵这是我的一次尝试,执行成功,估计还有不足,请大家指出!