Hi, I am struggling for this subject for several days...
My board is DevKit8000 (OMAP3530), I am tesing GPIO26 and GPIO128
My initialization code is as follows. Can anyone help me out? Thanks a lot!!
(From the debug output, I am sure that OEMInterruptEnable is called, but OEMInterruptHandler is never called...)
DWORD URK_Init(DWORD dwontext)
{
RETAILMSG(1,(TEXT("USERKEY: URK_Init Starting....\r\n")));
s_hGPIO = GPIOOpen();
if (s_hGPIO == NULL)
{
RETAILMSG(1,(TEXT("URK_Init, GPIOOpen failed\r\n")));
return FALSE;
}
DWORD i,SysIRQ;
{
//CONTROL_PADCONF for GPIO mode
//if(!SetPadMode(C_CONTROL_PADCONF_REG[i],C_GPIOMode,C_CONTROL_PADCONF_POS[i]))
// return FALSE;
PHYSICAL_ADDRESS pa;
OMAP_SYSC_PADCONFS_REGS *pPADCONFS_REGS;
pa.QuadPart = OMAP_SYSC_PADCONFS_REGS_PA;
pPADCONFS_REGS = (OMAP_SYSC_PADCONFS_REGS *) MmMapIoSpace(pa, sizeof(OMAP_SYSC_PADCONFS_REGS), FALSE);
RETAILMSG(1, (TEXT("URK_Init::MmMapIoSpace(virt(0x%x)\r\n"), pPADCONFS_REGS));
if (pPADCONFS_REGS == NULL)
{
return FALSE;
}
#if (C_GPIO_INT==GPIO_26)
RETAILMSG(1, (TEXT("Before SetPAD, CONTROL_PADCONF_ETK_D12=0x%08X\r\n"),pPADCONFS_REGS->CONTROL_PADCONF_ETK_D12));
MODIFY_PADCONF_REG_LOWER(CONTROL_PADCONF_ETK_D12,MUX_MODE_4);
RETAILMSG(1, (TEXT("After SetPAD, CONTROL_PADCONF_ETK_D12=0x%08X\r\n"),pPADCONFS_REGS->CONTROL_PADCONF_ETK_D12));
#else//GPIO_128
RETAILMSG(1, (TEXT("Before SetPAD, CONTROL_PADCONF_MMC1_DAT6=0x%08X\r\n"),pPADCONFS_REGS->CONTROL_PADCONF_MMC1_DAT6));
MODIFY_PADCONF_REG_LOWER(CONTROL_PADCONF_MMC1_DAT6,MUX_MODE_4);
RETAILMSG(1, (TEXT("After SetPAD, CONTROL_PADCONF_MMC1_DAT6=0x%08X\r\n"),pPADCONFS_REGS->CONTROL_PADCONF_MMC1_DAT6));
#endif
MmUnmapIoSpace((PVOID)pPADCONFS_REGS, sizeof(OMAP_SYSC_PADCONFS_REGS));
DWORD dwGpioMode = GPIOGetMode(s_hGPIO,C_GPIO_INT);
RETAILMSG(1,(TEXT("Before GPIOSetMode,GPIOMode=0x%X\r\n"),dwGpioMode));
//Config GPIO to interrupt mode
GPIOSetMode(s_hGPIO,C_GPIO_INT,GPIO_DIR_INPUT | GPIO_INT_HIGH_LOW | GPIO_DEBOUNCE_ENABLE);
dwGpioMode = GPIOGetMode(s_hGPIO,C_GPIO_INT);
RETAILMSG(1,(TEXT("After GPIOSetMode,GPIOMode=0x%X\r\n"),dwGpioMode));
// Set debounce time on GPIO
IOCTL_GPIO_SET_DEBOUNCE_TIME_IN debounce;
debounce.gpioId = C_GPIO_INT;
debounce.debounceTime = 10;
GPIOIoControl(s_hGPIO, IOCTL_GPIO_SET_DEBOUNCE_TIME, (UCHAR*)&debounce, sizeof(debounce), NULL, 0, NULL, NULL);
//Bind IntrEvent to sysIntr
SysIRQ = GPIOGetIrq(s_hGPIO, C_GPIO_INT);
RETAILMSG(1, (TEXT("URK_Init: SysIRQ for GPIO_%d is %d.\r\n"),C_GPIO_INT,SysIRQ));
//Create event
s_IntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if(!s_IntrEvent)
{
RETAILMSG(1,(TEXT("URK_Init, CreateEvent failed\r\n")));
return FALSE;
}
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &SysIRQ, sizeof(DWORD), &s_sysIntr, sizeof(DWORD), NULL))
{
RETAILMSG(1, (TEXT("URK_Init: KernelIoControl: Failed to request sysintr value for interrupt.\r\n")));
return FALSE;
}
RETAILMSG(1, (TEXT("URK_Init: sysINTR for GPIO_%d is 0x%X.\r\n"),C_GPIO_INT,s_sysIntr));
if (!(InterruptInitialize(s_sysIntr, s_IntrEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("URK_Init: InterruptInitialize: Interrupt initialize failed.\r\n")));
return FALSE;
}
}
//Create IST
DWORD IDThread;
s_hUserKeyIST = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) UserKeyIST, NULL, 0, &IDThread);
if (s_hUserKeyIST == NULL) {
RETAILMSG(1,(TEXT("URK_Init,Createthread failed\r\n")));
return FALSE;
}
RETAILMSG(1,(TEXT("USERKEY: URK_Init successfully\r\n")));
return TRUE;
}