Botón de encendido para Raspberry Pi, cortesía de Device Trees

Como característica estándar del kernel de Linux, la cubierta del árbol de dispositivos (DTO) permite habilitar y configurar fácilmente características y controladores, como los que se encuentran en el firmware estándar del sistema Raspberry Pi. El uso de estos DTO es un conjunto trivial de funciones, como un botón de interruptor suave, que activa una fuente de alimentación externa y habilita controladores para todo, desde un reloj externo en tiempo real (RTC) hasta una variedad de pantallas, sensores y dispositivos de audio, todo sin modificación. el sistema operativo o usando scripts personalizados.

También puede agregar sus propios DTO para crear un techo personalizado que combine varios comandos de DTO en uno, o crear un binario de árbol de hardware (DTB) personalizado para el hardware de destino. Básicamente, este DTB se carga desde el kernel de Linux en el momento del lanzamiento para informarle qué dispositivos están conectados y sus ajustes de configuración, muy similar a lo que maneja automáticamente el componente BIOS con arquitecturas basadas en x86.

Finalmente, 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 pueden configurar con 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 Raspberry Pi SBC.

Como se señaló anteriormente, el árbol de hardware se compila en un binario que se transmite al núcleo en el momento del lanzamiento. En este árbol de dispositivos se encuentra la lista de dispositivos conectados, su controlador y otras configuraciones relevantes. En las plataformas que no utilizan un sistema similar al BIOS para detectar dispositivos automáticamente, como tarjetas gráficas y tarjetas de red, y para dispositivos que no tienen opciones de detección y configuración automáticas, como dispositivos I2C y SPI, el árbol de dispositivos debe construirse de esta manera.

El uso de un árbol de hardware externo de este tipo evita el problema 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 los SBC de Raspberry Pi. Recomponer 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 las superposiciones.

Después de cargar el DTB desde el kernel, se implementan los DTO, de acuerdo con la documentación del kernel de Linux para DTO. La portada en sí se especifica como una fuente de árbol de hardware, compilada utilizando el compilador de árbol de hardware en un archivo Ooverlay binario de árbol de hardware (DTBO). Para Raspberry Pi, estos DTBO se pueden encontrar al igual que los DTB en la cuenta de Raspberry Pi GitHub.

Encima del blog de Bootlin, un excelente artículo explica cómo escribir sus propios delineadores y aplicarlos usando la plataforma BeagleBone Black. Esto muestra cómo cargar DTBO desde el cargador de arranque U-Boot, que es un proceso un poco más complicado que el que ofrecen otras plataformas.

Con Armbian, por ejemplo, los DTO pueden ser configurados y cambiados por el armbianEnv.txt archivo, suponiendo que se utilice una imagen para una plataforma que admita esta característica. Suponiendo que es una función compatible con la imagen Armbian utilizada, todo lo que se necesita es editar la /boot/armbianEnv.txt agregue los nombres de techo requeridos y sus parámetros. Este enfoque recuerda mucho al enfoque elegido en la plataforma Raspberry Pi SBC, con un archivo de texto similar cargado por /boot/config.txt.

Botón de encendido suave

Interruptor NO instantáneo instalado en 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 interruptor bajo y un botón de apagado usando solo una imagen predeterminada del sistema operativo Raspberry Pi, un interruptor momentáneo (normalmente abierto) y algunos cables. para conectar este interruptor a dos pines en la cabeza GPIO, como en la imagen de la derecha.

Para que esto funcione, aquí hay dos componentes en juego. El primero se refiere al encendido suave. En las placas Raspberry Pi, cuando la CPU está en estado de espera (encendida, pero la CPU no está funcionando), GPIO3 se mantiene en un estado alto debido a la resistencia de arrastre externa. Cada vez que GPIO3 se degrada a este estado, la CPU se reinicia.

Esto se logra colocando nuestro interruptor NO en un pin GPIO3 y tierra (GND). Cuando el sistema entra en estado de parada y pulsamos el botón, GPIO3 se baja y el sistema se reinicia.

Para un desenganche suave, necesitamos usar la primera superposición. Debido a que también usaremos GPIO3 para deshabilitar el sistema, agregaremos el siguiente dtoverlay a /boot/config.txt:

