阅读:1055回复:6
PXA271 GPIOx的中断处理
请教关于 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 |
|
论坛版主
|
沙发#
发布于:2004-11-24 14:13
咦,用271?:) 我是外行哈,我看看:))
|
|
板凳#
发布于:2004-11-24 14:21
中断进不了是因为Interrupt controller中相应的寄存器没有使能。
这个bug修正以后,又出现新的问题,正在调试中,解决后会和大家分享。 |
|
论坛版主
|
地板#
发布于:2004-11-24 14:21
代码本身没什么问题吧,你是说这个isr没有执行?那你得检查检查硬件和寄存器(gpio部分)设置了,问题不大,goodl luck:)
|
|
论坛版主
|
地下室#
发布于:2004-11-24 14:27
厉害:)
|
|
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没有设置对?到底需要设置哪些寄存器,怎样设置,有做过的同学可以讲一下吗? |
|
6楼#
发布于:2004-11-27 15:32
问题解决了!
GPIO设置没有问题,是ISRDefs.c中的数组 DevPriorities[MaxNumISRPriorities]中少加了GPIOxxx的device ID,Kernel 收不到GPIOxx来的中断。呵呵,转了一圈,终于可以了。 |
|