WinCE下的GPIO中断的处理
在我所負責的音頻驅動部分代碼中,采用了PXA270的GPIO34來檢測Headphone的插入與拔出.原驅動部分有個BUG,即當耳機插入以后,耳機和喇叭同時在響,很明顯沒有對耳機插入事件做出響應.所以我開始采用了檢測GPIO信號拉高或者拉低和檢測耳機的插入事件,但是這樣做有個問題,就是會有延時,插入耳機以后,會有一兩秒的時候喇叭才會變關掉.為了改變這種辦法,經過咨詢,決定采用中斷的辦法來做這件事情,可以保證沒有這樣的檢測延時.
??? 在音頻驅動(WM9705)的Hwctxt.cpp的initcodec函數中加入如下代碼:
? if (m_pGPIORegs == NULL)
??? {
??????? PHYSICAL_ADDRESS ioPhysicalBase = {BULVERDE_BASE_REG_PA_GPIO,0};
??????? m_pGPIORegs = (PBULVERDE_GPIO_REG)MmMapIoSpace(ioPhysicalBase, sizeof(BULVERDE_GPIO_REG),FALSE);
??????
???? }
????
???? SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
??? //create the?headphone?Event
???? gHeadPhoneIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
??? //Interrupt initialize and connect?SYSINTR with EVENT.????
???? if (!(InterruptInitialize(SYSINTR_HEADPHONE_DETECT, gHeadPhoneIntrEvent, NULL, 0))) {
??? ?WAV_DBGMSG(TEXT("[Audio]Intialize the interrupt gHeadphoneIntrEvent error\r\n"));
?????????????
??? }
???????
//Create the Interrupt thread?
??? gHeadPhoneIntrThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)HeadPhoneIntrThread,this, 0, NULL);
??? if (!gHeadPhoneIntrThread)
??{
???WAV_DBGMSG(TEXT("Create the Detect thread failure--\r\n"));
??}
其中SYSINTR_HEADPHONE_DETECT定義在Bsp_cfg.h中,具體定義如下:
#define SYSINTR_HEADPHONE_DETECT (SYSINTR_FIRMWARE+19) //chose a unused intr
具體的中斷處理函數如下:
int WINAPI HeadPhoneIntrThread(void)
{
???
??? while(1)
??? {???????????
??????? WaitForSingleObject(gHeadPhoneIntrEvent,INFINITE);
?
?????//if GPIO34 is high,means headphone is inserted?
?????if (m_pGPIORegs->GPLR1 & XLLP_BIT_2)
??? ?{
??? ????
??? ???? HeadPhone_Detect=1;
??? ???? //WAV_DBGMSG(TEXT("[Audio]in HeadphoneIntrThread Headphone in--\r\n"));
??? ???? WMAudioMuteSignal( DeviceToRW, WM_AUDIO_HEADPHONE, FALSE );//open headphone output
???????? WMAudioMuteSignal( DeviceToRW, WM_AUDIO_LINEOUT, TRUE );//mute the lineout output
?????}
??? ?else
??? ?{
??? ???
??? ???? HeadPhone_Detect=0;?
??? ???? //WAV_DBGMSG(TEXT("[Audio]in HeadphoneIntrThread Headphone out--\r\n"));
??? ???? WMAudioMuteSignal( DeviceToRW, WM_AUDIO_HEADPHONE,TRUE );
??? ???? WMAudioMuteSignal( DeviceToRW, WM_AUDIO_LINEOUT, FALSE );
???????????
??? ?}
??? ?
??? ? InterruptDone(SYSINTR_HEADPHONE_DETECT);
??? }
}
但是SYSINTR_HEADPHONE_DETECT是如何和真正的中斷聯系起來的呢,具體的操作在intr.c里面.這個文件位于\project\platform\mainstoneii\src\kernel\oal.
OALIntrStaticTranslate(SYSINTR_HEADPHONE_DETECT, IRQ_HEADPHONE_DETECT);
這句將SYSINTR_HEADPHOONE_DETECT和真正的中斷號聯系起來.而IRQ_HEADPHONE_DETECT的定義也在這兒:#define IRQ_HEADPHONE_DETECT????????? (IRQ_BULVERDE_MAX + 15)?
注意,這里的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)
??? {
??? // WAV_DBGMSG(TEXT("[Audio]Setting GPIO for Headphone in BSPIntrEnableIrq\r\n"));?
???? g_pGPIORegs->GAFR1_L &= ~XLLP_GPIO_AF_BIT_FFRXD_MASK;?? //GPIO34 as GPIO
???? g_pGPIORegs->GPDR1 &= ~XLLP_BIT_2;????????????????????? //GPIO34 as HPS Input
//set the falling edge and rising edg to?work
?????? g_pGPIORegs->GFER1 |=XLLP_BIT_2;
???? g_pGPIORegs->GRER1 |=XLLP_BIT_2;
??? }
同樣的在BSPIntrDisableIrq函數中也要加入處理headphone IRQ的代碼:
?else if (irq == IRQ_HEADPHONE_DETECT)
??? {
//clear the falling edge and rising to?start the interrupt
?????g_pGPIORegs->GFER1 &=~XLLP_BIT_2;
???? g_pGPIORegs->GRER1 &=~XLLP_BIT_2;
??? }
在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)
???? {//set the GPIO?Edge Status Register
????????g_pGPIORegs->GEDR1 |= XLLP_BIT_2;?
??? ?? //return IRQ to enbale the EVENT
??????? return IRQ_HEADPHONE_DETECT;
???? }
此處返回中斷號可以觸發EVENT.這樣的話在中斷處理函數中 WaitForSingleObject(gHeadPhoneIntrEvent,INFINITE);就可以知道中斷發生了,否則的話它會等在這兒.
這樣在WINCE下的GPIO中斷處理到檢測就完成了.
?
總結
以上是生活随笔為你收集整理的WinCE下的GPIO中断的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通银行信用卡刷爆了怎么还款
- 下一篇: 黄金10年价格一览表,历年金价上涨是什么