none
不能响应EINT4_7中断,望各位帮帮忙 RRS feed

  • 问题

  • 写了一个检测EINT0、EINT1、EINT2、EINT4中断的程序。目前遇到的问题是中断0、1、2均能响应,唯独中断4不能响应。
    相关代码如下:

    1、IO设置
     s2440IOP->rGPFCON  = (s2440IOP->rGPFCON  & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPF0 == EINT0
     s2440IOP->rEXTINT0 = (s2440IOP->rEXTINT0 & ~(0x7<< 0)) | (0x3 << 0);        // Falling-edge triggered.
     ...
     s2440IOP->rGPFCON  = (s2440IOP->rGPFCON  & ~(0x3 << 0x8)) | (0x2 << 0x8); // GPF4 == EINT4
     s2440IOP->rEXTINT0 = (s2440IOP->rEXTINT0 & ~(0x7<< 16)) | (0x3 << 16);     // Falling-edge triggered.

    2、开中断
     s2440INT->rSRCPND  &= 0x1f;
     s2440INT->rINTPND  &= 0x1f;
     s2440INT->rINTMSK &= ~0x1f;
     s2440IOP->rEINTPEND|= 0x1f;
     s2440IOP->rEINTMASK &= ~0x1f;

    3、关联系统中断和物理中断
     KeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
     dwIRQ=0;  //EINT0===============================================
     if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(DWORD), 
                               &(dwSysIntr_EINT0), sizeof(DWORD), NULL))
        { ... }
     if(!InterruptInitialize(dwSysIntr_EINT0, KeyEvent, NULL, 0))
        { ... }
    ......
     dwIRQ=4;  //EINT4_7=============================================
     if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(DWORD), 
                               &(dwSysIntr_EINT0), sizeof(DWORD), NULL))
        { ... }
     if(!InterruptInitialize(dwSysIntr_EINT0, KeyEvent, NULL, 0))
        { ... }
    //创建中断响应线程================================================
    KeyThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UserKeyProcessThread,
                                     0, 0x00000004, &threadID);

    4、中断响应线程部分
      WaitForSingleObject(KeyEvent, INFINITE);
      //==========================================================
      RETAILMSG(1,(TEXT("s2440INT->rINTMSK   = %u\r\n"),s2440INT->rINTMSK));
      RETAILMSG(1,(TEXT("s2440IOP->rEINTMASK = %u\r\n"),s2440IOP->rEINTMASK));

      //EINT1 =====================================================
      if(s2440INT->rINTMSK & BIT_EINT1)
      {
       RETAILMSG(1,(TEXT("UserKeyProcessThread Processing! -K1\r\n")));
       InterruptDone(dwSysIntr_EINT1);   
      }
      //EINT4 =====================================================
      if((s2440INT->rINTMSK & (1<<4))&&(s2440IOP->rEINTMASK & (1<<4)))
      {
       RETAILMSG(1,(TEXT("UserKeyProcessThread Processing! -K2\r\n")));
       InterruptDone(dwSysIntr_EINT4);   
      }
      //EINT2=====================================================
      if(s2440INT->rINTMSK & BIT_EINT2)
      {
       RETAILMSG(1,(TEXT("UserKeyProcessThread Processing! -K3\r\n")));
       InterruptDone(dwSysIntr_EINT2);   
      }
    ......

    请各位帮忙看一下,多指导一下,谢谢了。

    2009年9月23日 9:17

全部回复

  • 问题解决了,是我的硬件中断号搞错了。
    EINT4的中断号是32。不是使用EINT4_7的中断号4。

    在S3C2440的DataSheet里对中断源SRCPND的描述只有32个中断源,EINT4——EINT7公用一个中断源EINT4_7。
    为什么在驱动的头文件中有EINT4=32,EINT5=33。。。这些的定义?
    这些定义是怎么来的呢?这些数字是怎么和硬件中断对应的呢?

    还望高手们指导一下,谢谢了。
    2009年9月25日 2:31