Forum: PC-Programmierung Emb. Linux => add LED to sys/class/leds


von Jasson J. (jasson)


Lesenswert?

Hallo zusammen,

>Vorhaben:
Ich versuche an einem Embedded Linux Eval Board, einem phyBoard-Wega 
AM335x - eine LED im Userspace ein zu blenden in
sys/class/leds

>Bisherige Suche
Ich habe natürlich gesucht und etwas ähnliches auf einem anderen Board 
gefunden
https://elinux.org/EBC_Exercise_17_Switching_a_GPIO_to_an_LED
Da wird in einem .dtsi File (da weiß ich, was das ist) das bestehende 
LED-Listig kurzerhand mit "led6" erweitert.
1
leds { 
2
  pinctrl-names = "default";
3
  pinctrl-0 = <&user_leds_s0>; 
4
  compatible = "gpio-leds";
5
...
6
...
7
  led6 {
8
    label = "red:indicator";
9
    gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
10
    linux,default-trigger = "heartbeat";
11
    default-state = "off";
12
  };

>was ich vermute
compatible = "gpio-leds"; ist wahrscheinlich wie ich aus dem Dokufile 
"leds-class.rst" entnommen habe die Angabe, dass die Einträge des 
LED-Blocks  dem "Typ" led-class entsprechen und dadurch beim bauen 
automatisch in class/leds landen.

>Was mir nicht klar ist
1)
Welche funktionale Rolle spielen
>>pinctrl-names = "default";
>>pinctrl-0 = <&user_leds_s0>;
und woher deren parameter kommen

2)
>&gpio1
Ist die Refrenz zum GPIO-Controller.
In der .dtsi-#include-Kette von meinem Board ist keiner zu finden. Ich 
habe Unterlagen, wo einer passend zu meinem Board beschrieben ist (siehe 
unten), nur mir ist nicht klar wohin damit und vor allem, ob er von 
weiteren #includes aus meinem buildordner 
/linux6.1.30/include/dt-bindings abhängt.

Vielen Dank, wenn mir jemand helfen kann :>

>der GPIO controller
1
#address-cells = <1>;
2
#size-cells = <1>;
3
4
gpio2: gpio@481ac000 {
5
   reg = <0x481ac000 0x1000>;
6
   compatible = "ti,omap4-gpio";
7
8
    ti,hwmods = "gpio3";
9
    gpio-controller;
10
    #gpio-cells = <2>;
11
    interrupt-controller;
12
    #interrupt-cells = <2>;
13
    interrupts = <32>;
14
};

: Bearbeitet durch User
von Wendels B. (wendelsberg)


Lesenswert?

Das darunterliegende System heisst Device-Tree.
Vielleicht findest Du ja da mehr Info.

Hier habe ich noch ein paar Basics gefunden:
https://elinux.org/images/f/f9/Petazzoni-device-tree-dummies_0.pdf

von N. M. (mani)


Lesenswert?


von Jasson J. (jasson)


Lesenswert?

@wendelsberg : ja, da bin ich gestern vorbeigekommen, konnte aber nicht 
explizit meine gesuchte Information herausziehen

@mani : aus dem Inhalt des Links lese ich das raus, was ich oben 
beschrieb - das das  - compatible = "gpio-leds"; - dafür sorgt, dass die 
Nodes "led0"; "led1" dann in sys/class/leds zu finden sein müssten ?

Ansonsten schaffe ich es nicht, meinen Gedankengang zu verifizieren, um 
verstehen, ob ein Versuch funktionieren kann oder nicht.
-
Wirklich verstanden habe ich nur, dass ein "gpio-leds"-kompatibler node 
eine Refrenz auf einen GPIO-Controller braucht.
Daher neige ich zu dem experiment, mein som.dtsi file zu erweitern mit
1
gpioCtrler: gpio@481ac000 {
2
   reg = <0x481ac000 0x1000>;
3
   compatible = "ti,omap4-gpio";
4
    ti,hwmods = "gpio3";
5
    gpio-controller;
6
    #gpio-cells = <2>;
7
    interrupt-controller;
8
    #interrupt-cells = <2>;
9
    interrupts = <32>;
10
};
11
12
#include <dt-bindings/gpio/gpio.h>
13
#include <dt-bindings/leds/common.h>
14
leds {
15
      compatible = "gpio-leds";
16
      led0 {
17
             gpios = <&gpioCtrler <pinNbr> GPIO_ACTIVE_LOW>;
18
  };
19
};

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

