2014-05-06 9 views
6

Dowiedziałem się o drzewach urządzeń linuksowych i próbowaliśmy zacząć przenosić część naszego starszego kodu, aby z nich korzystać. Mam trochę problemów z węzłem kontrolera gpio:Pomoc do drzewa urządzeń Linuksa (kontroler/przerywniki 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>; 

};

Próbuję odwzorować niektóre przerwania na szpilki GPIO, jednak wygląda na to, że mapował tylko pierwszy. < 0 24> IRQ 24 na gpio pin 0. Spojrzałem na kod źródłowy i nie wygląda na to, będzie on kiedykolwiek interweniował z "przerwaniami", chociaż plik tekstowy powiązań urządzeń wydaje się wskazywać, że będzie (devicetree/bindings/gpio/cavium-octeon-gpio.txt). Czy ktoś wie, jak mogę zmapować garstkę interupcji do różnych pinów gpio?

Odpowiedz

1

nie jestem zaznajomiony z urządzeniem, ale jeśli spojrzeć tutaj:

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

widać, że Specyfikatory przerwań są dla kontrolera przerwań węzła w którym są zdefiniowane (czyli nadrzędny kontroler przerwań), a nie dla samego węzła.

Ponieważ nie pokazuje się nawet, gdzie i czy faktycznie włączono przerwanie (pin, trigger), Zakładam, że tego nie wiesz.

Jak wygląda węzeł kontrolera przerwań w gpio1?

Czy naprawdę oczekuje na otrzymanie wielu przerwań z tego samego źródła w formie (pin, irq)?

Na przykład, w am335x, wszystkie przerwania na gpio1 są odwzorowane na określony indeks w kontrolerze INTC OMAP35, co oznacza, że ​​tylko 1 przerwanie jest zdefiniowane w węźle gpio1, sygnalizując INTC, czy wystąpiło przerwanie w gpio1.

4

Obsługa gpio wciąż nie jest w 100% taka sama pomiędzy platformami, więc przedstawię ci jego sens, a być może będziesz musiał dostosować się do swojej platformy (znajdź dts używającego tego samego lub podobnego SoC). Moja platforma jest Freescale imx.6 Tu jest sedno to:

pierwsze: Leave gpio1 sam węzeł. (Prawdopodobnie jest poprawnie skonfigurowany w dtsi, które otrzymałeś od swojego dostawcy):

Po drugie: Jeśli chcesz .e.g. GPIO 1 15 za przerwanie, aktywny wysoki w węźle urządzenie chcesz spożywać przerwanie GPIO, dodać

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

na przykład: z arch/arm/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>; 
}; 
Powiązane problemy