日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

wince6.0 s5pv210 中断

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 中断的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。