1. es reicht eine LED einzurichten und die vorhandenen gpio-Blöcke zu 
verwenden. Auf keinen Fall einen eigenen gpioCtrler: gpio@481ac000 
setzen! Das kann alles mögliche andere durcheinanderbringen. Alle im 
am3358 vorhandenen controller sind in am33xx-l4.dtsi sauber und getestet 
vordefiniert und das sollte in der include-Kette vorkommen.
2. es gibt mehrere GPIO-Bänke und man muss die richtige wählen, zu dem 
die LED gehört.
3. das mit pinctrl steuert die Pins, ob sie Input, Output, Active 
High/Low sind und ggf. einen Pull-Up haben. Oder ob sie z.B. PWM sind 
(sofern der Pin das kann) oder noch eine andere Funktion haben.
Da musst Du noch den entsprechenden Pin suchen und durch eine (neue?) 
Zeile einstellen.
4. compatible = "gpio-leds" sagt dem Kernel dass es einen Treiber 
laden/benutzen soll, der einen entsprechenden Eintrag im Source-Code 
hat.

Daher ist das Beispiel bei elinux dem am nächsten was Du brauchst.

: Bearbeitet durch User
von Jasson J. (jasson)


Lesenswert?

@hns
okay, danke für die detailierte Antwort!
-
am33xx-l4.dtsi habe ich gefunden und es gibt vier Einträge á la
>gpio'n': gpio'n' {
mit angegebenen gpio-ranges
1
gpio-ranges = <&am33xx_pinmux  0  82  8>,
2
              <&am33xx_pinmux  8  52  4>,
3
              ....

In /documentation/devicetree/bindings/gpio/gpio.txt
ist ein Beispiel mit <&pinctrl1 0 20 10> und erklärt, wie man
die Zahlen intepretieren muss - entsprechend meinem Level ist mir
jetzt nicht klar, warum in 'meinem' l4.dtsi statt &pinctrl'n'
'&am33xx_pinmux' verwendet wird und ob das bei der Interpretation
der Parameter eine Rolle spielt.
(Obwohl ich vermute, dass es keine Rolle spielt)

D.h. für die Definition der led-Notes würde ich machen
(wenn ich an Pin2 von Controller-0 eine LED habe)
1
#include <dt-bindings/gpio/gpio.h>
2
#include <dt-bindings/leds/common.h>
3
leds {
4
      compatible = "gpio-leds";
5
      led0 {
6
             gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
7
  };
8
};

: Bearbeitet durch User
von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Lesenswert?

Jasson J. schrieb:
> @hns
> okay, danke für die detailierte Antwort!

Gerne.

> -
> am33xx-l4.dtsi habe ich gefunden und es gibt vier Einträge á la
>>gpio'n': gpio'n' {
> mit angegebenen gpio-ranges
>
1
> gpio-ranges = <&am33xx_pinmux  0  82  8>,
2
>               <&am33xx_pinmux  8  52  4>,
3
>               ....
4
>
>
> In /documentation/devicetree/bindings/gpio/gpio.txt
> ist ein Beispiel mit <&pinctrl1 0 20 10> und erklärt, wie man
> die Zahlen intepretieren muss - entsprechend meinem Level ist mir
> jetzt nicht klar, warum in 'meinem' l4.dtsi statt &pinctrl'n'
> '&am33xx_pinmux' verwendet wird

Das liegt wohl daran dass gpio.txt ganz allgemein für alle Chips und 
Architekturen gilt. Da kann es Unterschiede geben.

> und ob das bei der Interpretation
> der Parameter eine Rolle spielt.
> (Obwohl ich vermute, dass es keine Rolle spielt)
>
> D.h. für die Definition der led-Notes würde ich machen
> (wenn ich an Pin2 von Controller-0 eine LED habe)
>
1
> #include <dt-bindings/gpio/gpio.h>
2
> #include <dt-bindings/leds/common.h>
3
> leds {
4
>       compatible = "gpio-leds";
5
>       led0 {
6
>              gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
7
>   };
8
> };
9
>

Ja, das sieht gut aus! Für Tests würde ich noch den Heartbeat einbauen, 
dann sollte es gleich nach dem Booten blinken.

von Jasson J. (jasson)


Lesenswert?

@hns

Mir ist etwas in "meinem" am33xx--l4.dtsi aufgefallen, das ich 
merkwürdig finde - die Registeradresse vom GPIO-Controller ist 0
>reg = <0x0 0x1000>;
>         ^
1
gpio3: gpio@0 {
2
  compatible = "ti,omap4-gpio";
3
  gpio-ranges =  <&am33xx_pinmux  0  66 5>,
4
      <&am33xx_pinmux  5  98 2>,
5
      <&am33xx_pinmux  7  75 2>,
6
      <&am33xx_pinmux 13 141 1>,
7
      <&am33xx_pinmux 14 100 8>;
8
  gpio-controller;
9
  #gpio-cells = <2>;
10
  interrupt-controller;
11
  #interrupt-cells = <2>;
12
  reg = <0x0 0x1000>;
13
  interrupts = <62>;

Hast du einen Hinweis für mich was der Hintergrund ist?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.