dtoverlay=gpio-shutdown,gpio_pin=3,active_low=1,debounce=1500

La gpio-shutdown DTO se describe en la superposición LÉAME:

Name: gpio-shutdown
Info: Initiates a shutdown when GPIO pin changes. The given GPIO pin
is configured as an input key that generates KEY_POWER events.
This event is handled by systemd-logind by initiating a
shutdown.

Si el sistema se inicia cuando activamos este evento, actuará como si estuviéramos presionando el botón de "encendido" en un sistema de escritorio, apagando el sistema y apagando la CPU.

Más allá del número de pin GPIO, también podemos establecer 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 incorporado al frente. del pasador 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 porque GPIO3 también es el pin SCL I2C1 (no reutilizable), 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 saltar a través de algunos anillos adicionales.

Otra portada interesante relacionada con el poder es la gpio-poweroff una:

Name: gpio-poweroff
Info: Drives a GPIO high or low on poweroff (including halt). Using this
overlay interferes with the normal power-down sequence, preventing the
kernel from resetting the SoC (a necessary step in a normal power-off
or reboot). This also disables the ability to trigger a boot by driving
GPIO3 low.

Cuando se usa una fuente de alimentación externa, esta señal se usa para apagar el SBC y es probable que apague la fuente de alimentación hasta que se active nuevamente con alguna otra señal. Esto puede ser útil en áreas 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.

Una característica muy codiciada de 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 será casi insignificante. Afortunadamente, es bastante fácil instalar cualquiera de los pocos módulos RTC, como los ubicuos PCF8253, DS1307, DS3231 y opciones avanzadas.

La mayoría de estos módulos RTC se comunican mediante el bus I2C, lo que significa cableado de 3,3 V, GND y las líneas I2C SCL/SDA. Tenga en cuenta que ya tendríamos un posible conflicto aquí si usáramos el interruptor bajo, porque por defecto se supone que debemos usar el principal (i2c_arm) Autobús I2C. Después de eso, debemos habilitar el techo apropiado para el módulo que estamos usando.

Según la documentación superpuesta:

Name: i2c-rtc Info: Adds support for a number of I2C Real Time Clock devices Load: dtoverlay=i2c-rtc,<param>=<val>

Con la opción de software I2C en reserva si no podemos usar el bus I2C primario:

Name: i2c-rtc-gpio
Info: Adds support for a number of I2C Real Time Clock devices
using the software i2c controller
Load: dtoverlay=i2c-rtc-gpio,<param>=<val>

Con todo esto en su lugar, solo tenemos que lidiar con el reloj falso del dispositivo (falso hwclock) que se usa por defecto, de lo contrario tendremos que configurar manualmente la hora (falsa) hwclock del RTC. Por ejemplo, en un sistema operativo basado en Debian, como el sistema operativo Raspberry Pi:

sudo apt-get -y remove fake-hwclock 
sudo update-rc.d -f fake-hwclock 
sudo remove systemctl disable fake-hwclock

Solo el comienzo

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 lanzamiento sin necesidad de realizar más modificaciones.

Aunque gran parte de esta funcionalidad puede ser duplicada por varios scripts de shell y python dentro del mismo sistema operativo, generalmente es más simple hacerlo en forma de un techo de árbol de hardware, aunque solo sea porque todo lo que se necesita ya es parte del sistema operativo predeterminado. imagen. Esto significa que también está garantizado que continuará ejecutándose, incluso a través del kernel de Linux y las actualizaciones de paquetes.

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. Desde DACs, codificadores rotatorios, pantallas varias (LCD, OLED), dispositivos oficiales Raspberry Pi como el PoE HAT, tarjetas de sonido y un sinfín de funciones y dispositivos relacionados con GPIO, SPI e I2C.

Con eso en mente, parece una buena idea leer las superposiciones README para tener una idea de lo que se admite y consultarlo antes de comenzar un nuevo proyecto en 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 interruptor de superposición simple.

Joel Carrasco
Joel Carrasco

Deja una respuesta

Tu dirección de correo electrónico no será publicada.