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?
Antwort
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(...);
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.
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
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 verwendetCHAINED GPIO irqchips
Ansatz für die Handhabung von Systemen mit mehreren GICs; this commit fügt diese Funktionalität hinzugpio-omap
Treiber (oben erwähnt) verwendetGENERIC CHAINED GPIO irqchips
Ansatz. Siehe this commit. Es wurde aus mit regulären umgewandeltCHAINED 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
hatchained_irq_enter
undchained_irq_exit
tun
Diese Funktionen Hardware-Interrupt-Flusssteuerung, dh anmelde Interrupt-Controller-Chip, wenn zu maskieren und demaskieren Stromunterbrechungs implementieren.
Für FastEOI Interrupt-Controller (modernste Art und Weise):
chained_irq_enter()
nichts tunchained_irq_exit()
Anrufeirq_eoi()
Rückruf, um den Interrupt-Controller zu sagen, dass Interrupt-Verarbeitung wird beendet
Für Interrupt-Controller mit Masken-/Unmask/Ack-Fähigkeiten
chained_irq_enter()
Masken Stromunterbrechungs und erkennt es, wenn ack Rückruf als auchchained_irq_exit()
demaskiert
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.
Es ist die Fortsetzung von [this] (http://stackoverflow.com/questions/34371352/what-are-linux-irq-domains-why-are-they-needed) Frage. –
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). –