Linux驅動筆記(二):中斷相關知識

1、中斷申請和釋放

申請函數:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)

成功返回 0

參數含義

irq 中斷號
handler 中斷處理函數
flags 中斷標誌  
 
 
name 中斷名字,設置以後可以在/proc/interrupts 文件中看到對應的中斷名字
 
dev  如果將 flags 設置爲 IRQF_SHARED 的話, dev 用來區分不同的中斷,一般情況下將
dev 設置爲設備結構體, dev 會傳遞給中斷處理函數 irq_handler_t 的第二個參數
 
   

釋放:void free_irq(unsigned int irq, void  *dev);


 

中斷處理函數格式:irqreturn_t (*irq_handler_t) (int, void *)

第一個參數是要中斷處理函數要相應的中斷號。第二個參數是一個指向 void 的指針,也就
是個通用指針,需要與 request_irq 函數的 dev 參數保持一致。用於區分共享中斷的不同設備,
dev 也可以指向設備數據結構。中斷處理函數的返回值爲 irqreturn_t 類型,例子:

static irqreturn_t rtc_interrupt(int irq, void *dev_id)

激活當前CPU中斷:

local_irq_enable();
禁止當前CPU中斷:

local_irq_disable();
激活指定中斷線:

void enable_irq(unsigned int irq);
禁止指定中斷線:

void disable_irq(unsigned int irq);
禁止指定中斷線:

void disable_irq_nosync(unsigned int irq);
注:此函數調用irq_chip中disable禁止指定中斷線,所以不會保證中斷線上執行的中斷服務程序已經退出。
 

2、中斷上下半部

這裏重點關注:Tasklet

2.1下半部定義和初始化

DECLARE_TASKLET(name, func, data)
其中 name 爲要定義的 tasklet 名字,這個名字就是一個 tasklet_struct 類型的時候變量, func
就是 tasklet 的處理函數, data 是傳遞給 func 函數的參數。

2.2下半部函數調用

在上半部,也就是中斷處理函數中調用 tasklet_schedule 函數就能使 tasklet 在合適的時間運
行, tasklet_schedule 函數原型如下:
void tasklet_schedule(struct tasklet_struct *t)
函數參數和返回值含義如下:
t:要調度的 tasklet,也就是 DECLARE_TASKLET 宏裏面的 name。

 

 

3、設備樹裏的中斷信息
 

3.1實例分析:I.MX6ULL 的中斷控制器節點,節點內容如下所示

1 intc: interrupt-controller@00a01000 {
2 compatible = "arm,cortex-a7-gic";
3 #interrupt-cells = <3>;
4 interrupt-controller;

5 reg = <0x00a01000 0x1000>,
6 <0x00a02000 0x100>;
7 };
 

第 2 行, compatible 屬性值爲“arm,cortex-a7-gic”在 Linux 內核源碼中搜索“arm,cortex-a7-
gic”即可找到 GIC 中斷控制器驅動文件。
第 3 行, #interrupt-cells 和#address-cells、 #size-cells 一樣。表示此中斷控制器下設備的 cells
大小,對於設備而言,會使用 interrupts 屬性描述中斷信息, #interrupt-cells 描述了 interrupts 屬性的 cells 大小,也就是一條信息有幾個 cells。每個 cells 都是 32 位整形值,對於 ARM 處理的
GIC 來說,一共有 3 個 cells,這三個 cells 的含義如下:
第一個 cells:中斷類型, 0 表示 SPI 中斷, 1 表示 PPI 中斷。
第二個 cells:中斷號,對於 SPI 中斷來說中斷號的範圍爲 0~987,對於 PPI 中斷來說中斷
號的範圍爲 0~15。
第三個 cells:標誌, bit[3:0]表示中斷觸發類型,爲 1 的時候表示上升沿觸發,爲 2 的時候
表示下降沿觸發,爲 4 的時候表示高電平觸發,爲 8 的時候表示低電平觸發。 bit[15:8]爲 PPI 中
斷的 CPU 掩碼。

第 4 行, interrupt-controller 節點爲空,表示當前節點是中斷控制器
3.2實例分析:I.MX6ULL 的中斷控制器節點,節點內容如下所示

1 gpio5: gpio@020ac000 {
2 compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
3 reg = <0x020ac000 0x4000>;
4 interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
5 <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
6 gpio-controller;
7 #gpio-cells = <2>;
8 interrupt-controller;
9 #interrupt-cells = <2>;
10 };第 4 行, interrupts 描述中斷源信息,對於 gpio5 來說一共有兩條信息,中斷類型都是 SPI,
觸發電平都是 IRQ_TYPE_LEVEL_HIGH。不同之處在於中斷源,一個是 74,一個是 75,打開
可以打開《IMX6ULL 參考手冊》的“Chapter 3 Interrupts and DMA Events”章節,找到表 3-1,
有如圖 50.1.3.1 所示的內容:

 

 

圖 50.1.3.1 中斷表
從圖 50.1.3.1 可以看出, GPIO5 一共用了 2 箇中斷號,一個是 74,一個是 75。其中 74 對
應 GPIO5_IO00~GPIO5_IO15 這低 16 個 IO, 75 對應 GPIO5_IO16~GPIOI5_IO31 這高 16 位 IO。
第 8 行, interrupt-controller 表明了 gpio5 節點也是個中斷控制器,用於控制 gpio5 所有 IO
的中斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章