irene
驱动牛犊
驱动牛犊
  • 注册日期2004-11-03
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1055回复:6

PXA271 GPIOx的中断处理

楼主#
更多 发布于:2004-11-23 13:47
请教关于 PXA271 GPIOx 的中断处理问题:
我用GPIO控制了4个中断,分别是GPIO40-Ethernet, GPIO41-PCMCIA, GPIO42-USB Client 和 GPIO43-AC97Touch,共用GPIO2的Device ID。

调试中感觉代码没有进到 GPIOXX_2ISR 中(中断管脚不能释放,中断里控制的指示灯没有亮起来),现在以AC97 TouchPad 为例,copy相关代码贴在下面,请帮忙看一下问题出在哪里,多谢!


/*******************************************************************************************/
/*************************  GPIOx interrupt (by Irene 2004-10-22)  *************************/
/*******************************************************************************************/
//
// GPIOXX_2ISR    Added by Irene @2004-10-22 15:18
//
// GPIO40 - INT_ETH
// GPIO41 - INT_PCMCIA
// GPIO42 - INT_USB
// GPIO43 - INT_AC97
//
//  Inputs:
//      ra  -   return address of the interrupted routine
//
int GPIOXX_2ISR(unsigned int ra)
{
    volatile XLLP_INTC_T *v_pICReg;
    volatile XLLP_GPIO_T   *v_pGPIOReg;
    PDRIVER_GLOBALS      v_pDrvGlob;
int InterruptType;

    v_pICReg = (volatile XLLP_INTC_T *)INTC_BASE_U_VIRTUAL;
    v_pGPIOReg = (volatile XLLP_GPIO_T *)GPIO_BASE_U_VIRTUAL;
    v_pDrvGlob = (PDRIVER_GLOBALS)DRIVER_GLOBALS_U_VIRTUAL;
    
    v_pGPIOReg->GPDR3 |= XLLP_BIT_10;
    v_pGPIOReg->GPCR3 = XLLP_BIT_10;   //Turn on HL_11

    //
    // mask interrupt
    //
    INTC_GPIOXX_2_INT_DIS(v_pICReg->icmr);   // mask interrupt

    if(v_pGPIOReg->GEDR1 & SMSC_INT_BIT)
    {
     InterruptType = SMSC_ISR();
     SMSC_INT_CLR(v_pGPIOReg);
    }
    else if(v_pGPIOReg->GEDR1 & PCMCIA_INT_BIT)
    {
     InterruptType = PCMCIA_ISR();
     PCMCIA_INT_CLR(v_pGPIOReg);
    }
    else if(v_pGPIOReg->GEDR1 & USB_CLIENT_INT_BIT)
    {
     InterruptType = USB_CLIENT_ISR();
     USB_CLIENT_INT_CLR(v_pGPIOReg);
    }
    else if(v_pGPIOReg->GEDR1 & TOUCH_INT_BIT)
    {
     InterruptType = AC97_ISR();
     TOUCH_INT_CLR(v_pGPIOReg);
    }
    else
    {
        InterruptType = SYSINTR_NOP;
     RETAILMSG(1,(TEXT("SYSINTR_NOP!!\r\n")));
    }
    return InterruptType;
}

static int SMSC_ISR(void)
{
return SYSINTR_SMSC;
}

static int PCMCIA_ISR(void)
{
return  SYSINTR_PCMCIA_EDGE;
}

static int USB_CLIENT_ISR(void)
{
return  SYSINTR_USB_CLIENT;
}

static int AC97_ISR(void)
{
return  SYSINTR_TOUCH;  //by Irene @2004-11-22 11:46  SYSINTR_AUDIO;
}

/*********************  END of GPIOx interrupt (by Irene 2004-10-22)  **********************/


相关宏定义如下:
//
// Bit Definition
//
#define SMSC_INT_BIT            XLLP_BIT_8
#define PCMCIA_INT_BIT          XLLP_BIT_9
#define USB_CLIENT_INT_BIT      XLLP_BIT_10
#define TOUCH_INT_BIT           XLLP_BIT_11

//
// Interrupt clear (GEDR)
//
#define SMSC_INT_CLR(p)         (p->GEDR1 = SMSC_INT_BIT)
#define PCMCIA_INT_CLR(p)       (p->GEDR1 = PCMCIA_INT_BIT)
#define USB_CLIENT_INT_CLR(p)   (p->GEDR1 = USB_CLIENT_INT_BIT)
#define TOUCH_INT_CLR(p)        (p->GEDR1 = TOUCH_INT_BIT)



GPIO的相关的GRER设置放在 XllpAc97Init 开始的地方:
    pins[0] = 1;
    pins[1] = XLLP_GPIO_AC97INT;  //GPIO43, AC97_INT
    XllpGpioSetRisingDetectEnable(pGPIO, pins);

因为AC97的中断是高有效,所以设置 RisingDetectEnable,
GPIO43连接AC97_INT,所以  #define XLLP_GPIO_AC97INT       43
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-24 14:13
咦,用271?:) 我是外行哈,我看看:))
根据地的兄弟们,团结就是力量
irene
驱动牛犊
驱动牛犊
  • 注册日期2004-11-03
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-24 14:21
中断进不了是因为Interrupt controller中相应的寄存器没有使能。
这个bug修正以后,又出现新的问题,正在调试中,解决后会和大家分享。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-24 14:21
代码本身没什么问题吧,你是说这个isr没有执行?那你得检查检查硬件和寄存器(gpio部分)设置了,问题不大,goodl luck:)
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-24 14:27
厉害:)
根据地的兄弟们,团结就是力量
irene
驱动牛犊
驱动牛犊
  • 注册日期2004-11-03
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-27 14:04
还是没能解决 :(

   在OEMInterruptHandler中设调试信息:
   ichp = v_pICReg->ichp;
   RETAILMSG(1,(TEXT("PBoutput --- ichp:0x%x \r\n"), ichp));
   PB 的debug output会一直打印下面的信息:
      0 PID:0 TID:0 PBoutput --- ichp:0x801a0000
      0 PID:0 TID:0 PBoutput --- ichp:0x801a0000
      0 PID:0 TID:0 PBoutput --- ichp:0x801a0000
      ...........................................
   中断的devID是0x1a,也就是说,OSTM0TimerISR 始终会被调到,函数OEMInterruptHandler可以进去。

   Driver中设备初始化时,InterruptInitialize正常被调到,OEMInit, OEMInterruptEnable 也都有走到。之后,IST -- TouchPanelpISR 成功创建,可是,GPIOXX_2ISR还是进不了,中断管脚有跳变,可是再没有释放。感觉CPU并没有将这一信号作为中断异常来处理。
   是否仍是用作中断输入的GPIO没有设置对?到底需要设置哪些寄存器,怎样设置,有做过的同学可以讲一下吗?
irene
驱动牛犊
驱动牛犊
  • 注册日期2004-11-03
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-27 15:32
问题解决了!
GPIO设置没有问题,是ISRDefs.c中的数组 DevPriorities[MaxNumISRPriorities]中少加了GPIOxxx的device ID,Kernel 收不到GPIOxx来的中断。呵呵,转了一圈,终于可以了。
游客

返回顶部