Descripción general de I2C en Linux

Descripción general de I2C en Linux
En este artículo exploraremos la introducción básica sobre I2C y la implementación de I2C en Linux. Exploraremos el subsistema I2C en el núcleo Linux y algunos ejemplos para la comunicación de maestría y esclavos de I2C.

Descripción

I2C significa Circuito Inter Integrado, es un protocolo en la placa para utilizado para la comunicación entre dos ICS. Es un protocolo de dos cables en serie. Esto sigue al modo maestro de esclavos. I2C Master siempre inicia la comunicación y el reloj para la comunicación también es proporcionada por I2C Master. En dos líneas puede haber múltiples dispositivos conectados. En una sola configuración de maestro y muchas esclavos, cada esclavo se distinguirá con una dirección esclava única.

Ejemplo de configuración de un solo maestro y múltiples esclavos:

En el diagrama de bloques de arriba, podemos ver que hay un maestro único y 3 esclavos con direcciones como se menciona en la caja de cada esclavo.

Protocolo I2C

La secuencia general de mensajes I2C utilizada en la comunicación entre maestro y esclavo se muestra a continuación:

Inicio -> dirección + r/w byte -> ack -> data byte1 -> ack -> data byte2 -> ack -> data byte3 -> ack -> parar

Comenzar: Condición generada por el maestro para indicar que quiere comunicarse con el esclavo.

Dirección + r/w byte: Dirección de esclavos de 7 bits y 1 bit para indicar si la operación se lee o escribe.

Ack: El reconocimiento siempre se envía para cada transferencia de bytes. Esto es enviado por el dispositivo receptor.

Detener: Una vez que se completa la transferencia, el controlador/maestro enviará la condición de parada para completar la transferencia.

En Linux, los controladores I2C se organizan en tres capas lógicas:

  1. controlador maestro/adaptador
  2. Capa de núcleo i2c
  3. Conductor esclavo/cliente

Controladores de maestro/adaptador I2C

Estos se encuentran en el árbol de origen del núcleo en el camino: controladores/ i2c/ busses/. Para cada maestro o controlador I2C, debe haber un controlador presente en esta ruta. Este es el controlador que se registra en la capa de núcleo I2C y controla/administra los-Buses I2C. Este es el controlador que se comunica con los dispositivos de esclavos I2C sobre los autobuses I2C presentes en la plataforma.

Controladores de núcleo I2C

Esta es la lógica de núcleo I2C común de Linux. Esto es común e independiente de cualquier maestro o esclavo I2C específico. Esta es la implementación central del subsistema I2C en Linux.

Conductor de esclavo/cliente I2C

Este es el controlador de chips de esclavos necesarios para cada dispositivo de esclavos. Cualquier dispositivo de esclavos I2C debe tener un controlador o implementación presente en esta categoría. Esto es necesario para que cualquier dispositivo de esclavos se registre en el subsistema Linux I2C.

Habilitando los controladores I2C en el kernel de Linux

La implementación relacionada con el núcleo de I2C se habilitará con los indicadores de configuración del núcleo del núcleo I2C. El controlador maestro I2C también estará habilitado con el controlador I2C de la placa específico. Del mismo modo, habrá un indicador de configuración que se debe habilitar para el controlador de esclavos I2C.

Todas las configuraciones requeridas se pueden habilitar de dos maneras. Uno como controlador incorporado o como módulo de kernel. Los módulos del kernel nos proporcionan la ventaja de cargarlo como tiempo de ejecución sin cambiar o compilar el núcleo de Linux.

El enfoque del módulo solo se puede usar si el acceso al dispositivo no es parte de la ruta de arranque. Si se necesitan los datos de algún dispositivo para que el sistema arrance, entonces estos controladores deben ser incorporados. Tales controladores no pueden compilarse como un módulos cargados dinámicamente en tiempo de ejecución.

Instanciando los dispositivos I2C

En Linux, hay diferentes maneras para instanciar los dispositivos I2C. Dos métodos ampliamente utilizados son: estático y dinámico

Estático: En los sistemas ARM, el árbol de dispositivos se puede usar para crear una instancia del dispositivo I2C.

Se puede agregar un nodo de dispositivo específico en el árbol de dispositivos. Ejemplo, la declaración del árbol del dispositivo para el dispositivo I2C es:

I2C0: I2C@60000000
eeprom@50
compatible = "atmel, eeprom-at";
reg = <0x50>;
;
RTC@60
compatible = "rtc, rtc-maxim";
reg = <0x60>;
;
;

El ejemplo anterior crea una instancia de 2 dispositivos esclavos I2C. Uno es el dispositivo EEPROM y otro es el dispositivo RTC. Después de que surge el sistema, estas entradas se pueden encontrar en/sys/bus/i2c/disposites/i2c-0/. Ambos se crearán dentro del directorio I2C-0 porque se colocan dentro del nodo I2C 0.

Dinámica: La instancia de tiempo de ejecución del dispositivo I2C se puede crear a través de archivos SYSFS.

