Linux I2C impulsada Introducción a la arquitectura

  

recientemente debido a los requisitos de trabajo relacionados con el bus I2C. A pesar de que he utilizado en el pasado I2C, pero después de ver el núcleo de Linux se encontró una capa que se puede hacer para mejorar esta situación.

1. arquitectura de controlador de Linux El I2C

Linux conductor del autobús de I2C en dos partes, el conductor del autobús (BUS) y controladores de dispositivos (dispositivo). En donde el deber conductor del autobús, un aumento correspondiente en el sistema para cada bus I2C leer y escribir métodos. Pero el conductor del autobús en sí no hace ninguna comunicación, es sólo existe por ahí, esperando a que los controladores de dispositivo llaman sus funciones.


controlador de dispositivo está impulsando con dispositivos de comunicación particulares sobre el bus I2C. Al proporcionar un conductor de autobús función I2C, el controlador de dispositivo puede ignorar las diferencias controlador de bus, sin tener en cuenta sus detalles de implementación para comunicarse con los dispositivos de hardware.


1.1 conductor del autobús

cuando se está cargado primer piloto de bus I2C la alimentación del sistema. Un conductor de autobús para apoyar un bus I2C específica de escritura. Un conductor de autobús normalmente requiere dos módulos, y una i2c_adapter struct para describir un i2c_algorithm struct:

estática struct i2c_adapter pb1550_board_adapter = {

Nombre: " adaptador pb1550 ", España

id: I2C_HW_AU1550_PSC, España

algo: NULL, España

algo_data: &pb1550_i2c_info, España

inc_use: pb1550_inc_use, España

dec_use: pb1550_dec_use, España

client_register: pb1550_reg, España

client_unregister: pb1550_unreg, España

client_count: 0, España

};


esta muestra montar una llamada y " adaptador pb1550 y " la unidad. Sin embargo, este módulo no proporciona una función para leer y escribir, leer y escribir el método específico, i2c_algorithm estructura proporcionada por el segundo módulo.


estática struct i2c_algorithm au1550_algo = {

.name = " algoritmo Au1550 ",

.ID = I2C_ALGO_AU1550,

.master_xfer = au1550_xfer,

.functionality = au1550_func, España

};


i2c_adap- > algo = &au1550_algo;


esta muestra aumentó a dicha lectura conductor del autobús y " algoritmo y ". Normalmente, cada conductor del bus I2C define sus propios algoritmos de nivelación, algunos, pero dado el autobús utiliza el mismo algoritmo, es posible compartir el mismo conjunto de funciones de lectura y escritura. La presente realización define su propio algoritmo de bloque controlador de escritura, llamado y " algoritmo y " Au1550;.


Después de todo completaron llamando:

i2c_add_adapter (i2c_adap);


Estos dos módulos registrados para
sistema operativo, el conductor del autobús, incluso cargado en. Para AMD Au1550, esta parte ha sido proporcionada por AMD.

1.2 controlador de dispositivo

como se describió anteriormente, el conductor del autobús sólo proporciona un mecanismo para leer y escribir bus en sí y no se comunican. la comunicación I2C por el controlador de dispositivo para hacer, a través de un controlador de dispositivo para comunicarse con el bus I2C específica dispositivo. Un controlador de dispositivo tiene se describirán dos módulos, i2c_driver struct y i2c_client struct.


Cuando el sistema está encendido, I2C conductor del autobús de carga se ha completado, el controlador de dispositivo puede ser cargado. En primer lugar cargada con la siguiente estructura:


struct estática i2c_driver driver = {

.name = " controlador de sintonizador de TV I2C ",

.ID = I2C_DRIVERID_TUNER, España

.FLAGS = I2C_DF_NOTIFY, España

.attach_adapter = tuner_probe, España

.detach_client = tuner_detach, España

.command = tuner_command, España

};


i2c_add_driver (&conductor);


este i2c_driver completado una vez cargado, en el que la función se llama attach_adapter . Cada uno de los cuales puede ser recorridos en el sistema de accionamiento de bus I2C, los dispositivos de detección quieren acceso:


int tuner_probe estática (struct i2c_adapter * ADAP)

{

i2c_probe retorno (ADAP, &addr_data, tuner_attach);

}


Tenga en cuenta que una pluralidad de dispositivos de detección puede ser hallado, y por lo tanto no sólo ser un bus I2C vinculado a una pluralidad de diferentes tipos de dispositivos, un controlador de dispositivo puede ser simultáneamente vinculado al bus I2C en una pluralidad de diferentes dispositivos de servicio.


controlador de dispositivo cada vez que detecta un dispositivo compatible, se crea una estructura i2c_client para identificar el dispositivo:

new_client- > = addr dirección;

new_client- > = adaptador de adaptador;

new_client- > driver = &conductor;


/* Dice la capa I2C un nuevo cliente ha llegado * /

err = i2c_attach_client (new_client);

Si (err)

goto error;


visibles , un i2c_client representa un dispositivo situado en el bus adaptador, frente a la dirección, con el conductor a conducir. Lo harán conductor del autobús y controladores de dispositivo y la dirección del dispositivo de unión juntos. Un i2c_client en nombre de un dispositivo I2C.


obtenido cuando el dispositivo I2C, el dispositivo puede leer y escribir directamente a esta:

/*

* Las rutinas principales son los que normalmente utilizado para transmitir datos a los dispositivos

* en una (o leer de ellos) autobús. Aparte de dos funciones de transferencia básicas para

* transmitir un mensaje a la vez, una versión más compleja puede ser utilizado para

* transmitir un número arbitrario de mensajes sin interrupción

* /

extern int i2c_master_send (struct i2c_client *, const char *, int);.

extern int i2c_master_recv (struct i2c_client *, char *, int);


y leer y escribir funciones en el sentido habitual, estas dos funciones i2c_client designado por el dispositivo de puntero, int leer un char. Devuelve el número de bytes es de lectura. Para nuestra conducción SLIC existente, siempre y cuando los últimos datos que se pueden extraer al bus de lectura y escritura para transmitir ambas funciones, incluso si se realiza el trasplante, obtendremos una versión del controlador de dispositivo I2C Linux.

Copyright © Conocimiento de Windows All Rights Reserved