wince6.0 s5pv210 中断
1. 在smdkv210\src\oal\oallib\ksarm.h頭文件里可以看到wince的中斷定義。
?? ?設(shè)備中斷的起始編號(hào)即wince預(yù)定義的設(shè)備中斷ID的基值
?? ?SYSINTR_DEVICES EQU 8
?? ?一共支持64個(gè)設(shè)備中斷 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?SYSINTR_MAX_DEVICES EQU 64 ? ? ? ? ? ? ? ? ? ?
?? ?可用的設(shè)備中斷ID的基值
?? ?SYSINTR_FIRMWARE ? ?EQU SYSINTR_DEVICES+16 ? ? ?
?? ?中斷總數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ?SYSINTR_MAXIMUM EQU SYSINTR_DEVICES+SYSINTR_MAX_DEVICES ? ? ? ? ??
?? ?
?? 那我們自己增加的外設(shè)的中斷需要以SYSINTR_FIRMWARE為基值來(lái)定義,所有自定義的系統(tǒng)中斷號(hào)都應(yīng)該基于該值進(jìn)行累加加1,這些自定義的系統(tǒng)中斷號(hào)用于和IRQ一一對(duì)應(yīng)。如下:
?? #define ?SYSINTR_SHUTPOWER_DETECT ?(SYSINTR_FIRMWARE+N) ?
??SYSINTR_SHUTPOWER_DETECT為我定義的關(guān)機(jī)中的中斷。? ? ??
???N為當(dāng)前已定義的最大值(以保證此中斷未使用過(guò))。
2. 在datasheet上查要使用的中斷號(hào)。
?? ?
?? 我用的是XEINT1/GPH01----->EINT1
3. 在s5pv210_sec_v1\oal\inc\intr_reg.h 中找到我們要用的虛擬中斷號(hào)IRQ_EINT1。
4. 在smdkv210\src\oal\oallib\intr.c中的BSPIntrInit()函數(shù)中加入對(duì)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);??
?? ?然后調(diào)用OALIntrStaticTranslate(SYSINTR_SHUTPOWER_DETECT, IRQ_EINT1)來(lái)注冊(cè)中斷。
?? ?然后使能中斷。
?? ?value = IRQ_EINT1;
?? ?OALIntrEnableIrqs(1, &value);
?? ?BSPIntrInit這個(gè)函數(shù)由s5pv210_sec_v1\oal\intr\intr.c的OALIntrInit()來(lái)調(diào)用,
?? ?OALIntrInit()最終由OEMInit()來(lái)調(diào)用。
?? ?看這個(gè)函數(shù)的注釋。
?? ?// ?This is Windows CE OAL initialization function. It is called from kernel
?? ?// ?after basic initialization is made.
?? ?他由內(nèi)核來(lái)調(diào)用的。
5. 修改OALIntrEnableIrqs函數(shù),加入我們對(duì)此中斷的使能。
??? if (PhysicalIRQ == PHYIRQ_EINT1)
??????? {
??????????? g_pGPIOReg->EINTMSK.EXT_INT0_MASK &=~(0x1<<1); //enable eint1
??????????? OALMSG(1, (L"+OALIntrEnableIrqs(%d,)\r\n", PhysicalIRQ));
??????? }
???????6. 修改OALIntrDisableIrqs函數(shù),加入我們對(duì)此中斷的關(guān)閉。
????????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));??
??????? }
?? ?至此,對(duì)bsp修改完成,接下來(lái)寫驅(qū)動(dòng)。
1. 在驅(qū)動(dòng)的初始化函數(shù)中創(chuàng)建一個(gè)事件對(duì)象
?? ?gShutpowerIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
?? ?此事件對(duì)象用于和中斷綁定,來(lái)阻塞我們自己寫的IST。
2. 然后將剛才創(chuàng)建的事件對(duì)象與中斷綁定。
?? ?InterruptInitialize(SYSINTR_SHUTPOWER_DETECT,gShutpowerIntrEvent, NULL, 0)
3. 創(chuàng)建我們自己的IST
?? ?gShutpowerIntrThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ShutpowerIntrThread,this, 0, NULL);
4. 編寫IST完成我們?cè)谥袛嗟絹?lái)時(shí)需要完成的關(guān)機(jī)動(dòng)作。
?? ?IST的框架如下:
?? ?int WINAPI ShutpowerIntrThread(void) {
?? ? ? ? ?while(1) {
?? ? ? ? ? ? ? ? ?WaitForSingleObject(gShutpowerIntrEvent?,INFINITE);
?? ? ? ? ? ? ? ? ?關(guān)機(jī)代碼
?? ? ? ? ?}
?? ? ? ? ?InterruptDone(SYSINTR_SHUTPOWER_DETECT);
?? ?}
至此一個(gè)簡(jiǎn)單的CE中斷關(guān)機(jī)驅(qū)動(dòng)完成。
總結(jié)
以上是生活随笔為你收集整理的wince6.0 s5pv210 中断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinCE 字体平滑 ClearType
- 下一篇: 神十四发射成功!航天员刘洋妈妈流泪隔空向