Sun. Jun 26th, 2022

Como característica estándar del kernel de Linux, superposiciones de árbol de dispositivos (DTO) permiten habilitar y configurar fácilmente funciones y controladores, como los que se encuentran en el firmware estándar de un sistema Raspberry Pi. Con estos DTO, es trivial configurar funciones como un botón de apagado suave, activar una fuente de alimentación externa y habilitar controladores para todo, desde un reloj externo en tiempo real (RTC) hasta varias pantallas, sensores y dispositivos de audio, todo sin modificar el sistema operativo o usando scripts personalizados. También es posible agregar sus propios DTO para crear una superposición personalizada que combine varios comandos de DTO en uno solo, o crear un binario de árbol de dispositivo (DTB) personalizado para el hardware de destino. Esencialmente, el kernel de Linux carga este DTB en el arranque para informarle qué dispositivos están conectados y sus ajustes de configuración, muy similar a lo que el componente BIOS con arquitecturas basadas en x86 maneja automáticamente. En última instancia, el concepto DTB y el uso de superposiciones permiten una fácil configuración de tales dispositivos opcionales y configuraciones de pines GPIO, especialmente cuando se configuran a través de un archivo de texto simple como en la plataforma Raspberry Pi SBC.

El árbol de dispositivos de Linux

Lista de archivos que incluyen archivos binarios de árbol de dispositivos (DTB) específicos de la placa para un SBC de Raspberry Pi.Lista de archivos que incluyen archivos binarios de árbol de dispositivos (DTB) específicos de la placa para un SBC de Raspberry Pi. Como se señaló anteriormente, el árbol de dispositivos se compila en un binario que se entrega al kernel en el arranque. En este árbol de dispositivos se encuentra la lista de dispositivos conectados, su controlador y otras configuraciones relevantes. En las plataformas que no usan un sistema similar al BIOS para detectar dispositivos automáticamente, como tarjetas gráficas y tarjetas de red, y para dispositivos que no tienen una opción de detección y configuración automáticas como dispositivos I2C y SPI, el árbol de dispositivos tiene que se construya de esta manera. El uso de un árbol de dispositivos externo de este tipo evita la molestia de volver a compilar el kernel con cada cambio de hardware, con un archivo DTB central para la configuración del dispositivo del sistema, como los que se proporcionan para Raspberry Pi SBC. Volver a compilar este DTB para cualquier dispositivo recién agregado o modificado sería tan complicado como volver a compilar todo el kernel. Aquí es donde entran en juego las superposiciones. Después de que el kernel carga el DTB, se aplican los DTO, según el kernel de Linux documentación sobre DTO. La superposición en sí se especifica como una fuente de árbol de dispositivos, compilada mediante el compilador de árbol de dispositivos en un archivo de superposición binaria de árbol de dispositivos (DTBO). Para la Raspberry Pi estos DTBO puede ser encontrado al igual que los DTB en la cuenta de Raspberry Pi GitHub. sobre el blog bootlin un excelente artículo explica cómo escribir sus propias superposiciones y aplicarlas usando la plataforma BeagleBone Black. Esto muestra cómo cargar DTBO desde el cargador de arranque U-Boot, que es algo proceso más complicado que la que ofrecen otras plataformas. Con Armbian, por ejemplo, los DTO se pueden configurar y cambiar desde el archivo armbianEnv.txt, suponiendo que se use una imagen para una plataforma que apoya Esta característica. Asumiendo que es una función compatible con la imagen de Armbian usada, todo lo que se necesita es editar /boot/armbianEnv.txt para agregar los nombres de superposición necesarios y sus parámetros. Este enfoque recuerda mucho al enfoque elegido en la plataforma Raspberry Pi SBC, con un archivo de texto similar cargado desde /boot/config.txt.

Botón de encendido suave

Interruptor NO momentáneo instalado en una Raspberry Pi 2B. Como un ejemplo simple pero bastante útil de lo que pueden lograr los DTO en los SBC de Raspberry Pi, echemos un vistazo a cómo implementar un botón de encendido y apagado suave usando nada más que una imagen predeterminada del sistema operativo Raspberry Pi, un interruptor momentáneo (normalmente abierto) y algo de cableado para conectar este interruptor a dos pines en el cabezal GPIO, como en la imagen de la derecha. Para que esto funcione, hay dos componentes en juego aquí. El primero se refiere al encendido suave. En las placas Raspberry Pi, cuando la CPU está en estado detenido (encendida, pero la CPU no está funcionando), GPIO3 se mantiene en estado alto debido a una resistencia pull-up externa. Cada vez que GPIO3 baja en este estado, la CPU se reanuda. Esto se logra colocando nuestro interruptor NO en GPIO3 y un pin de tierra (GND). Cuando el sistema entra en estado de detención y presionamos el botón, GPIO3 baja y el sistema se reanuda. Para un apagado suave, necesitamos usar la primera superposición. Dado que también usaremos GPIO3 para apagar el sistema, agregaremos la siguiente superposición de árbol de dispositivos (dtoverlay) a /boot/config.txt: dtoverlay=gpio-shutdown,gpio_pin=3,active_low=1,debounce=1500 El DTO gpio-shutdown se describe en el superposición LÉAME: Nombre: gpio-shutdown Información: Inicia un apagado cuando cambia el pin GPIO. El pin GPIO dado se configura como una clave de entrada que genera eventos KEY_POWER. Este evento es manejado por systemd-logind iniciando un apagado. Si el sistema arranca cuando activamos este evento, actuará como si pulsáramos el botón de “encendido” en un sistema de escritorio, apagando el sistema y deteniendo la CPU. Más allá del número de pin GPIO, también podemos configurar el estado del pin cuando debe activar el evento (aquí cuando se baja), y dado que estamos usando un interruptor mecánico, nos gustaría tener un retraso de rebote incorporado antes del se activa el evento. Por supuesto, dado que podemos configurar el pin GPIO aquí, no necesariamente tenemos que usar GPIO3 aquí, lo que puede ser deseable ya que GPIO3 también es el pin SCL I2C1 (no reasignable), y perder acceso al bus I2C principal podría ser un problema En su lugar, se podría usar otro pin GPIO (como el 17), con la complicación de que usar un solo interruptor momentáneo como en el ejemplo anterior ya no sería posible sin pasar por algunos aros adicionales. Otra superposición interesante relacionada con la energía es la de gpio-poweroff: Nombre: gpio-poweroff Información: Conduce un GPIO alto o bajo en el apagado (incluido el alto). El uso de esta superposición interfiere con la secuencia de apagado normal, lo que impide que el núcleo reinicie el SoC (un paso necesario en un apagado o reinicio normal). Esto también deshabilita la capacidad de activar un arranque al reducir el nivel de GPIO3. Cuando se usa un módulo de suministro de energía externo, esta señal se usa para apagar el SBC y probablemente apague el suministro de energía hasta que otra señal lo despierte nuevamente. Posiblemente, esto podría ser útil en ubicaciones industriales y remotas donde sería deseable cierto nivel de automatización y/o ahorro de energía.

