Domanda

Sto lavorando con l'albero del dispositivo del kernel Linux e a prima vista sembra esserci una funzionalità mancante per i nodi con più genitori di interrupt. Ho un autista che controlla una scheda incorporata del braccio personalizzato, prende le Gpios e gli interrupt PIN da più genitori di interrupt GPIO e gestisce la batteria su batteria a bordo, iRQ a bassa tensione, reset_pending IRQ, ecc.

Ho trovato una fonte in cui qualcuno sembra aver violato in funzionalità aggiuntive per affrontare questo, ma che non è ufficiale e implica la modifica dei file di origine di interrupt che non voglio. La modifica ha aggiunto il supporto per un termine chiamato "interrupt esteso" come questo. Qui il genitore di interrupt è specificato nelle tuple.

    #interrupt-cells = <2>;
    interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */
.

Non ho trovato alcun mezzo o esempio di come utilizzare la proprietà di interruzione della mappa per ottenere una semplice mappatura di interrupt GPIO, quindi sono in perdita lì.

Se stavo usando solo un singolo genitore di interrupt GPIO il modo giusto per farlo sarebbe come questo.

interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;
.

Ma questo consente solo dichiarare one Genitore di interrupt con interrupt multipli specificati in "interrupt" e devono appartenere tutti al genitore specificato. Sto usando 2 Genitori di interrupt, GPIO7 e GPIO3.

Qual è il modo corretto per implementare più interrupt con diversi genitori di interrupt in un singolo nodo dispositivo nell'albero del dispositivo?

È stato utile?

Soluzione

Non so se funziona per i genitori di interrupt GPIO, ma per altri tipi di controller di interruzione, si utilizza la proprietà 'interrupt-map' e specificare l'elenco degli interrupt utilizzando fianchi a ciascuno dei controller separati.Ecco un esempio che ho visto dove il conducente aveva bisogno di 3 interrupt, 2 dal controller 'INTC' e 1 dal controller 'SPMI':

interrupts = <0 1 2>;
interrupt-map = <0 &intc 0 134 0
                 1 &intc 0 140 0
                 2 &spmi 0 0x9 0 0>;
interrupt-names = "core_irq", "async_irq", "pmic_id_irq";
interrupt-map-mask = <0 0 0 0>;
.

In questo esempio, il nodo INTC ha avuto un valore # di cellule di interruzione del # di <3> e il nodo SPMI ha avuto un valore # di cellule di interruzione del numero di 4 (il che significa che molti argomenti necessari per essere utilizzati con le loro rispettive fende). .

Il campo Nomi di interrupt è facoltativo, ma consente di richiedere l'IRQ per nome anziché per numero nel codice (ad esempio, utilizzare piattaforma_get_irq_byname (), invece di piattaforma_get_irq ())

Per essere onesti, sono un po 'insicuro quale sia usato la maschera di interruzione-mappa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top