1 WinCE中第一次對(duì)中斷的處理是在OAL的OEMInit()中,該函數(shù)調(diào)用OALIntrInit()完成對(duì)中斷的初始化。
2 OALIntrInit()對(duì)中斷的初始化做了如下工作:
2.1 通過配置IPR0-IPR33設(shè)置中斷優(yōu)先級(jí),優(yōu)先級(jí)定義在g_IntPriorities和g_IntPriorities2中,其中IRQ_OSMR0為最高優(yōu)先級(jí), IRQ_KEYPAD為最低優(yōu)先級(jí)。
2.2 設(shè)置ICCR,在空閑模式時(shí)只對(duì)有效的,非屏蔽的中斷響應(yīng)。
2.3 BSPIntrInit()。該函數(shù)對(duì)BSP中需要處理的中斷進(jìn)行初始化工作,主要是設(shè)置ICMR寄存器使GPIO1(CPLD)和GPIO2為非屏蔽狀態(tài),然后通過OALIntrStaticTranslate建立IRQ和sysintr之間的關(guān)聯(lián)。
2.4 對(duì)于WinCE來說,中斷可以作如下分類:
1》 與BSP無關(guān)的Kernel使用的內(nèi)部中斷, 比如IRQ_OSMR0(for
sched),IRQ_RTCALARM;
2》 與BSP有關(guān)的CPU內(nèi)部中斷,比如IRQ_USBOHCI, IRQ_OSM
R1, IRQ_KEYPAD, IRQ_FFUART, IRQ_BTUART, IRQ_STUART, IRQ_DMAC, IRQ_USBFN;
3》 CPLD所管理的中斷,以GPIO1通知CPU中斷的產(chǎn)生,在收到G
PIO1產(chǎn)生的中斷后可以通過讀取地址0x0A00_0010判斷具體的中斷源,比如IRQ_GPIO1_MMCCD(MMC_IN_INT, MMC_OUT_INT), IRQ_GPIO1_USBCD(USB_IN_INT, USB_OUT_INT), IRQ_GPIO1_PCMCIA_S0_CSC(CF_IN_INT. CF_OUT_INT),還有在代碼中沒有處理的SIM卡中斷(SIM_IN_INT, SIM_OUT_INT)。
4》 GPIO2_120產(chǎn)生的中斷,通過寄存器ICIP的位10-GPIO_x通
知CPU中斷的產(chǎn)生,然后查詢寄存器GEDR_x可以判斷具體的中斷源,比如IRQ_GPIO12_MARATHO, IRQ_GPIO10_ETHERNET,IRQ_GPIO13_UCB1400;
5》 以Installable ISR形式產(chǎn)生的中斷,這類中斷通常是以DLL的形式安裝,在注冊(cè)表中定義其實(shí)際的IRQ中斷值,比如IRQ_MMC_DETECT,IRQ_MMC_CONTROL;
2.5 有幾種方式可以建立實(shí)際中斷IRQ到系統(tǒng)中斷sysintr之間的關(guān)聯(lián),對(duì)于build-in設(shè)備,可以在OEMInit中通過OALIntrStaticTranslate來建立靜態(tài)的關(guān)聯(lián);但是對(duì)于installable ISRs,可以在注冊(cè)表中定義實(shí)際的中斷IRQ,然后通過在KernelIOControl中使用IOCTL_HAL_REQUEST_SYSINTR來實(shí)時(shí)分配新的sysintr,這有助于驅(qū)動(dòng)的移植。
3 在CPU接收到中斷后,對(duì)中斷的處理是在 OEMInterruptHandler()中,該函數(shù)的首先屏蔽該中斷,最后得到實(shí)際中斷IRQ所對(duì)應(yīng)的sysintr的值。
3.1 首先它通過中斷寄存器ICHP得到實(shí)際的IRQ值;
3.2 對(duì)于GPIO產(chǎn)生的中斷,通過清空GFER和GRER寄存器來屏蔽相同的中斷;對(duì)于其余的CPU內(nèi)部中斷,通過清空ICMR寄存器的相應(yīng)位來屏蔽中斷;
3.3 對(duì)于Kernel使用的IRQ_OSMR0和IRQ_OSMR2,分別進(jìn)行處理,得到sysintr;
3.4 對(duì)于通過GPIO0,GPIO1和GPIO2_120產(chǎn)生的中斷,將IRQ的值進(jìn)行轉(zhuǎn)化,使之與OAL/intr.c和bulverder_intr.h中所定義的新的IRQ值相對(duì)應(yīng),此時(shí)的IRQ值就不是在ICIP中對(duì)定義的IRQ值了;
3.5 接著調(diào)用NKCallIntChain(irq)判斷該IRQ是否已經(jīng)被加入中斷列表,同時(shí)開始調(diào)用該中斷的ISR程序。
4 當(dāng)中斷處理完成后,調(diào)用OALIntrDoneIrqs(),重新使能中斷。
(審核編輯: 智匯小新)
分享