Reloj en tiempo real

Módulo de reloj en tiempo real (RTC) basado en PCF8523.Módulo de reloj en tiempo real (RTC) basado en PCF8523. Una característica que se echa mucho de menos en los SBC de Raspberry Pi es un reloj en tiempo real (RTC), ya que esto significa que sin acceso a Internet, la hora del sistema prácticamente no tendrá sentido. Afortunadamente, es bastante fácil instalar cualquiera de una serie de módulos RTC, como los ubicuos PCF8253, DS1307, DS3231 y opciones de gama alta. La mayoría de estos módulos RTC se comunican mediante el bus I2C, lo que significa conectar 3,3 V, GND y las líneas I2C SCL/SDA. Tenga en cuenta que ya tendríamos un conflicto potencial aquí si usamos la función de apagado suave, ya que de forma predeterminada se supone que estamos usando el bus I2C principal (i2c_arm). Después de esto, debemos habilitar la superposición apropiada para el módulo que estamos usando. De acuerdo con la documentación superpuesta: Nombre: i2c-rtc Información: agrega soporte para una cantidad de dispositivos de reloj en tiempo real I2C Carga: dtoverlay=i2c-rtc,= Con la opción I2C de software como respaldo si no podemos usar el bus I2C primario: Nombre: i2c-rtc-gpio Información: agrega soporte para una cantidad de dispositivos de reloj en tiempo real I2C que usan el controlador de software i2c Carga: dtoverlay=i2c-rtc-gpio,= Con todos esto en su lugar, solo tenemos que lidiar con el reloj de hardware falso (falso-hwclock) que se usa de forma predeterminada, ya que de lo contrario tendremos que configurar manualmente la hora (falsa) hwclock desde el RTC. Por ejemplo, en sistemas operativos basados ​​en Debian como Raspberry Pi OS: sudo apt-get -y remove fake-hwclock sudo update-rc.d -f fake-hwclock sudo remove systemctl disabled fake-hwclock

Solo el principio

Algunos de los archivos Device Tree Binary Overlay (DTBO) que forman parte de una imagen del sistema operativo Raspberry Pi.Algunos de los archivos Device Tree Binary Overlay (DTBO) que forman parte de una imagen del sistema operativo Raspberry Pi. Algunos pueden haber notado en este punto que este procedimiento con superposiciones parece familiar si alguna vez han instalado algo como una placa de sonido I2S en un sistema Raspberry Pi. La razón de esto es que los DTBO para estos dispositivos ya están presentes y, por lo tanto, se pueden cargar en el arranque sin necesidad de modificaciones adicionales. Si bien gran parte de esta funcionalidad se puede duplicar mediante varios scripts de shell y python dentro del propio sistema operativo, generalmente es más sencillo hacerlo en forma de una superposición de árbol de dispositivos, aunque solo sea porque todo lo que se requiere ya es parte del imagen predeterminada del sistema operativo. Esto significa que también se garantiza que seguirá funcionando, incluso a través de actualizaciones de paquetes y kernel de Linux. Una simple mirada a los archivos DTBO que vienen con una imagen del sistema operativo Raspberry Pi o similar da una buena idea de cuántas superposiciones hay. Todo, desde DAC, codificadores rotatorios, varias pantallas (LCD, OLED), dispositivos oficiales de Raspberry Pi como PoE HAT, tarjetas de sonido e innumerables funciones y dispositivos relacionados con GPIO, SPI e I2C. Con esto en mente, parece una buena idea leer el LÉAME superpuesto para tener una idea de lo que se admite y hacer referencia a él antes de embarcarse en un nuevo proyecto en un Raspberry Pi SBC. Del mismo modo, no está de más comprobar las superposiciones disponibles en otras plataformas (ARM). Por lo que sabe, la característica que le gustaría tener es un simple cambio de superposición.

By Erica Flores

Enamorada de la tecnología. Apasionada de la velocidad que la información puede adquirir en este mundo cambiante. Actualmente residiendo en Barcelona.