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=<&gpio118GPIO_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.
@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
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.
es gibt mehrere GPIO-Bänke und man muss die richtige wählen, zu dem die LED gehört.
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.
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.
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_pinmux0828>,
2
<&am33xx_pinmux8524>,
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)
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_pinmux0828>,
2
><&am33xx_pinmux8524>,
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=<&gpio02GPIO_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.