Controlar los LEDs en Alpine Linux usando la línea de comandos

Hemos desarrollado una placa portadora de Raspberry Pi Compute Module integrada para uso industrial: la PCCB.

pccb-pequeño

Como puede ver, hay tres LEDs (directamente) programables por el usuario en el PCCB: USER / INFO / ACT.

Estos se definen en el árbol de dispositivos. Por ejemplo, podemos definir lo siguiente en nuestra superposición del árbol de dispositivos:

/LEDs
fragment@11 {
   objetivo = ;
   __overlay__ {
     led_act: ledact {
       label = "myledact";
       gpios = ;
       linux,por defecto-disparador = "mmc0";
     };
     led_info: ledinfo {
       label = "myledinfo";
       gpios = ;
       linux,default-trigger = "cpu";
     };
     led_user: leduser {
       label = "myleduser";
       gpios = ;
       linux,default-trigger = "heartbeat";
     };
   };
};

imagen

El archivo fuente de la superposición del árbol de dispositivos (.dts) tendrá que ser compilado, y dará lugar a un archivo .dtbo.

imagen

Este archivo se incluye como una superposición en el config.txt (en nuestro caso en realidad se incluye en un subfichero, usercfg.txt que se incluye desde el config.txt)

# Superposición de la placa portadora de control Pi
dtoverlay=pi-control-carrier-board

Esto le dirá al sistema operativo VideoCore que se carga primero que pase el árbol de dispositivos para el modelo de Pi en particular, incluyendo nuestra superposición al kernel de Linux.

¿Qué es un árbol de dispositivos?

Los dispositivos ARM son cada vez más personalizados y diversos en comparación con los dispositivos x86 estándar, que tenían componentes estandarizados.

Para evitar recompilar el kernel y tener que adaptar cada hardware modificado, se ideó un sistema de descripción de la disposición del hardware al kernel de Linux.

El árbol de dispositivos.

Es un concepto independiente del sistema operativo, ya que se carga en el Kernel del mismo. Cualquier sistema operativo que lo desee puede soportarlo.

El kernel de Linux recibirá el árbol de dispositivos y, por tanto, sabrá qué dispositivo está presente, cómo está conectado y cómo hablar con él (los controladores se cargan en función de las pistas del árbol de dispositivos, por ejemplo).

Como una Raspberry Pi no es un hardware estático, sino que viene en diferentes configuraciones y puede exponer diferentes pines, por ejemplo, y también tener diferentes complementos (HATs), se requería un complemento adicional: las superposiciones del árbol de dispositivos.

Estos archivos permiten modificar el árbol de dispositivos, sin tener que tener un nuevo árbol de dispositivos individual para cada combinación posible de hardware que se puede conectar a la Pi / configurar la Pi a.

¿Cómo puedo controlar los LEDs?

Estos LEDs se encenderán en el sistema, en el /sys/class/leds directorio:

imagen

¡Como puedes ver, aquí se exponen un total de cuatro LEDs, tres de los cuales (myledact, myledinfo, myleduser) fueron añadidos por nosotros usando la superposición!

Cada uno de estos LEDs es un directorio en sí mismo,

imagen

que le da el control sobre el LED.

Recuerda que en Linux todo es un archivo / hablar con el kernel se abstrae a hacer operaciones en el sistema de archivos (en realidad es un paradigma de UNIX).

Ejecutar

gatillo para gatos

para el LED.

Le mostrará una lista de los activadores que se pueden establecer para él:

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

Observe que el último disparador, mmc0 está entre corchetes. ¡Esto es lo que el LED está configurado actualmente!

Puedes intentar configurarlo en cualquiera de los otros disparadores escribiendo este disparador en el LED (si tienes suficientes derechos Sonrisa):

echo "timer" > trigger

Hará que el LED parpadee.

Tenga en cuenta que si ahora vuelve a listar el directorio de control de los LEDs, verá entradas adicionales - nueva funcionalidad que se expone para el modo temporizador:

imagen

delay_off y delay_on

cat delay_off

produce 500. Son 500 milisegundos.

Puedes ajustar estos valores para que el LED parpadee más rápido, por ejemplo:

echo "150" > delay_off

echo "150" > delay_on

O más lento...

echo "1500" > delay_on

echo "1500" > delay_off

Un par de desencadenantes dignos de mención:

  • ninguno: no hay actividad en el LED
  • mmc0: se activa si se accede a la Flash / microSD
  • cpu: se activa con la actividad de la CPU (es bueno para monitorear qué tan ocupada está la CPU, ya que será más tenue si hay menos actividad de la CPU, gracias a una especie de PWM)
  • heartbeat: dará un patrón de parpadeo constante para mostrar que el Pi sigue vivo y el kernel sigue en línea y haciendo su trabajo.

¿Controlar el GPIO del LED desde mi propio código?

Para controlar los LEDs desde tu propio código, utilizando las librerías GPIO, pon el trigger en "none".

echo "none" > trigger

Todavía se puede encender y apagar desde la línea de comandos, escribiendo en el brillo (1 para encenderlo, 0 para apagarlo):

echo "1" > brillo

echo "0" > brillo

Ahora puedes controlar un LED desde la línea de comandos Sonrisa Y has aprendido algo sobre los árboles de dispositivos y las superposiciones de árboles de dispositivos, ¡felicidades!

Referencias: