Controllare i LED su Alpine Linux usando la linea di comando

Abbiamo sviluppato una scheda carrier Raspberry Pi Compute Module embedded per uso industriale: il PCCB.

pccb-small

Come potete vedere, ci sono tre LED (direttamente) programmabili dall'utente sul PCCB: USER / INFO / ACT.

Questi sono definiti nell'albero dei dispositivi. Per esempio, possiamo definire quanto segue nella nostra sovrapposizione dell'albero dei dispositivi:

//LED
frammento@11 {
   target = ;
   __overlay__ {
     led_act: ledact {
       label = "myledact";
       gpios = ;
       linux, default-trigger = "mmc0";
     };
     led_info: ledinfo {
       label = "myledinfo";
       gpios = ;
       linux, default-trigger = "cpu";
     };
     led_user: leduser {
       label = "myleduser";
       gpios = ;
       linux, default-trigger = "heartbeat";
     };
   };
};

immagine

Il file sorgente dell'albero dei dispositivi (.dts) dovrà essere compilato e produrrà un file .dtbo.

immagine

Questo file è incluso come una sovrapposizione nel config.txt (nel nostro caso è in realtà incluso in un sottofile, usercfg.txt che è incluso dal config.txt)

# Sovrapposizione della scheda di controllo Pi
dtoverlay=pi-control-carrier-board

Questo dirà al VideoCore OS che viene caricato per primo di passare al kernel Linux l'albero dei dispositivi per quel particolare modello di Pi, compresa la nostra sovrapposizione.

Cos'è un albero dei dispositivi?

I dispositivi ARM sono diventati sempre più personalizzati e diversi rispetto ai dispositivi x86 standard che avevano componenti standardizzati.

Per evitare di ricompilare il kernel e dover far corrispondere ogni singolo hardware modificato, è stato ideato un sistema di descrizione del layout dell'hardware al kernel Linux.

L'albero dei dispositivi.

È un concetto indipendente dal sistema operativo, poiché è caricato nel kernel del sistema operativo. Qualsiasi sistema operativo che lo desideri può supportarlo.

Il kernel Linux riceverà l'albero dei dispositivi, e quindi sa quale dispositivo è presente, come è collegato, e come parlargli (i driver sono caricati a seconda dei suggerimenti nell'albero dei dispositivi, per esempio).

Poiché un Raspberry Pi non è un hardware statico, ma è disponibile in diverse configurazioni e può esporre diversi pin, per esempio, e anche avere diversi add-on (HATs), era necessario un ulteriore add-on: gli overlay dell'albero dei dispositivi.

Questi file permettono di modificare l'albero dei dispositivi, senza dover avere un nuovo albero dei dispositivi individuale per ogni possibile combinazione di hardware che si può collegare al Pi / configurare il Pi.

Come posso controllare i LED?

Questi LED si accendono nel sistema, nel /sys/class/leds directory:

immagine

Come potete vedere, un totale di quattro LED è esposto qui, tre dei quali (myledact, myledinfo, myleduser) sono stati aggiunti da noi usando l'overlay!

Ognuno di questi LED è un elenco a sé stante,

immagine

che ti dà il controllo del LED.

Ricordate, in Linux tutto è un file / parlare con il kernel è astratto per fare operazioni sul filesystem (è in realtà un paradigma UNIX).

Esegui

grilletto del gatto

per il LED.

Vi mostrerà una lista di quali trigger possono essere impostati per esso:

nessuno 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-ctrlock timer oneshot heartbeat backlight gpio cpu0 cpu1 cpu2 cpu3 default-on input panic [mmc0]

Notate che l'ultimo trigger, mmc0 è tra parentesi quadre. Questo è quello su cui il LED è attualmente impostato!

Potete provare a impostarlo su uno qualsiasi degli altri trigger scrivendo questo trigger sul LED (se avete sufficienti diritti Sorriso):

echo "timer" > trigger

Farà lampeggiare il LED.

Nota, se ora elenchi di nuovo la directory di controllo dei LED, vedrai voci aggiuntive - nuove funzionalità che sono esposte per la modalità timer:

immagine

delay_off e delay_on

cat delay_off

produce 500. Questi sono 500 millisecondi.

È possibile regolare questi valori per far lampeggiare più velocemente il LED, per esempio:

echo "150" > delay_off

echo "150" > delay_on

O più lento ...

echo "1500" > delay_on

echo "1500" > delay_off

Un paio di inneschi degni di nota:

  • nessuno: non c'è attività sul LED
  • mmc0: è attivo se si accede alla Flash / microSD
  • cpu: è attivo con l'attività della CPU (bello monitorare quanto è occupata la CPU, in quanto sarà un po' più debole se c'è meno attività della CPU, grazie a una sorta di PWM)
  • heartbeat: darà un modello di lampeggio costante per mostrare che il Pi è ancora vivo e il kernel è ancora online e sta facendo il suo lavoro.

Controllare il LED GPIO dal mio codice?

Per controllare i LED dal vostro codice, usando le librerie GPIO, impostate il trigger su "none".

echo "nessuno" > trigger

Potete ancora accenderlo e spegnerlo dalla linea di comando, scrivendo su brightness (1 per accenderlo, 0 per spegnerlo):

echo "1" > luminosità

echo "0" > luminosità

Ora sei in grado di controllare un LED dalla linea di comando Sorriso E hai imparato qualcosa sugli alberi dei dispositivi e sugli overlay degli alberi dei dispositivi, congratulazioni!

Riferimenti: