2014-05-06 12 views
6

Ho imparato a conoscere gli alberi dei dispositivi Linux e abbiamo cercato di iniziare a eseguire il porting di alcuni dei nostri vecchi codici per utilizzarli. Sto avendo un po 'di problemi con il nodo controller gpio:Guida alla struttura dei dispositivi Linux (controller/interruttori GPIO)

gpio1: [email protected] { 
    #gpio-cells = <2>; 
    compatible = "cavium,octeon-3860-gpio"; 
    reg = <0xc00 0x100>; 
    gpio-controller; 
    /* Interrupts are specified by two parts: 
    * 1) GPIO pin number (0..15) 
    * 2) Triggering (1 - edge rising 
    *    2 - edge falling 
    *    4 - level active high 
    *    8 - level active low) 
    */ 
    interrupt-controller; 
    interrupt-cells = <2>; 
    interrupts = <0 24>, <1 25>, <2 26>, <3 27>; 

};

Sto cercando di mappare determinati IRQ a pin GPIO, tuttavia, sembra che sia sempre il primo a mappare il primo < 0 24> IRQ 24 a gpio pin 0. Ho guardato il codice sorgente e non sembra esso interverrà mai di "interrupt", anche se il file di testo dei collegamenti dell'albero del dispositivo sembra suggerire che sarà (devicetree/bindings/gpio/cavium-octeon-gpio.txt). Qualcuno sa come posso mappare una manciata di interruzioni a diversi pin gpio?

risposta

1

Non ho dimestichezza con la macchina, ma se si guarda qui:

http://www.devicetree.org/Device_Tree_Usage#How_Interrupts_Work

vedrete che gli identificatori di interrupt sono per il controller di interrupt del nodo in cui sono definiti (vale a dire controllore interrupt genitore), e non per il nodo stesso.

Poiché non si sta nemmeno visualizzando dove e se si attiva effettivamente l'interrupt (pin, trigger), presumo che non lo sapessi.

Che aspetto ha il nodo del controller di interruzione di gpio1?

Si aspetta davvero di ricevere più interrupt dalla stessa sorgente nel modulo (pin, irq)? Ad esempio, su am335x, tutti gli interrupt su gpio1 sono mappati su un indice specifico sul controller INTAP OMAP35, ad indicare che solo 1 interrupt è definito nel nodo gpio1, segnalando a INTC se si è verificato o meno un interrupt su gpio1.

4

gestione gpio non è ancora al 100% lo stesso tra le piattaforme, quindi ti darò il succo di esso, e potrebbe essere necessario adattarsi alla piattaforma (trovare un dts che utilizza il SoC stesso o simile). La mia piattaforma è Freescale imx.6 Ecco questo è l'essenza di esso:

Primo: Leave nodo GPIO1 solo. (Probabilmente è impostato correttamente nel dtsi che hai ricevuto dal tuo rivenditore)

Secondo: Se vuoi .e.g. GPIO 1 15 per essere un interrupt, attivo alto nel nodo del dispositivo che si desidera consumare l'interrupt GPIO, aggiungere

interrupt-parent = <&gpio1>; 
interrupts = <15 IRQ_TYPE_LEVEL_HIGH>; 

ad esempio: da arch/braccio/boot/dts/imx6qdl-gw52xx.dtsi

touchscreen: [email protected] { 
     compatible = "eeti,egalax_ts"; 
     reg = <0x04>; 
     interrupt-parent = <&gpio7>; 
     interrupts = <12 2>; 
     wakeup-gpios = <&gpio7 12 GPIO_ACTIVE_LOW>; 
};