This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

GPIO cannot trigger interrupt on WINCE6

Other Parts Discussed in Thread: OMAP3530

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;
}