Linux i2c设备驱动编写 下载本文

Linux i2c设备驱动编写

1.

2. 在Linux驱动中I2C系统中主要包含以下几个成员:

I2C adapter 即I2C适配器 I2C driver 某个I2C设备的设备驱动,可以以driver理解。 I2C client 某个I2C设备的设备声明,可以以device理解。 I2C adapter 是CPU集成或外接的I2C适配器,用来控制各种I2C从设备,其驱动需要完成对适配器的完整描述,最主要的工作是需要完成i2c_algorithm结构体。这个结构体包含了此I2C控制器的数据传输具体实现,以及对外上报此设备所支持的功能类型。i2c_algorithm结构体如下: [cpp] view plaincopy 1. struct i2c_algorithm {

2. int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,

3. int num);

4. int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, 5. unsigned short flags, char read_write,

6. u8 command, int size, union i2c_smbus_data *data); 7.

8. u32 (*functionality) (struct i2c_adapter *); 9. };

如果一个I2C适配器不支持I2C通道,那么就将master_xfer成员设为NULL。如果适配器支持SMBUS协议,那么需要去实现smbus_xfer,如果smbus_xfer指针被设为NULL,那么当使用SMBUS协议的时候将会通过I2C通道进行仿真。master_xfer指向的函数的返回值应该是已经成功处理的消息数,或者返回负数表示出错了。functionality指针很简单,告诉询问着这个I2C主控器都支持什么功能。

在内核的drivers/i2c/i2c-stub.c中实现了一个i2c adapter的例子,其中实现的是更为复杂的SMBUS。 SMBus与 I2C的区别

通常情况下,I2C和SMBus是兼容的,但是还是有些微妙的区别的。 时钟速度对比:

I2C SMBus 最小 无 10kHz 最大 100kHZ(标准)400kHz(快速模式)2MHz(高速模式) 100kHz 超时 无 35ms 在电气特性上他们也有所不同,SMBus要求的电压范围更低。

I2C driver

具体的I2C设备驱动,如相机、传感器、触摸屏、背光控制器常见硬件设备大多都有或都是通过I2C协议与主机进行数据传输、控制。结构体如下:

[cpp] view plaincopy

1. struct i2c_driver { 2. unsigned int class; 3.

4. /* Notifies the driver that a new bus has appeared or is about to

be

5. * removed. You should avoid using this, it will be removed in a 6. * near future. 7. */

8. int (*attach_adapter)(struct i2c_adapter *) __deprecated; //旧的与

设备进行绑定的接口函数

9. int (*detach_adapter)(struct i2c_adapter *) __deprecated; //旧的与

设备进行解绑的接口函数

10.

11. /* Standard driver model interfaces */

12. int (*probe)(struct i2c_client *, const struct i2c_device_id *); /

/现行通用的与对应设备进行绑定的接口函数

13. int (*remove)(struct i2c_client *); //现行通用与对应设备进行解绑的接口

函数 14.

15. /* driver model interfaces that don't relate to enumeration */ 16. void (*shutdown)(struct i2c_client *); //关闭设备

17. int (*suspend)(struct i2c_client *, pm_message_t mesg); //挂起设备,

与电源管理有关,为省电

18. int (*resume)(struct i2c_client *); //从挂起状态恢复 19.

20. /* Alert callback, for example for the SMBus alert protocol. 21. * The format and meaning of the data value depends on the protoco

l.

22. * For the SMBus alert protocol, there is a single bit of data pas

sed

23. * as the alert response's low bit (\ 24. */

25. void (*alert)(struct i2c_client *, unsigned int data); 26.

27. /* a ioctl like command that can be used to perform specific funct

ions

28. * with the device. 29. */

30. int (*command)(struct i2c_client *client, unsigned int cmd, void *

arg); 31.

32. struct device_driver driver; //I2C设备的驱动模型 33. const struct i2c_device_id *id_table; //匹配设备列表 34.

35. /* Device detection callback for automatic device creation */ 36. int (*detect)(struct i2c_client *, struct i2c_board_info *); 37. const unsigned short *address_list; 38. struct list_head clients; 39. };

40. #define to_i2c_driver(d) container_of(d, struct i2c_driver, driver) /

/一般编写驱动过程中对象常是driver类型,可以通过to_i2c_driver找//到其父类型i2c_driver

如同普通设备的驱动能够驱动多个设备一样,一个I2C driver也可以对应多个I2C client。