2015-12-20 37 views
6

什麼是鏈接IRQ? chained_irq_enterchained_irq_exit是做什麼的,因爲中斷髮生後,IRQ線被禁用,但chained_irq_enter正在調用與屏蔽中斷相關的功能。如果該行已被禁用,爲什麼要屏蔽該中斷?linux中鏈接的irq是什麼,什麼時候需要使用?

+0

它是[this]的延續(http://stackoverflow.com/questions/34371352/what-are-linux-irq-domains-why-are-they-needed)的問題。 –

+0

下一部分是[here](http://stackoverflow.com/questions/34391340/when-we-use-irq-set-chained-handler-the-irq-line-will-be-disabled-or-not/ 34426034#34426034)。 –

回答

2

讀的Linux內核文件本身對於瞭解這些API:

https://www.kernel.org/doc/Documentation/gpio/driver.txt

  • 連鎖式GPIO irqchips:這些通常嵌入在 的SoC類型。這意味着GPIO有一個快速IRQ處理程序,它可以從父IRQ處理程序(最典型的是 系統中斷控制器)中調用 。這意味着GPIO irqchip使用irq_set_chained_handler()或相應的 gpiochip_set_chained_irqchip()輔助函數註冊 ,GPIO irqchip 處理器將立即從父級irqchip調用,而 保持禁用IRQ。然後,GPIO irqchip將最終調用 這樣的順序在中斷服務程序:

    static irqreturn_t tc3589x_gpio_irq(int irq, void *data) 
        chained_irq_enter(...); 
        generic_handle_irq(...); 
        chained_irq_exit(...); 
    
7

什麼是鏈接IRQ?

有兩種方法可以在父級(中斷控制器)設備的IRQ處理程序中爲子設備調用中斷處理程序。

  1. 鏈式中斷:

    • 「鏈接」是指那些中斷只是的函數調用鏈(例如,的SoC GPIO模塊中斷處理程序被從GIC叫中斷處理程序,只是作爲一個功能調用)
    • generic_handle_irq()用於中斷鏈接
    • 孩子IRQ處理程序被稱爲父HW IRQ處理程序的內部
    • 你不能打電話可以在鏈接(孩子)睡眠功能的中斷處理程序,因爲他們仍然在原子上下文(HW中斷)
    • 這種方法在驅動程序通常用於系統芯片內部GPIO模塊
  2. 嵌套中斷

    • 「嵌套」表示這些中斷可以被另一箇中斷中斷;但他們是不是真的HW的IRQ,而是螺紋的IRQ
    • handle_nested_irq()用於創建嵌套中斷
    • 孩子IRQ處理程序被稱爲新線程通過handle_nested_irq()函數創建的內部;我們需要他們在進程上下文下運行,這樣我們就可以稱之爲睡眠總線功能(如可睡I2C功能)
    • 你可以調用,睡眠嵌套(子)的內部功能中斷處理程序
    • 這種方法在外部的芯片,如GPIO擴展驅動程序通常使用的,因爲它們通常通過I2C總線連接到系統芯片,和I2C功能可以休眠上面所討論的驅動器的

說到:

  • irq-gic驅動程序使用CHAINED GPIO irqchips方法處理具有多個GIC的系統; this承諾增加功能
  • gpio-omap驅動程序(上面提到)使用GENERIC CHAINED GPIO irqchips方法。請參閱this提交。這是從使用普通CHAINED GPIO irqchips,這樣的實時內核,將螺紋IRQ處理轉換,但在非RT內核將難以IRQ處理
  • 「GPIO-max732x」驅動程序使用NESTED THREADED GPIO irqchips方法

什麼chained_irq_enterchained_irq_exit

這些功能實現硬件中斷的流量控制,即通知中斷控制器芯片時,掩蓋和揭露當前中斷。

  1. 對於FastEOI中斷控制器(最現代的方式):

    • chained_irq_enter()無能爲力
    • chained_irq_exit()電話irq_eoi()回調告訴中斷控制器,中斷處理結束
  2. 對於具有掩碼/取消屏蔽/確認功能的中斷控制器

    • chained_irq_enter()口罩電流中斷,並承認它,如果ACK回調設置以及
    • chained_irq_exit()未屏蔽的中斷

的中斷arised因爲後IRQ線被禁止,但是chained_irq_enter正在調用與屏蔽中斷相關的函數,如果該行已被禁用,爲什麼要屏蔽該中斷?

IRQ線路被禁用。但是我們仍然需要在中斷處理結束時寫入EOI寄存器。或者發送ACK用於邊沿級中斷。

This解釋了爲什麼中斷在中斷處理程序中被禁用。

相關問題