一:读写/dev/i2c-x设备结点
读:snd_soc_write()
写:snd_soc_read()
二:通过封装自己的i2c_transfer()读写
写I2C设备:
/* Write to I2C device */
int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value)
{
struct i2c_adapter *adap;
int err;
struct i2c_msg msg[1];
unsigned char data[2];
adap = i2c_get_adapter(0);
if (!adap)
return -ENODEV;
msg->addr = devaddr; /* I2C address of chip */
msg->flags = 0;
msg->len = 2;
msg->buf = data;
data[0] = regoffset; /* register num */
data[1] = value; /* register data */
err = i2c_transfer(adap, msg, 1);
i2c_put_adapter(adap);
if (err >= 0)
return 0;
return err;
}
读I2C设备:
/* Read from I2C device */
int sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value)
{
struct i2c_adapter *adap;
int err;
struct i2c_msg msg[1];
unsigned char data[2];
adap = i2c_get_adapter(0);
if (!adap)
return -ENODEV;
msg->addr = devaddr; /* I2C address of chip */
msg->flags = 0;
msg->len = 1;
msg->buf = data;
data[0] = regoffset; /* register num */
err = i2c_transfer(adap, msg, 1);
msg->addr = devaddr; /* I2C address */
msg->flags = I2C_M_RD;
msg->len = 1;
msg->buf = data;
err = i2c_transfer(adap, msg, 1);
*value = data[0];
i2c_put_adapter(adap);
if (err >= 0)
return 0;
return err;
}
三:通过DEVICE_ATTR在对应的sys设备目录下创建读写文件
通过echo和/cat对/sys/class/i2c设备读写。
四:将驱动注册为regmap,在对应的读写函数中使用regmap的读写方法
regmap是内核3.1后加入的,用于减少慢速I/O驱动上的重复逻辑.
regmap既支持I2C又支持SPI的设备,而在实际使用中只会使用其中一种接口,读写函数不再通过
i2c_transfer或者spi_sync_transfer,而是通过regmap提供的regmap_read/regmap_write,
此函数会根据之前设备的注册自动选择为是I2C或是SPI的操作.
读:
regmap_read()
写:
regmap_write()
linux I2C驱动4种读写方法
于 2019-02-16 19:19:17 首次发布