硬件篇:
S3C2440 是arm920T架構,先溫習一下s3c2440中的中斷控制器原理和相關硬件構架。
中斷控制器(InterruptControler):
S3c2440A的中斷控制器有60個中斷源,如DMA中斷,UART中斷,IIC中斷等,60個中斷源在寄存器中用相應的位來表示。當有多個中斷要求到來時,經過仲裁過程後,中斷控制器向CPU請求FIQ或者IRQ中斷。仲裁過程根據硬件中的優先級模塊來決定,其結果最後寫進中斷未決(intterrupt pending)寄存器中,通過中斷未決寄存器的值可以清楚哪個中斷發生了。
S3c2440中斷控制器流程圖:
掛起
中斷模式(InterruptMode):
ARM920T(CPU)中有兩類中斷模式: FIQ中斷和 IRQ中斷,前者俗稱快中斷,後者稱為普通中斷。 所有中斷源均可以指定采取何種中斷模式。程序狀態寄存器(PSR)有F和I標志位,當F 位 置 1 時,CPU不接受FIQ中斷,同樣,I位置1 時CPU不接受 IRQ中斷。所以中斷控制器需清零F位和I位,且將中斷屏蔽寄存器(INTMSK)清零後,方可接收中斷。
中斷未決寄存器(InterruptPending Register)
S3C2440A有兩個中斷未決寄存器:中斷源未決寄存器(SRCPND) 和中斷未決寄存器(INTPND)。這兩個寄存器指明了是否有中斷未決(產生)。當中斷源(一個或者多個同時發生)要求進行中斷服務程序時,SRCPND寄存器中相應的位置 1, 同時自動地,在INTPND寄存器中只有 1 位被置1(因為從上圖中可以看出INTPND是經過仲裁過程之後的,所以根據優先級決定最高優先級的中斷被置1)。 如果INTMSK中相應的中斷置 1,那麼,SRCPND中相應位將被置1,而INTPND不會有變化。當INTPND置位時,無論何時,只要I 或標志位為0,那麼即可執行中斷服務程序。SRCPND 和 INTPND 寄存器可讀可寫,所以中斷服務程序執行完後應當先寫相應位的 1到SRCPND寄存器,然後寫相應位的 1 到INTPND寄存器完成清零,以便CPU能響應下一次中斷的發生。
中斷屏蔽寄存器(InterruptMask Register)
中斷屏蔽寄存器INTMSK用來指示中斷是否並禁止(屏蔽)。如果相應位置1 標明該中斷源被屏蔽,置0 則中斷可以正常服務。如果某一中斷MASK 為 1且中斷發生,SRCPND中相應位會置1.
中斷優先級模塊(InterruptPrioprity Generating Block)
該模塊可以服務32個中斷要求,共由兩級仲裁單元組成。第一級有6個arbiter0 ~ 5,第二級為arbiter 6, 每個arbiter裡的中斷的優先級采取輪換機制改變優先級。
每個仲裁arbiter處理6個中斷要求,規則由優先寄存器(PRIORTY)中相應的ARB_MODE (1位)和ARB_SEL(2位)來決定。仲裁arbiter中REQ0總是最高優先級的,而REQ5總是最低的。所以只能在REQ1~REQ4中設定優先級:
ARB_SEL位為00b時,優先級:REQ0,REQ1,REQ2,REQ3,REQ4,REQ5
ARB_SEL位為01b時,優先級:REQ0,REQ2,REQ3,REQ4,REQ1,REQ5
ARB_SEL位為10b時,優先級:REQ0,REQ3,REQ4,REQ1,REQ2,REQ5
ARB_SEL位為11b時,優先級:REQ0,REQ4,REQ1,REQ2,REQ3,REQ3
所謂優先級采用輪換機制,舉例說是,例如REQ1發生時,這時ARB_SEL自動變成01b,所以,之後的優先級將為:REQ0,REQ2,REQ3,REQ3,REQ1,REQ5,可見,當某一中斷發生後(REQ1~REQ4),它的優先級將放到最低(在REQ5前),不斷輪回,同理REQ2發生時,ARB_SEL自動變成10b,之後的優先級將為:REQ0,REQ3,REQ4,REQ1,REQ2,REQ5。但REQ0,或者REQ5發生時,ARB_SEL將維持不變。
以上是在相應地ARB_MODE為1的時候。當ARB_MODE被置0的時候,將按照默認的模式也就是上圖中所示。
關於外部中斷:
s3c2440有24個GPIO輸入觸外部中斷,可分為低電平觸發,高電平觸發,下降沿觸發,上升沿觸發,或者下降,上升時觸發模式。
通過以上,s3c2440的中斷控制器原理,硬件構架分析完了。後面再來分析,ARM-Linux s3c2440之中斷分析的軟件實現原理。