|
|
|
|
Hallo,
ich spiele gerade mit ein paar VoCores, auf denen openWRT läuft. Da ich noch auf Displays warte, hab ich begonnen einen Inkrementalgeber+Button anzuschließen. Um beides auswerten zu können, möchte ich zwei GPIO-Interrupts verwenden.
Da ich keinen Kerneltreiber schreiben will/kann, nutze ich die GPIOs im Userspace. Die verwendeten GPIOs sind im Userspace verfügbar.
Ich habe das auch zum Laufen gebracht, allerdings mit ner Menge Direktregisterzugriffe am Linux vorbei und ich brauch eure Hilfe um zu verstehen, wie es eigentlich gehen soll.
Soweit konnte ich zwei Probleme ausmachen:
|
Code: |
1. echo falling > /sys/class/gpio/gpioA/edge
2. echo falling > /sys/class/gpio/gpioB/edge
|
|
Aktiviert ist im Controller nur gpioB - immer der zuletzt geschriebene. Aus meiner Sicht wird hier nicht bitweise sondern byteweise in das Register geschrieben - wer genau macht das? Ist da ein Treiber für zuständig?
Zweites Problem:
Wenn ich per Direktzugriff beide Interrupts aktiviere, funktioniert beim ersten Zugriff auch beides: Button oder Inkrementalgeber. Danach jedoch geht nur der Interrupt, der beim ersten Mal der Auslöser war. Wenn ich im Register nachschaue, sehe ich dass $Linuxkomponente das Interrupt-Enable-Register neugeschrieben hat - aber wieder nur mit einem Interrupt enabled. Warum? Wer macht diesen Zugriff?
Mir fehlt leider das Wissen über Linux um rauszubekommen, welche Komponente hier nicht wie erwartet funktioniert - ich hoffe ihr könnt mir helfen
|
|
|
|
|
|
|
Mein Stand:
Dem Devicetree-File nach ist mein GPIO-Interface ein RT5350, kompatibel zu RT2880.
Soweit ich verstehe nutzt Linux die Angaben im Devicetree um den richtigen Treiber zu ermitteln. Ich weiß aber nicht weiter, wie ich diesen Treiber ermitteln kann. Kann mir hier jemand sagen ob zumindest der Weg der richtige ist?
|
|
|
|
|
|
Thema: Brauche Hilfe beim Verständnis von GPIO-Interrupt-Handling |
|