原文:blog.csdn.net/frankeagle/archive/2006/02/24/608156.aspx
在 我所负责的音频驱动部分代码中,采用了PXA270的GPIO34来检测Headphone的插入与拔出.原驱动部分有个BUG,即当耳机插入以后,耳机 和喇叭同时在响,很明显没有对耳机插入事件做出响应.所以我开始采用了检测GPIO信号拉高或者拉低和检测耳机的插入事件,但是这样做有个问题,就是会有 延时,插入耳机以后,会有一两秒的时候喇叭才会变关掉.为了改变这种办法,经过咨询,决定采用中断的办法来做这件事情,可以保证没有这样的检测延时. 在音频驱动(WM9705)的Hwctxt.cpp的initcodec函数中加入如下代码: if (m_pGPIORegs == NULL) //create the headphone Event //Interrupt initialize and connect SYSINTR with EVENT. if (!(InterruptInitialize(SYSINTR_HEADPHONE_DETECT, gHeadPhoneIntrEvent, NULL, 0))) { //Create the Interrupt thread 其中SYSINTR_HEADPHONE_DETECT定义在Bsp_cfg.h中,具体定义如下: #define SYSINTR_HEADPHONE_DETECT (SYSINTR_FIRMWARE+19) //chose a unused intr 具体的中断处理函数如下: int WINAPI HeadPhoneIntrThread(void)
但是SYSINTR_HEADPHONE_DETECT是如何和真正的中断联系起来的呢,具体的操作在intr.c里面.这个文件位于/project/platform/mainstoneii/src/kernel/oal. OALIntrStaticTranslate(SYSINTR_HEADPHONE_DETECT, IRQ_HEADPHONE_DETECT); 注意,这里的IRQ_HEADPHONE_DETECT与#define IRQ_GPIO0_PCMCIA_S1_CSC (IRQ_BULVERDE_MAX + 15) 是一样的,因为PCMCIA在系统里面没有用,所以采用这个中断来给我们的HEADPHONE使用.所以别忘了把下面这句注释掉,否则你的系统会不知道这 个中断给谁用了. //OALIntrStaticTranslate(SYSINTR_PCCARD_CSC_S1, IRQ_GPIO0_PCMCIA_S1_CSC); 然后在BSPIntrEnableIrq函数中加入对headphone IRQ的处理: if (irq == IRQ_HEADPHONE_DETECT) g_pGPIORegs->GAFR1_L &= ~XLLP_GPIO_AF_BIT_FFRXD_MASK; //GPIO34 as GPIO //set the falling edge and rising edg to work 同样的在BSPIntrDisableIrq函数中也要加入处理headphone IRQ的代码: else if (irq == IRQ_HEADPHONE_DETECT) //clear the falling edge and rising to start the interrupt 在BSPIntrActiveIrq函数中,可以知道这个函数的用途是:This function is called from interrupt handler to give BSP chance to translate IRQ in case of secondary interrupt controller.可以看到实际处理我们HEADPHONE IRQ的函数是GPIOXX2InterruptHandler().在这个函数中处理Headphone IRQ的代码为: else if (g_pGPIORegs->GEDR1 & XLLP_BIT_2) 此处返回中断号可以触发EVENT.这样的话在中断处理函数中 WaitForSingleObject(gHeadPhoneIntrEvent,INFINITE);就可以知道中断发生了,否则的话它会等在这儿. 这样在WINCE下的GPIO中断处理到检测就完成了. |
WinCE下的GPIO中断的处理
最新推荐文章于 2018-02-23 17:08:13 发布