LED's aansturen op Alpine Linux met de opdrachtregel

Wij hebben een ingebedde Raspberry Pi Compute Module draagkaart voor industrieel gebruik ontwikkeld: de PCCB.

pccb-klein

Zoals u kunt zien, zijn er drie (direct) door de gebruiker programmeerbare LED's op de PCCB: USER / INFO / ACT.

Deze worden gedefinieerd in de apparaatboom. We kunnen bijvoorbeeld het volgende definiëren in onze apparaatboom overlay:

//LED's
fragment@11 {
   doel = ;
   __overlay__ {
     led_act: ledact {
       label = "myledact";
       gpios = ;
       linux, standaard-trigger = "mmc0";
     };
     led_info: ledinfo {
       label = "myledinfo";
       gpios = ;
       linux, standaard-trigger = "cpu";
     };
     led_user: leduser {
       label = "myleduser";
       gpios = ;
       linux, standaard-trigger = "heartbeat";
     };
   };
};

afbeelding

Het "device tree overlay" bronbestand (.dts) moet gecompileerd worden, en zal een .dtbo bestand opleveren.

afbeelding

Dit bestand is opgenomen als een overlay in de config.txt (in ons geval is het eigenlijk opgenomen in een subbestand, usercfg.txt dat is opgenomen in de config.txt)

# Pi Control Carrier Board Overlay
dtoverlay=pi-control-carrier-board

Dit vertelt het VideoCore OS dat als eerste wordt geladen om de apparaatstructuur voor het specifieke Pi model inclusief onze overlay door te geven aan de Linux kernel.

Wat is een boomstructuur?

ARM-apparaten zijn steeds meer op maat gemaakt en gevarieerder geworden in vergelijking met standaard x86-apparaten met gestandaardiseerde componenten.

Om te voorkomen dat de kernel opnieuw gecompileerd moest worden en elke gewijzigde hardware moest worden aangepast, werd een systeem bedacht om de hardware-layout aan de Linux-kernel te beschrijven.

De boomstructuur van het apparaat.

Het is een OS-onafhankelijk concept, aangezien het in de OS-kernel wordt geladen. Elk besturingssysteem dat dat wenst, kan het ondersteunen.

De Linux kernel ontvangt de device tree, en weet dus welk apparaat aanwezig is, hoe het verbonden is, en hoe ermee te praten (drivers worden bijvoorbeeld geladen afhankelijk van hints in de device tree).

Aangezien een Raspberry Pi geen statische hardware is, maar in verschillende configuraties komt en bijvoorbeeld verschillende pinnen kan blootstellen, en ook verschillende add-ons (HATs) kan hebben, was een extra add-on nodig: device tree overlays.

Met deze bestanden kunt u de apparaatstructuur wijzigen, zonder dat u een nieuwe apparaatstructuur moet maken voor elke mogelijke combinatie van hardware die u op de Pi kunt aansluiten / waarmee u de Pi kunt configureren.

Hoe bedien ik de LED's?

Deze LED's zullen oplichten in het systeem, in de /sys/class/leds map:

afbeelding

Zoals u kunt zien, zijn hier in totaal vier LED's zichtbaar, waarvan er drie (myledact, myledinfo, myleduser) door ons zijn toegevoegd met behulp van de overlay!

Elk van deze LED's is een directory op zich,

afbeelding

die u controle geeft over de LED.

Vergeet niet dat in Linux alles een bestand is / praten met de kernel is geabstraheerd tot het uitvoeren van operaties op het bestandssysteem (het is eigenlijk een UNIX paradigma).

Run

kattentrekker

voor de LED.

Het zal u een lijst tonen van de triggers die ervoor kunnen worden ingesteld:

geen rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrllock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic [mmc0]

Merk op dat de laatste trigger, mmc0 tussen vierkante haken staat. Dit is waar de LED momenteel op is ingesteld!

Je kunt proberen het op een van de andere triggers te zetten door deze trigger naar de LED te schrijven (als je voldoende rechten hebt Glimlach):

echo "timer" > trigger

Zal de LED laten knipperen.

Merk op, als je nu de LED control directory opnieuw opsomt, zie je extra items - nieuwe functionaliteit die is vrijgegeven voor de timer mode:

afbeelding

delay_off en delay_on

cat delay_off

levert 500 op. Dat zijn 500 milliseconden.

U kunt deze waarden aanpassen om de LED bijvoorbeeld sneller te laten knipperen:

echo "150" > delay_off

echo "150" > delay_on

Of langzamer...

echo "1500" > delay_on

echo "1500" > delay_off

Een paar opmerkelijke triggers:

  • geen: er is geen activiteit op de LED
  • mmc0: is actief als de Flash / microSD wordt benaderd
  • cpu: is actief met CPU-activiteit (leuk om te zien hoe druk de CPU het heeft, want het wordt een beetje zwakker als er minder CPU-activiteit is, dankzij effectief een soort PWM)
  • heartbeat: geeft een constant knipperpatroon om aan te geven dat de Pi nog leeft en dat de kernel nog online is en zijn werk doet.

De GPIO van de LED besturen vanuit mijn eigen code?

Om de LEDs vanuit uw eigen code aan te sturen, met behulp van GPIO bibliotheken, zet u de trigger op "none".

echo "none" > trigger

U kunt het nog steeds aan- en uitzetten vanaf de commandoregel, door naar helderheid te schrijven (1 om het aan te zetten, 0 om het uit te zetten):

echo "1" > helderheid

echo "0" > helderheid

Nu ben je in staat om een LED te bedienen vanaf de commandoregel Glimlach En je hebt iets geleerd over apparaatbomen en apparaatboom overlays, gefeliciteerd!

Referenties: