wince6.0 s5pv210 中断
1. 在smdkv210\src\oal\oallib\ksarm.h頭文件里可以看到wince的中斷定義。
?? ?設備中斷的起始編號即wince預定義的設備中斷ID的基值
?? ?SYSINTR_DEVICES EQU 8
?? ?一共支持64個設備中斷 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?SYSINTR_MAX_DEVICES EQU 64 ? ? ? ? ? ? ? ? ? ?
?? ?可用的設備中斷ID的基值
?? ?SYSINTR_FIRMWARE ? ?EQU SYSINTR_DEVICES+16 ? ? ?
?? ?中斷總數 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?SYSINTR_MAXIMUM EQU SYSINTR_DEVICES+SYSINTR_MAX_DEVICES ? ? ? ? ??
?? ?
?? 那我們自己增加的外設的中斷需要以SYSINTR_FIRMWARE為基值來定義,所有自定義的系統中斷號都應該基于該值進行累加加1,這些自定義的系統中斷號用于和IRQ一一對應。如下:
?? #define ?SYSINTR_SHUTPOWER_DETECT ?(SYSINTR_FIRMWARE+N) ?
??SYSINTR_SHUTPOWER_DETECT為我定義的關機中的中斷。? ? ??
???N為當前已定義的最大值(以保證此中斷未使用過)。
2. 在datasheet上查要使用的中斷號。
?? ?
?? 我用的是XEINT1/GPH01----->EINT1
3. 在s5pv210_sec_v1\oal\inc\intr_reg.h 中找到我們要用的虛擬中斷號IRQ_EINT1。
4. 在smdkv210\src\oal\oallib\intr.c中的BSPIntrInit()函數中加入對GPH01的初始化。
????//gph01 as eint1
??? v_pGPIOregs->GPH0.GP_CON &=? ~(0xf<<4);
??? //gph01 as eint1
????v_pGPIOregs->GPH0.GP_CON |=? (0xf<<4);
??? //gph01 pull disable
??? v_pGPIOregs->GPH0.GP_PUD &=~(0x3<<2);
??? //gph01 low level triggered???????
??? v_pGPIOregs->EINTCON.EXT_INT0_CON &=~(0xF<<4);????
??? //enable eint1?
??? v_pGPIOregs->EINTMSK.EXT_INT0_MASK &=~(0x1<<1);
??? //Filter Enable for EXT_INT[1] ---DISBLE
??? v_pGPIOregs->EINTFLT.EXT_FLT0_CON._FLT_CON0?? &=~(0x3<<14);?
??? //EINT1 interrupt clear???
??? v_pGPIOregs->EINTPND.EXT_INT0_PEND |=(0x1<<1);??
?? ?然后調用OALIntrStaticTranslate(SYSINTR_SHUTPOWER_DETECT, IRQ_EINT1)來注冊中斷。
?? ?然后使能中斷。
?? ?value = IRQ_EINT1;
?? ?OALIntrEnableIrqs(1, &value);
?? ?BSPIntrInit這個函數由s5pv210_sec_v1\oal\intr\intr.c的OALIntrInit()來調用,
?? ?OALIntrInit()最終由OEMInit()來調用。
?? ?看這個函數的注釋。
?? ?// ?This is Windows CE OAL initialization function. It is called from kernel
?? ?// ?after basic initialization is made.
?? ?他由內核來調用的。
5. 修改OALIntrEnableIrqs函數,加入我們對此中斷的使能。
??? if (PhysicalIRQ == PHYIRQ_EINT1)
??????? {
??????????? g_pGPIOReg->EINTMSK.EXT_INT0_MASK &=~(0x1<<1); //enable eint1
??????????? OALMSG(1, (L"+OALIntrEnableIrqs(%d,)\r\n", PhysicalIRQ));
??????? }
???????6. 修改OALIntrDisableIrqs函數,加入我們對此中斷的關閉。
????????if (PhysicalIRQ == PHYIRQ_EINT1)
??????? {
?????????????????? g_pGPIOReg->EINTMSK.EXT_INT0_MASK |=(0x1<<1); //enable eint1
?????????????????? g_pGPIOReg->EINTPND.EXT_INT0_PEND |=(0x1<<1);? // Clear pending EINT1
?????????????????? OALMSG(1, (L"+OALIntrDisableIrqs(%d,)\r\n", PhysicalIRQ));??
??????? }
?? ?至此,對bsp修改完成,接下來寫驅動。
1. 在驅動的初始化函數中創建一個事件對象
?? ?gShutpowerIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
?? ?此事件對象用于和中斷綁定,來阻塞我們自己寫的IST。
2. 然后將剛才創建的事件對象與中斷綁定。
?? ?InterruptInitialize(SYSINTR_SHUTPOWER_DETECT,gShutpowerIntrEvent, NULL, 0)
3. 創建我們自己的IST
?? ?gShutpowerIntrThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ShutpowerIntrThread,this, 0, NULL);
4. 編寫IST完成我們在中斷到來時需要完成的關機動作。
?? ?IST的框架如下:
?? ?int WINAPI ShutpowerIntrThread(void) {
?? ? ? ? ?while(1) {
?? ? ? ? ? ? ? ? ?WaitForSingleObject(gShutpowerIntrEvent?,INFINITE);
?? ? ? ? ? ? ? ? ?關機代碼
?? ? ? ? ?}
?? ? ? ? ?InterruptDone(SYSINTR_SHUTPOWER_DETECT);
?? ?}
至此一個簡單的CE中斷關機驅動完成。
總結
以上是生活随笔為你收集整理的wince6.0 s5pv210 中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinCE 字体平滑 ClearType
- 下一篇: JDK1.6