S5PV210中斷控制器詳解(一) 概述和使用中斷

2021-09-30 14:46:10 字數 3390 閱讀 5855

1 s5pv210的interrupt controller簡介

s5pv210是三星推出的一款基於cortex-a8的soc,其內部整合的中斷控制器由4個arm primecell pl192向量中斷控制器級連(daisy-chain)而成,每個pl192 vic(vectored interrupt controller)

支援32個中斷源,所以最多支援128個。s5pv210使用了其中的93個。所謂「向量」是指當中斷發生時,軟體可以直接從vic得到提前設好的中斷服務程式isr(interrupt service routine),對於s5pv210這樣的單核cpu來說,pl192是一種比較高效的vic。硬體上的連線圖大體如下所示:

在圖中,各個vic之間連線的比較重要重要的訊號,樓主都已經標註出來,最終連線到arm cpu上的輸入訊號只有兩個,irq和fiq

2 什麼樣的中斷會被送到cpu處理?

中斷分為兩種,一種是真實的外部硬體觸發的中斷,另一種叫軟中斷softint,它是由軟體寫暫存器而觸發。對應的暫存器為vicsoftint,當其中的某個bit位為非0,時,vic就收到了乙個softint,softint一般都是用在除錯中,用於手動產生乙個中斷

下面這張圖清楚的描述了中斷請求的步驟:

左邊的或門的輸入是vicintsource和vicsoftint,vicintsource來自外部,是其它soc內部模組或者soc外部產生的真實中斷;vicsoftint在框圖的內部,是有vic自己產生的。無論這兩者哪個發生了,在vicrawinterrupt處都會看到這個中斷源的存在。vicrawinterrupt對應的暫存器為:

這裡三星官方給出的描述似乎有點問題,status of fiq interrupt before masking,事實上,irq的status也是能看到的。

再看interrupt requst logic圖,中間的與門,其輸入是從左邊過來的vicrawinterrupt和vicintenable,vicintenable表明了已經使能的中斷源,與之對應的暫存器有兩個,如下所示

給vicenable暫存器裡的某個bit寫1,表明使能某個中斷,而給vicintclear裡的某個bit寫1,表明是要disable某個中斷。這兩個暫存器都有乙個特點,給對應的bit寫0無效。不知道是為什麼,許多中斷控制器都採用這種方式,完全可以用乙個vicenable暫存器來完成,寫1為enable,寫0為disable

vicintselect決定了interrupt requst logic圖最右邊的選擇器是輸出irq和fiq,這很好理解,對應的暫存器為:

預設情況下,所有的中斷源都設定為irq interrupt

3 收到中斷後,應該做些什麼?

在arm cpu收到中斷的觸發之後,硬體會自動將中斷前的cpsr到spsr_irq,儲存pc到lr_irq

,將cpsr的低5位設定為0x12(irq模式),並且關閉irq使能位(cpsr bit 7置1),然後arm會將pc轉到中斷向量表的0x18偏移處,開始執行irq的入口函式。irq handler在開始是要儲存暫存器現場,然後跳轉到真正的irq handler

。以上的這些內容對於所有的arm cpu來說,都是一樣的,固定動作。

到了irq handler後,首先軟體需要知道,哪個中斷發生了,s5pv210的做法就是遍歷vic0irqstatus~vic3irqstatus,不為0,代表該vic有中斷發生(

vicirqstatus也就是interrupt request logic圖中最右邊的輸出訊號)。

再去讀取發生中斷的vic對應的vicaddress,此時中斷控制器硬體已經替我們選好了優先順序最高的中斷,並將其isr推送到vicaddress暫存器裡,我們可以直接拿到就執行,不用再像老式的方法,遍歷vicirqstatus裡的每個bit位,找到不為0的那個,對映到具體的isr,效率要高不少。

在isr的結尾,需要將中斷清除,以告訴硬體(uart0和interrupt controller),這次中斷我處理完了,可以接收下個中斷了。三星官方要求將all vicaddress都寫0,不用擔心誤清了vic0,2,3的中斷,因為中斷發生的源頭還在,還會再次觸發

when user clears interrupt pending, user must write 0 to all the vicaddress registers (vic0address, vic1address, vic2address, and vic3address).

關於向量和優先順序,請參考這篇博文

s5pv210中斷控制器詳解(二):向量和優先順序。

4 程式設計使用中斷

有了前面的理論知識後,程式設計使用中斷就會水到渠成。以uart0為例,它是連線在vic1的的第10號中斷源上。

初始化**如下:

void uart0_irq_init(void)

中斷向量表處的**為:

irq_handler:

sub lr, lr, #4 /* 1.計算返回位址 */

stmfd sp!, /* 2.保護現場 */

bl do_irq /* 3. 處理異常 */

ldmfd sp!, ^ /* 4. 恢復現場 ^表示把spsr恢復到cpsr */

void do_irq(void)

}

最後是uar0irq的中斷服務函式uart0_isr

void uart0_isr(void)

s5pv210 中斷實戰

以下內容源於部落格的學習,以及朱有鵬老師課程的學習,和網路資源的整理。1 建立異常向量表 2 中斷初始化 3 使能 如外部中斷,寫中斷處理函式 4 建立中斷號與中斷處理函式的聯絡,使能。當中斷發生時,中斷處理函式會自動處理中斷 流程如下圖 下面按上述步驟編寫 內容細節見部落格 s5pv210 裸機 ...

S5PV210中斷處理

start 1 設定棧空間 防止之前的uboot 被覆蓋,應為c中需要棧空間 mov r0,0x53 msr cpsr cxsf,r0 b main main函式 1 led燈引腳功能設定 gpj2con 0xf 0 gpj2con 1 0 2 中斷初始化 2 1 註冊中斷函式 功能函式 start...

S5PV210的NandFlash控制器部分

s5pv210的nandflash控制器部分 1.如圖是s5pv210的nandflash的控制框圖 s5pv210的nand控制器的主要暫存器 nfconf nfcont nfcmmd nfaddr nfdata nfmeccd0 nfmeccd1 nfseccd nfstat 2.nand晶元本...