2015-12-20 3 views
6

Was ist verkettetes IRQ? Was macht chained_irq_enter und chained_irq_exit, weil, nachdem ein Interrupt aufgetreten ist, die IRQ-Leitung deaktiviert ist, aber chained_irq_enter Aufrufe von Funktionen im Zusammenhang mit Maskierung Interrupts. Wenn die Leitung bereits deaktiviert ist, warum den Interrupt maskieren?Was ist in Linux verkettet irq, wann müssen sie verwendet werden?

+0

Es ist die Fortsetzung von [this] (http://stackoverflow.com/questions/34371352/what-are-linux-irq-domains-why-are-they-needed) Frage. –

+0

Der nächste Teil ist [hier] (http://stackoverflow.com/questions/34391340/when-we-use-irq-set-chained-handler-the-irq-line-will-be--disabled-or-not/ 34426034 # 34426034). –

Antwort

2

lesen Linux Kernel-Dokumentation selbst für das Verständnis dieser APIs:

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

  • CHAINED GPIO irqchips: Das ist in der Regel der Typ, der auf ein SoC eingebettet ist. Dies bedeutet, dass es einen schnellen IRQ-Handler für die GPIOs gibt, der in einer Kette vom übergeordneten IRQ-Handler aufgerufen wird, am typischsten der System-Interrupt-Controller. Dies bedeutet, das GPIO irqchip registriert Verwendung irq_set_chained_handler() oder die entsprechenden gpiochip_set_chained_irqchip() Helferfunktion und der handler irqchip GPIO wird sofort von der Mutter irqchip genannt werden, während der IRQs behinderte halten. Die GPIO irqchip wird dann am Ende ruft etwas wie diese Sequenz in seinen Interrupt-Handler:

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

was irq gekettet ist?

Es gibt zwei Ansätze, wie in IRQ-Handler von parent (Interrupt Controller) Gerät für die Kinder Geräte Interrupt-Handler aufrufen.

  1. Verkettete Interrupts:

    • „angekettet“ bedeutet, dass solche Interrupts gerade Kette von Funktionsaufrufe sind (beispielsweise SoCs GPIO Modul Interrupthandler von GIC bezeichnet Handler unterbrechen wird, nur als eine Funktion Anruf)
    • generic_handle_irq() für Interrupts verwendet wird Verkettungs
    • Kind IRQ-Handler innerhalb des übergeordneten HW IRQ-Handler
    • genannt werden, können Sie nicht anrufen Funktionen, die in Ketten (Kind) schlafen können Interrupt-Handler, weil sie noch in Atom Kontext (HW-Interrupt)
    • dieser Ansatz häufig in Treiber verwendet wird, für SoC internen GPIO Module
  2. Nested Interrupts

    sind
    • "verschachtelt" bedeutet, dass diese Interrupts durch einen anderen Interrupt unterbrochen werden können; aber sie sind nicht wirklich HW IRQs, sondern Gewinde IRQs
    • handle_nested_irq() ist für die Erstellung von verschachtelten Interrupts
    • Kind IRQ-Handler verwendet werden, um innerhalb der neuen Thread aufgerufen von handle_nested_irq() Funktion erstellt; wir brauchen sie in Prozesskontext, ausgeführt werden, so dass wir schlafen Bus-Funktionen (wie I2C-Funktionen, die schlafen können) aufrufen können
    • Sie in der Lage sind Funktionen aufrufen, die innerhalb von verschachtelten (Kind) schlafen können Interrupt-Handler
    • dieser Ansatz ist in Treiber für externe Chips, wie GPIO expanders häufig verwendet, da sie in der Regel zu SoC über I2C-Bus angeschlossen sind, und I2C Funktionen

Apropos Fahrer oben diskutiert schlafen kann:

  • irq-gic Treiber verwendet CHAINED GPIO irqchips Ansatz für die Handhabung von Systemen mit mehreren GICs; this commit fügt diese Funktionalität hinzu
  • gpio-omap Treiber (oben erwähnt) verwendet GENERIC CHAINED GPIO irqchips Ansatz. Siehe this commit. Es wurde aus mit regulären umgewandelt CHAINED GPIO irqchips so dass auf Echtzeit-Kernel wird es IRQ-Handler fädelt, aber auf nicht-RT-Kernel wird es schwer IRQ-Handler
  • 'GPIO-max732x' Fahrer sein verwenden NESTED THREADED GPIO irqchips Ansatz

was

hat chained_irq_enter und chained_irq_exit tun

Diese Funktionen Hardware-Interrupt-Flusssteuerung, dh anmelde Interrupt-Controller-Chip, wenn zu maskieren und demaskieren Stromunterbrechungs implementieren.

  1. Für FastEOI Interrupt-Controller (modernste Art und Weise):

    • chained_irq_enter() nichts tun
    • chained_irq_exit() Anrufe irq_eoi() Rückruf, um den Interrupt-Controller zu sagen, dass Interrupt-Verarbeitung wird
    • beendet
  2. Für Interrupt-Controller mit Masken-/Unmask/Ack-Fähigkeiten

    • chained_irq_enter() Masken Stromunterbrechungs und erkennt es, wenn ack Rückruf als auch
    • chained_irq_exit() demaskiert
gesetzt unterbrechen

weil nach einer Unterbrechung der IRQ-Leitung deaktiviert arised ist, aber chained_irq_enter ruft Funktionen zum Maskieren von Interrupts auf, wenn die Leitung bereits deaktiviert ist, warum den Interrupt maskieren?

Die IRQ-Leitung ist deaktiviert. Aber wir müssen am Ende der Interrupt-Verarbeitung immer noch in das EOI-Register schreiben. Oder senden Sie ACK für Interrupts auf Edge-Ebene.

This erklärt, warum Interrupts in Interrupt-Handler deaktiviert sind.

Verwandte Themen