图 2 多开始信号时序
而且 read() 、write() 方法只适用用于适配器支持 i2c 算法的情况,如:
程序代码
static const struct i2c_algorithm s3c24xx_i2c_algorithm = {
.master_xfer = s3c24xx_i2c_xfer,
.functionality = s3c24xx_i2c_func,
};
而不适合适配器只支持 smbus 算法的情况,如:
程序代码
static const struct i2c_algorithm smbus_algorithm = {
.smbus_xfer = i801_access,
.functionality = i801_func,
};
基于上面几个原因, 所以一般都不会使用 i2c-dev.c 的 read() 、write() 方法。最常用的是 ioctl()
方法。 ioctl() 方法可以实现上面所有的情况 (两种数据格式、 以及 I2C 算法和 smbus 算法)。
针对 i2c 的算法,需要熟悉 struct i2c_rdwr_ioctl_data 、struct i2c_msg 。使用的命令是
I2C_RDWR 。
程序代码
struct i2c_rdwr_ioctl_data {
struct i2c_msg __user *msgs; /* pointers to i2c_msgs */
__u32 nmsgs; /* number of i2c_msgs */
};
struct i2c_msg {
_ _u16 addr; /* slave address */
_ _u16 flags; /* 标志(读、写) */
_ _u16 len; /* msg length */
_ _u8 *buf; /* pointer to msg data */
};
针对 smbus 算法, 需要熟悉 struct i2c_smbus_ioctl_data 。使用的命令是 I2C_SMBUS 。对
于 smbus 算法,不需要考虑 “多开始信号时序 ”问题。
程序代码
struct i2c_smbus_ioctl_data {
__u8 read_write; // 读、写
__u8 command; // 命令
__u32 size; // 数据长度标识
union i2c_smbus_data __user *data; // 数据
};
下面以一个实例讲解操作的具体过程。通过 S3C2410 操作 AT24C02 eeprom 。实现在
AT24C02 中任意位置的读、写功能。
首先在内核中已经包含了对 s3c2410 中的 i2c 控制器驱动的支持。 提供了 i2c 算法(非 smbus
类型的,所以后面的 ioctl 的命令是 I2C_RDWR )
评论0
最新资源