【IMX6ULL驱动开发学习】09.Linux之I2C驱动框架简介和驱动程序模板

参考:Linux之I2C驱动 i2c驱动_风间琉璃?的博客-CSDN博客??????
目录
一、I2C驱动框架简介
1.1 I2C总线驱动
1.2I2C设备驱动
二、I2C总线-设备-驱动模型
2.
2.2
2.3I2C 设备数据收发和处理
三、Linux I2C驱动程序模板
一、I2C驱动框架简介
在 Linux 内核中 I2C 的体系结构分为 3 个部分:
1.1 I2C总线驱动
I2C 总线和总线类似,区别在于 总线是虚拟的一条总线,而 I2C 总线是实际
存在的 。对于使用 I2C 通信的设备,在驱动中直接使用 I2C 总结即可 。I2C 总线驱动的重点是 I2C 适配器驱动,主要涉及到两个结构体:和。在 Linux 内核中用结构体来表示 I2C 适配器 。结构体定义在 /linux/i2c.h 文件中
struct i2c_adapter {struct module *owner;unsigned int class; /* classes to allow probing for */const struct i2c_algorithm *algo; /* 总线访问算法 */void *algo_data;/* data fields that are valid for all devices */struct rt_mutex bus_lock;int timeout; /* in jiffies */int retries;struct device dev; /* the adapter device */int nr;char name[48];struct completion dev_released;struct mutex userspace_clients_lock;struct list_head userspace_clients;struct i2c_bus_recovery_info *bus_recovery_info;const struct i2c_adapter_quirks *quirks;};
类型的指针变量algo,对于一个 I2C 适配器,要对外提供读写 API 函数,设备驱动程序可以使用这些 API 函数来完成读写操作 。是 I2C 适配器与 IIC 设备进行通信的方法 。结构体定义在 /linux/i2c.h 文件中
struct i2c_algorithm {......int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs,int num);int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,unsigned short flags, char read_write,u8 command, int size, union i2c_smbus_data *data);/* To determine what the adapter supports */u32 (*functionality) (struct i2c_adapter *);......};
一般 SOC 的 I2C 总线驱动都是由半导体厂商编写的,所以大多数只要专注于 I2C 设备驱动即可 。
1.2I2C设备驱动
在 I2C 设备驱动中主要有两个重要的结构体: 和。是描述设备信息的,描述驱动内容 。
当驱动和设备匹配成功后,每检测到一个 I2C 设备就会给这个 I2C 设备分配一个,这个存储着这个设备的所有信息,如芯片地址 。结构体定义在/linux/i2c.h 文件中
struct i2c_client {unsigned short flags; /* 标志 */unsigned short addr; /* 芯片地址,7 位,存在低 7 位*/......char name[I2C_NAME_SIZE]; /* 名字 */struct i2c_adapter *adapter; /* 对应的 I2C 适配器 */struct device dev; /* 设备结构体 */int irq; /* 中断 */struct list_head detected;......};
类似 ,是编写 I2C 设备驱动重点要处理的内容,结构体定义在 /linux/i2c.h 文件中
struct i2c_driver {unsigned int class;/* Notifies the driver that a new bus has appeared. You should* avoid using this, it will be removed in a near future.*/int (*attach_adapter)(struct i2c_adapter *) __deprecated;/* Standard driver model interfaces */int (*probe)(struct i2c_client *, const struct i2c_device_id *);int (*remove)(struct i2c_client *);/* driver model interfaces that don't relate to enumeration */void (*shutdown)(struct i2c_client *);/* Alert callback, for example for the SMBus alert protocol.* The format and meaning of the data value depends on the* protocol.For the SMBus alert protocol, there is a single bit* of data passed as the alert response's low bit ("eventflag"). */void (*alert)(struct i2c_client *, unsigned int data);/* a ioctl like command that can be used to perform specific* functions with the device.*/int (*command)(struct i2c_client *client, unsigned int cmd,void *arg);struct device_driver driver;const struct i2c_device_id *id_table;/* Device detection callback for automatic device creation */int (*detect)(struct i2c_client *, struct i2c_board_info *);const unsigned short *address_list;struct list_head clients;};