Hay dos archivos SYSFS presentes para cada bus I2C. New_Device y Delete_Device, ambos archivos son solo escritos y la dirección de esclavo I2C se puede escribir en estos archivos para crear instancia de dispositivo y eliminar la instancia del dispositivo.
Para crear un dispositivo I2C equivalente a los dispositivos definidos en el árbol del dispositivo a partir del ejemplo anterior.

Crear instancia de EEPROM con la dirección de esclava 0x50:

# echo eeprom 0x50>/sys/bus/i2c/disposites/i2c-0/new_device

Deselección de la instancia del dispositivo EEPROM:

# echo 0x50>/sys/bus/i2c/disposites/i2c-0/delete_device

A continuación, el sondeo del dispositivo con el controlador también se puede realizar a partir de archivos SYSFS: hay dos archivos de escritura y desatan, asociados con cada controlador. Exportar la ID del dispositivo a los resultados de los archivos de enlace y desabrochar al enlace y no beber del controlador con el dispositivo. Por ejemplo, el controlador RTC-DS1307 tiene los archivos a continuación en el SYSFS como se discutió anteriormente.

[raíz] $ ls/sys/bus/i2c/controladores/rtc-ds1307/
atar uevent desapristar
[raíz] $

Tengamos un poco más de discusión sobre los archivos SYSFS del subsistema I2C:

I2C SYSFS está presente en la ubicación:/sys/bus/i2c/

Instantánea del SYSFS I2C:

Como podemos ver, hay dos directorios: dispositivos y controladores

Los dispositivos contendrán todas las instancias del dispositivo presentes y conocidas por el kernel de Linux. En nuestro tablero, tenemos dispositivos I2C dentro del directorio de los dispositivos:

Los controladores contendrán todos los controladores I2C presentes y conocidos por el núcleo de Linux. En nuestro tablero, tenemos los controladores debajo del I2C dentro del directorio de los conductores:

Para el enlace y el desagüe de los dispositivos con los controladores, hay dos archivos de escritura presentes dentro de cada controlador. Para el enlace de cualquier dispositivo con el controlador, se puede hacer eco de la ID del dispositivo al archivo de enlace y la desaprobación se puede hacer eco de la ID del dispositivo al archivo para desacreditar.

Enlace del dispositivo I2C con controlador I2C

[raíz] $ echo 1-0068>/sys/bus/i2c/controladores/rtc-ds1307/bind
[592061.085104] RTC-DS1307 1-0068: Registrado como RTC0
[raíz] $

La confirmación de la unión exitosa se puede hacer verificando el enlace suave creado después de la operación de enlace. Se puede ver un nuevo enlace suave del dispositivo en la siguiente instancia de registro después de ejecutar el comando mencionado en la sección de enlace:

[raíz] $ ls/sys/bus/i2c/controladores/rtc-ds1307/
1-0068 BIND UEVENT Desvantar
[raíz] $

Desabrochar el dispositivo I2C con el controlador I2C

[raíz] $ echo 1-0068>/sys/bus/i2c/controladores/rtc-dds1307/desahogar

La confirmación de la desapercibencia exitosa se puede hacer verificando el nodo del dispositivo de enlace suave creado previamente dentro del directorio de los controladores se eliminará. Si verificamos el contenido del directorio de los controladores, deberíamos ver la instantánea de los registros como se muestra a continuación:

[raíz] $ ls/sys/bus/i2c/controladores/rtc-ds1307
atar uevent desapristar
[raíz] $

Aplicaciones I2C o casos de uso con respecto a Linux

  1. Dispositivo EEPROM Para almacenar datos pequeños, la memoria es de pocos KBS.
  2. Dispositivo RTC, utilizado para mantener los datos en tiempo real. El dispositivo se utiliza para mantener el rastreamiento del tiempo incluso cuando el sistema principal está apagado.
  3. Muchos dispositivos de sensores HW como sensores térmicos, sensores de corriente y sensores de voltaje vienen como dispositivos I2C.
  4. Los chips de control de los fanáticos también se producen como dispositivos I2C.

I2C-Tools

Las aplicaciones de espacio de usuario en el entorno de Linux se utilizan para acceder a dispositivos de esclavos I2C. I2cdetect, i2cget, i2cset, i2cdump e i2ctransfer son los comandos disponibles cuando las herramientas I2C están instaladas en cualquier plataforma de Linux. Se pueden acceder a todos los casos de uso de los dispositivos discutidos en las secciones de aplicaciones I2C a través de estas herramientas.

No hay necesidad del controlador de dispositivo esclavo I2C, al intentar acceder al dispositivo de esclavos con herramientas I2C. Estas herramientas pueden permitirnos acceder a los dispositivos en formato sin procesar. Más detalles sobre estas utilidades están disponibles en otro artículo.

Conclusión

Discutimos el subsistema I2C en Linux. Se proporcionó un marco I2C con descripción general de la organización de código lógico. También discutimos los archivos I2C SYSFS. Hemos discutido la secuencia de mensajes de comunicación I2C. Hemos pasado por la creación de instancia del dispositivo en ambos sentidos, yo.mi., estático y dinámicamente. También exploramos los controladores Bind/Unwind con dispositivos. Algunas de las aplicaciones en tiempo real I2C.