Linux系統驅動之兩類中斷控制器處理流程_鏈式和層級

資料下載

無法通過瀏覽器直接訪問coding,必須使用git工具進行下載:

代碼語言:JavaScript 運行次數:0

運行 復制 “`javascript git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git “`

視頻觀看

您可以訪問百問網,觀看有關驅動程序的全套視頻。

兩類中斷控制器處理流程:鏈式和層級

資料下載 視頻觀看

  1. 下級中斷控制器的類別 1.1 鏈式中斷控制器(chained) 1.2 層級中斷控制器(hierarchy)

  2. 鏈式中斷控制器的處理流程

  3. 層級中斷控制器的處理流程

  4. 處理流程對比

在這里插入圖片描述

參考資料:

  • linux kernel的中斷子系統之(七):GIC代碼分析
  • Linux 4.9.88內核源碼 Linux-4.9.88driversgpiogpio-mxc.c
  • Linux 4.9.88內核源碼 Linux-4.9.88archarmbootdtsimx6ull.dtsi
  • Linux 5.4內核源碼 Linux-5.4driverspinctrlstm32pinctrl-stm32mp157.c
  • Linux 5.4內核源碼 Linux-5.4driversirqchipirq-stm32-exti.c
  • Linux 5.4內核源碼 Linux-5.4archarmbootdtsstm32mp151.dtsi
  1. 下級中斷控制器的類別

在后續課程中,我們將GIC之下的中斷控制器分為兩類:鏈式(chained)和層級(hierarchy)。這種分類沒有官方定義,是我們根據代碼概括出來的(Linux內核本來就缺乏文檔)。

Linux系統驅動之兩類中斷控制器處理流程_鏈式和層級

1.1 鏈式中斷控制器(chained)

上圖中,左邊的”chained intc”就是鏈式中斷控制器。當它底下的4個中斷觸發時,都會導致GIC的33號中斷被觸發。處理中斷時,需要分辨是誰觸發了GIC 33號中斷,這需要讀取”chained intc”中的寄存器。

1.2 層級中斷控制器(hierarchy)

上圖中,右邊的”hierarchy intc”就是層級中斷控制器。它底下的4個中斷與GIC中的4個中斷一一對應。處理GIC 100~103號中斷時,不需要讀取”hierarchy intc”的寄存器來分辨是誰觸發了中斷。

  1. 鏈式中斷控制器的處理流程

下圖中:

  • handleA、irq_dataA由GIC驅動提供
  • handleB、irq_dataB由GPIO驅動提供
  • handleC也是GPIO驅動提供

Linux系統驅動之兩類中斷控制器處理流程_鏈式和層級

假設GPIO模塊下有4個引腳,都可以產生中斷,都連接到GIC的33號中斷。GPIO就是一個鏈式中斷控制器,它底下有4個中斷。對于GPIO模塊中0~3這四個hwirq,可以一下子分配4個irq_desc(legacy,老方法),也可以用到時再分配(linear,新方法)。假設這4個irq_desc的序號為100~103,在GPIO domain中記錄(0,100) (1,101)(2,102) (3,103)。

對于KEY,注冊中斷時就是:request_irq(102, …)。

按下KEY時:

  • 程序從GIC中讀取寄存器知道發生了33號中斷,通過GIC irq_domain可以知道virq為17。
  • 處理virq 17號中斷:調用irq_desc[17].handle_irq,即handleB。
  • mask/ack中斷:調用irq_desc[17].irq_data->irq_chip的函數,即irq_dataA。
  • 細分中斷源、處理:讀取GPIO寄存器,確定是GPIO里2號引腳發生中斷。通過GPIO irq_domain可以知道virq為102。
  • 處理virq 102號中斷:調用irq_desc[102].handle_irq,即handleC。
  • mask/ack中斷:調用irq_desc[102].irq_data->irq_chip的函數。
  • 調用irq_desc[102].action鏈表中用戶注冊的函數。
  • unmask中斷:調用irq_desc[102].irq_data->irq_chip的函數。
  • unmask中斷:調用irq_desc[17].irq_data->irq_chip的函數。
  1. 層級中斷控制器的處理流程

下圖中:

  • handleA、irq_dataA由GIC驅動提供
  • irq_dataB由GPIO驅動提供,不需要handleB

Linux系統驅動之兩類中斷控制器處理流程_鏈式和層級

假設GPIO模塊下有4個引腳,都可以產生中斷,分別鏈接到GIC的100~103號中斷。GPIO就是一個層級中斷控制器。對于GPIO模塊中0~3這四個hwirq,分配四個irq_desc,用到時再分配。假設這4個irq_desc的序號為234~237。在GIC domain中記錄(100,234) (101,235)(102,236) (103,237),在GPIO domain中記錄(0,234) (1,235)(2,236) (3,237)。

對于KEY,注冊中斷時就是:request_irq(236, …)。

按下KEY時:

  • 程序從GIC中讀取寄存器知道發生了102號中斷,通過GIC irq_domain可以知道virq為236。
  • 處理virq 236號中斷:調用irq_desc[236].handle_irq,即handleA。
  • mask/ack中斷:調用irq_desc[236].irq_data->irq_chip的函數,即irq_dataB。它會調用父級irq_dataA->irq_chip的函數。
  • 調用irq_desc[236].action鏈表中用戶注冊的函數。
  • unmask中斷:調用irq_desc[236].irq_data->irq_chip的函數,即irq_dataB。它會調用父級irq_dataA->irq_chip的函數。
  1. 處理流程對比

Linux系統驅動之兩類中斷控制器處理流程_鏈式和層級

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享