Emb. Linux => add LED to sys/class/leds

OP #7487568
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

Welche funktionale Rolle spielen

pinctrl-names = "default"; pinctrl-0 = <&user_leds_s0>; und woher deren parameter kommen

&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
};
OP #7487735
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
};
(Firma: Golden Delicious Computers) #7487759
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.

OP #7487802
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
};
(Firma: Golden Delicious Computers) #7487836
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.

OP #7489957
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren