1:驱动怎么访问寄存器.,其中IOP_BASE等于0xB1600000 ,为什么是这个值,正在查 ,同样的方法访问中断寄存器#define INT_BASE 0xB0A00000,
v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
2:驱动怎么使用线程 ,创建这个线程后, EINTKey_IntrThread就自动运行了
gEINTIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) EINTKey_IntrThread, 0, 0, &IDThread);
3:事件和中断 绑定, , 事件有2种触发,一种通过中断自动触发,一种是通过set手动触发,
#define IRQ_EINT4 32
//通过硬件中断号申请系统中断:g_EINTIrq是要申请的中断原始偏移,这里值为IRQ_EINT4 ,g_EINTSysIntr为申请的系统中断
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_EINTIrq, sizeof(UINT32), &g_EINTSysIntr, sizeof(UINT32), NULL))
// 创建外部中断中断事件
gWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 初始化外部按键中断: 注册中断事件, 允许外部中断
if (!(InterruptInitialize(g_EINTSysIntr, gWaitEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("ERROR: EINTKey: InterruptInitialize failed.\r\n")));
CloseHandle(gWaitEvent);
return 0;
}
//怎么判断是否按键按下:在while循环中等待 事件发生了,wait函数就会返回,继续执行
while (1)
{
ret = WaitForSingleObject(gWaitEvent, INFINITE);
if ((ret == WAIT_OBJECT_0) && (g_bKillIST == FALSE))
//事件发生了,为了通知另外一个wait函数执行,就要调用调用setEvent函数
if (Key_IsPushed()) /* 外部中断按键确实已按下 */
{
SetEvent(gReadKeyEvent[0]); /* 通知读函数, 外部中断按键按键按下 */
RETAILMSG(1, (TEXT("::: The Key1 Pushed. \r\n")));
}
和中断绑定的事件发生后,要重新释放
InterruptDone(g_EINTSysIntr);