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:
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
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.