linux I2C驱动4种读写方法

本文详细介绍了四种I2C设备的读写方法:直接使用snd_soc读写函数、封装i2c_transfer函数、利用DEVICE_ATTR创建sysfs节点进行读写、以及使用regmap简化读写逻辑。regmap自3.1版内核引入,适用于I2C和SPI设备,自动选择操作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:读写/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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值