一、Linux--I2C子系统
1. I2C核心
I2C 总线和 I2C 设备驱动的中间枢纽,它提供了 I2C 总线驱动和设备驱动的注册、注销方法等。
2. I2C控制器驱动
I2C CPU对 I2C控制器的驱动实现, 控制器可在 CPU 外部, 也可以集成在 CPU 内部。
3. I2C设备驱动
对 I2C从设备的驱动实现,如AT24C02的驱动。
二、linux--I2C控制器驱动
用户态驱动设计:
用户态驱动设计实际是编写应用程序,由于它是通过大量的设备控制命令去驱动设备所以称为用户模式驱动。
class_create函数说明:自动创建设备文件
/* This is a #define to keep the compiler from merging different
* instances of the __key variable */
#define class_create(owner, name) \
({ \
static struct lock_class_key __key; \
__class_create(owner, name, &__key); \
})
i2c_add_driver函数说明:向Linux系统注册一个I2C驱动
static inline int i2c_add_driver(struct i2c_driver *driver)
{
return i2c_register_driver(THIS_MODULE, driver);
}
I2C消息结构体struct i2c_msg:一次读或者写操作就称作一个消息
struct i2c_msg {
__u16 addr; /* slave address*/设备在I2C总线上的地址,7位,不加读写位,设备在I2C总线上的地址由4位出厂地址和3位用户自定义地址构成,第8位为读写标志
__u16 flags;<span style="white-space:pre"> </span>/* I2C设备读写标志*/
#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
#define I2C_M_RD 0x0001 /* read data, from slave to master */
#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
__u16 len; /* msg length */
__u8 *buf; /* pointer to msg data */
};
I2C传输数据过程:
i2cdev_ioctl->i2cdev_ioctl_rdrw->i2c_transfer->调用适配器adap函数->调用适配器算法函数algo->调用适配器传输函数master_xfer
用户态驱动设计过程:
打开通用设备文件(/dev/i2c-0)->构造写数据到I2C设备的消息->使用ioctl写入数据