在上一篇文章中,我們簡要分析了中斷子系統框架,本章我們將通過實現一個虛擬的中斷控制器驅動,說明如何進行中斷控制器驅動開發。本章的內容大概分為如下幾部分:
一、實現虛擬中斷控制器的可行性說明
二、中斷控制器驅動的開發流程
三、虛擬中斷控制器驅動設計說明
在進行虛擬中斷控制器的設計之前,我們先說明下linux系統中硬體中斷觸發後的處理過程。如下圖所示,當硬體中斷觸發後,各架構的CPU板級代碼經過處理後,大都會調用do_IRQ/generic_handle_irq接口,從而調用具體irq_desc的irq flow handler接口,進行中斷處理函數的調用等工作。基於此,我們可以提供操作接口調用generic_handle_irq,從而模擬硬體中斷觸發,實現中斷處理流程的觸發操作,這是我們實現虛擬中斷控制器的理論基礎。
在提供了模擬硬體中斷觸發的機制後,我們再確認下中斷控制器驅動的開發流程,主要分為如下幾個部分:
有了以上的基礎後,我們即可以進行虛擬中斷控制器驅動的開發,以便了解中斷控制器驅動的開發流程。
本次我們開發的虛擬中斷控制器包含兩個型號virt0808、virt0813,這兩個中斷控制器均提供16個hw irq line。然後這兩個中斷控制器級聯在一起(virt0813連接至virt0808的第16個中斷號,virt0808作為root controller),連接方式如下圖所示。
這兩個中斷控制器均提供如下幾個寄存器:
以上即為虛擬中斷控制器的主要內容,下面為這兩個中斷控制器進行驅動開發。
針對虛擬中斷控制器驅動,主要包括如下幾步部分內容:
針對virt0808,定義數據結構virt_irq_provider,主要的成員包括:
針對模擬硬體中斷觸發,我們主要藉助irq work實現。主要的調用流程如下圖所示
而針對virt0813而言,其數據結構定義如下,該數據結構的定義與virt_irq_provider的定義類似。
在進行irq domain的map接口中完成irq desc與irq chip、irq flow handler的綁定操作
在probe接口中通過調用如下接口完成irq domain、irq desc的創建操作
以上就是virt0808的驅動程序,完成以上功能後,就完成針對virt0808 irq controller的驅動操作。
該設備驅動與virt0808 driver的驅動類似,唯一區別的是,因為virt0813是掛載在virt0808上的,因此當virt0813上中斷發生時,cpu首先得到的是virt0808對應引腳中斷,然後在virt0808的chain hw irq line的中斷處理函數中,通過讀取virt0813的中斷狀態寄存器,確認virt0813上是哪一個hw irq line發生中斷,再調用generic_handle_irq接口去處理該中斷。處理過程如下圖所示:
virt0813_sub_irq_handler的定義如下:
在測試驅動中主要申請兩個irq,一個irq是virt0808 irq controller的hw irq line;一個irq是virt0813 irq controller 的hw irq line,該驅動僅僅是測試用,比較簡單,代碼如下:
在該virt irq的目錄下執行make &&make install,驅動鏡像即在image目錄下。
驅動加載:
insmod virt0808_dev.ko
insmod virt0808_irq.ko
insmod virt0813_irq.ko
insmod irq_consumer_dev.ko
insmod irq_consumer_driver.ko
因我們在測試驅動中,申請了virt0808的第7個中斷,因此我們觸發該中斷,看下該中斷對應的中斷處理程序有沒有調用:
cd /sys/devices/platform/virt0808_irq_dev.0/
echo 6 >>irq_trigger
dmesg
如上圖所示,中斷處理函數已經執行。下面我們進行virt0813中斷的測試,我們申請的是virt0813的第一個中斷,執行
命令如下:
cd /sys/devices/platform/virt0813_irq_dev.0
echo 1 >>irq_status
cd /sys/devices/platform/virt0808_irq_dev.0/
echo 15 >>irq_trigger
dmesg
如上圖所示,中斷處理函數也已經執行成功,測試成功。
以上就是本篇文章的主要內容,我們主要實現了virt irq controller driver,熟悉irq controller driver的開發流程,我們實現的驅動中,兩個irq controller通過級聯的方式連接,也比較有代表性。我們學習了irq子系統下irq controller driver的開發後,對我們平常的開發有沒有幫助呢?當我們需要為一個gpio controller開發驅動,且該gpio controller支持中斷時,則可以為該gpio controller創建irq controller driver即可完成該功能(此種功能需求下,可參考virt0813的驅動程序實現該需求)。至此我們完成了irq子系統的學習,針對irq子系統我也就是會開發相應驅動,若要徹底理解中斷子系統,還有很長的路要走…後續如果有可能,會再深入學習(本次虛擬驅動的源碼連結稍後會發出來,或者在gitee上搜索用戶jerry_chg,也可以找到本次的驅動代碼)。