En general, cualquier sistema operativo necesita un software específico para el dispositivo. Este software comprende la funcionalidad del dispositivo y es una capa intermedia entre el sistema operativo y el hardware. El controlador del dispositivo es el término utilizado para este software. En este artículo, vamos a discutir sobre cómo Linux maneja los dispositivos y los controladores de dispositivos. En palabras simples, exploraremos el marco del controlador del dispositivo de Linux.
Descripción
Por lo general, en cualquier placa o plataforma, hay múltiples dispositivos y estos dispositivos están conectados entre sí por algunas líneas o protocolos físicos. Estos protocolos de conexión se conocen como autobuses. Hay varios protocolos de autobuses disponibles. Pocos ejemplos son I2C, SPI, AHB, APB, PCI, etc. Tomemos un ejemplo de dispositivo de memoria EEPROM. EEPROM está conectado con el sistema por el bus I2C. CPU utilizará el protocolo I2C para leer/escribir datos de EEPROM. Desde el lado de la CPU, el controlador de protocolo I2C realizará este manejo del protocolo. El controlador I2C en la CPU actúa como el dispositivo maestro. Eeprom actúa como el dispositivo de esclavos. Todos los detalles de I2C están disponibles en la especificación I2C.
En los sistemas ARM basados en Linux, los dispositivos EEPROM están poblados con la ayuda del árbol de dispositivos. Definir el EEPROM en el árbol del dispositivo es suficiente para declarar el dispositivo en el sistema. Con este dispositivo, la instancia de la entrada del dispositivo será creada por el kernel de Linux mientras se inicia. Cuando el Linux se arranca, analiza el árbol del dispositivo y creó la instancia de los dispositivos definidos en el árbol del dispositivo.
Con este dispositivo se crea en Linux, pero Linux no podrá comprender el dispositivo. Para la comunicación/operaciones del dispositivo, se necesita un software especial específico para el dispositivo. Esto se conocerá como el controlador del dispositivo para el dispositivo. Volviendo al ejemplo de EEPROM, se necesitará un controlador de dispositivo EEPROM para leer/escribir los datos de la EEPROM.
Para unir el controlador del dispositivo al dispositivo específico, se necesita una cadena compatible. La cadena compatible es utilizada por Linux Kernel para sondear el controlador específico al dispositivo mientras se arranca. Linux Kernel también proporciona la flexibilidad de que un controlador de dispositivo se puede cargar en tiempo de ejecución. La única condición es que el controlador no debe ser necesario para que la plataforma arrance. El controlador de dispositivo que se agregan más tarde al núcleo se compilan como objetos del núcleo. Estos son los archivos presentes como .KO. El comando INSMOD se usa para agregar los objetos del núcleo en el kernel en ejecución.
Después de sondear al controlador del dispositivo con el dispositivo, el dispositivo se puede utilizar para las operaciones. El dispositivo EEPROM se puede leer/escribir después de que el controlador EEPROM se inicialice en el núcleo de Linux. El controlador de EEPROM inicializa el dispositivo y proporciona la capacidad al núcleo de Linux para leer/escribir el EEPROM.
Tomemos un ejemplo de controlador de dispositivo EEPROM como AT24, el código fuente para el dispositivo se puede encontrar en el enlace: https: // github.com/Torvalds/Linux/Blob/Master/Drivers/Misc/Eeprom/AT24.C
Este controlador admite un número muy amplio de dispositivos EEPROM como se describe en los comentarios del controlador Atmel AT24C o * Microchip 24lc, etc.
La siguiente es la información del árbol del dispositivo que se agregará para crear una instancia de dispositivo:
eeprom@50
compatible = "atmel, 24c32";
reg = <0x50>;
PageSize = <32>;
Esto debe agregarse al nodo del controlador I2C específico, donde este dispositivo EEPROM está conectado.
Como podemos ver, hay una cadena compatible. Esta es la información utilizada por Linux Kernel para localizar el controlador del dispositivo del dispositivo EEPROM.
Para obtener la información sobre los dispositivos y dispositivos presentes en el sistema Linux, las entradas SYSFS son el mejor lugar.
Para cada dispositivo y controlador del sistema, las entradas SYSFS serán creadas por el núcleo. El usuario puede remitir estos archivos SYSFS para diagnosticar el sistema.
Si vemos el contenido del directorio SYS en Linux Kernel:
/Sys/Bus: Todos los autobuses presentes en el sistema se enumeran dentro de este.
El bus I2C también se puede ver. Mientras discutíamos el ejemplo del dispositivo I2C. Dentro del directorio de autobuses, tenemos el directorio de autobuses I2C.
Para cualquier autobús en el SYSFS, tendremos todos los dispositivos y conductores presentes en ese autobús. Veamos el contenido del bus I2C:
Si exploramos aún más el directorio de dispositivos y controladores, obtendremos la lista completa de dispositivos y controladores conocidos por el núcleo de Linux.
Dentro de los dispositivos, podemos ver que hay múltiples buses I2C presentes en el sistema. I2C-0, I2C-1, I2C-5, etc., son diferentes autobuses I2C. 0-0018 y 0-001A son los dispositivos de esclavos en I2C-0. 1-0050 y 1-0068 son los dispositivos de esclavos I2C en el autobús no. 1 I.mi. I2C-1.
Dentro del directorio del controlador tenemos la lista de todos los controladores de dispositivos de esclavos I2C.
Volviendo a nuestro ejemplo de dispositivo EEPROM, 1-0050 es el dispositivo de esclavo EEPROM. Si nos sumergimos en el directorio 1-0050, veremos algo como a continuación:
Esto nos ha proporcionado el conocimiento del controlador que está controlando este dispositivo. En la instantánea, podemos ver los controles del controlador AT24 el EEPROM presente en el sistema. Este es el controlador que está vinculado a este dispositivo EEPROM.
Para acceder al dispositivo EEPROM desde el espacio de usuario, el controlador ha creado el archivo "EEPROM" que también se puede ver en la instantánea.
Para leer los datos de 8K EEPROM y volcar al archivo, el comando DD se puede usar como se muestra a continuación:
dd if =/sys/bus/i2c/disposition/1-0050/eeprom of = eeprom_data.bin bs = 1k recuento = 8
Como se puede ver en los registros, se leen 8k bytes de la EEPROM y se escriben a la EEPROM_DATA.archivo bin. Este archivo bin tendrá los datos de EEPROM. El comando DD es el comando más popular y comúnmente utilizado en Linux World.
Al igual que este dispositivo EEPROM, otros dispositivos I2C también deben seguir las pautas proporcionadas por Linux Kernel. Otros dispositivos I2C podrían ser RTC, pantalla de techo, etc. En general, este marco del controlador del dispositivo es aplicable incluso a los dispositivos fuera del alcance I2C.
Puede ser un dispositivo SPI o cualquier otro dispositivo. Habrá una instancia de dispositivo que se creará y otra instancia del controlador. Tanto el dispositivo como el controlador estarán vinculados/conectados a través del controlador del bus. Este es el marco de controlador de dispositivo genérico en Linux.
Vinculante y desabrochado del conductor
La unión del controlador con el dispositivo es el proceso de asociación o vinculación del controlador al dispositivo que puede controlarlo o comprenderlo. El desabrochar es el proceso inverso, cuando desinyemos el controlador con el dispositivo.
Hay archivos sysfs presentes en todos los controladores. Los nombres de los archivos son BIND y no dan. Estos son los archivos que se pueden usar para vincular y desgastar. La siguiente es la instantánea del controlador EEPROM AT24:
Desarchar el controlador con el dispositivo
Como podemos ver, la instancia del dispositivo está presente dentro de AT24. Esto significa que el dispositivo ya está vinculado. Podemos hacer eco del nombre del dispositivo para desgaste al controlador del dispositivo.
El desabrochado del controlador con el dispositivo se puede ver en la instantánea.
Echo 1-0050>/sys/bus/i2c/controladores/AT24/desorgir; es el comando que ha hecho la desapercibencia. Después de este comando, el dispositivo no está presente. Por lo tanto, el dispositivo no está vinculado con el controlador ahora.
Enlace del controlador con el dispositivo
echo 1-0050>/sys/bus/i2c/controladores/at24/bind; es el comando que hace el enlace del controlador con el dispositivo.
El primer comando LS muestra que los detalles del dispositivo no están presentes dentro del directorio AT24, lo que significa que el dispositivo no está vinculado con ningún controlador. En segundo lugar, emitimos un comando para vincular el dispositivo con el controlador. Como resultado, vimos que la información del dispositivo se llena dentro del directorio del controlador. Por lo tanto, el controlador se vincula con éxito al dispositivo.
El dispositivo solo se puede acceder después de la unión exitosa del controlador con el dispositivo.
Conclusión
Discutimos el marco del controlador del dispositivo en el kernel de Linux con un ejemplo de dispositivo I2C EEPROM. Exploramos la creación de dispositivos EEPROM en el árbol de dispositivos y la vinculación del controlador con el dispositivo. Se realizó alguna exploración en los archivos SYSFS, que proporciona la muy buena información de diagnóstico sobre dispositivos y controladores presentes en Linux Kernel. Vimos un ejemplo de acceso de EEPROM con la ayuda del comando DD. También entendimos el marco genérico que involucra dispositivos, conductores y autobuses. Por fin, también remitimos las formas de unir y desgastar a los controladores y dispositivos manualmente desde el espacio del usuario.