Controlador Linux de dispositivo I2C
linux-kernel linux-device-driver (1)
Gracias chicos. He encontrado lo que quiero hace un par de horas. Entonces, como veo, hay tres tipos de controladores. Se supone que uno debe insertarse en el kernel, y debe reconstruir su kernel para usarlos. También hay controladores que puede usar a través de sysfs
usando los atributos del dispositivo (aparecen en /sys/bus/i2c/driver/your_driver/
). Y, tercero, mi tipo, controladores que parecen dispositivos de caracteres. En realidad, puedes combinarlos.
Por lo tanto, si desea utilizar el último tipo de dispositivos, será un poco difícil encontrar ejemplos correctos, ya que casi todos los ejemplos están dedicados a los primeros dos tipos de controladores. De todos modos, si desea crear un dispositivo de caracteres, debe describir las funciones de la estructura file_operations
. Pero todas las funciones como i2c_transfer
, i2c_smbus_read_byte
. Etc. ( lista completa ) requiere struct i2c_adapter
o struct i2c_client
. ¿Y hay dos preguntas, cómo llegar estructuras y cómo conectar el controlador al bus i2c apropiado, como i2c-2?
Entonces hay una función que no se describe aquí : i2c_get_adapter
. Como parámetro, debe pasar el número de bus i2c. Devuelve un enlace a una estructura i2c_adapter
. La estructura i2c_client
que puede obtener con la función i2c_adapter
pasando el i2c_adapter
y la dirección del esclavo como parámetros.
Después de eso, puede usar funciones como i2c_transfer
, i2c_transfer
, etc. Al final puede describir las funciones de estructura de file_operations
y liberar el controlador, que representa su dispositivo i2c, sin usar sysfs y reconstruir su kernel.
El código de resultado se ve así:
u8 ret;
struct i2c_client * my_client;
struct i2c_adapter * my_adap = i2c_get_adapter(1); // 1 means i2c-1 bus
my_client = i2c_new_dummy (my_adap, 0x69); // 0x69 - slave address on i2c bus
i2c_smbus_write_byte(my_client, 0x0f);
ret = i2c_smbus_read_byte(my_client);
Puede usar este código directamente en sus funciones para la estructura file_operations.
Espero que esta información sea útil para principiantes como yo.
¿Cómo hacer un dispositivo de caracteres para el dispositivo i2c, con funciones de abrir, cerrar, ioctl, etc.? Estuve buscando información sobre esto las últimas dos semanas y no pude encontrar nada que funcionara. Encontré algo de información en los controladores de dispositivos esenciales de Linux, pero fue escrito para 2.6 kernel, y uso 3.4.79 (estoy intentando escribir este controlador para cubieboard2 en cubian distr) por lo que este libro tiene muchas funciones obsoletas, intenté escribe mi controlador como allí, pero todavía no funciona (dame errores del kernel mientras me estoy dirigiendo al dispositivo de caracteres de gato). ¿Alguien puede explicarme qué hacer con él, o al menos darme un ejemplo de trabajo?
entonces, ahí está mi código: http://pastebin.com/T7PBTpym
Solo trato de hacer funcionar el bus i2c, pero en mi osciloscopio no veo nada en las líneas i2c, aunque no consigo errores cuando lo compilo. Además, no encuentro cómo adjuntar el controlador del dispositivo al número de bus i2c. porque tengo 4 buses i2c en mi cubieboard2, y cómo conectar el controlador del dispositivo al bus i2c-1, por ejemplo?