static int ip_write(struct ip_charger_info *info, u8 reg, u8 data)
{
ip_err("ip_write reg: 0x%02x; value: 0x%02x\n", reg, data);
return i2c_smbus_write_byte_data(info->client, reg, data);
}
static int ip_read(struct ip_charger_info *info, u8 reg, u8 *data)
{
int ret;
ret = i2c_smbus_read_byte_data(info->client, reg);
if (ret < 0)
return ret;
*data = ret;
ip_err("ip_read reg: 0x%02x; value: 0x%02x\n", reg, *data);
return 0;
}
static int ip_update_bits(struct ip_charger_info *info, u8 reg,
u8 mask, u8 data)
{
u8 v;
int ret;
int count = 0;
ip_err("update in mask: 0x%02x; data: 0x%02x\n",mask, data);
ret = ip_read(info, reg, &v);
if (ret < 0)
return ret;
ip_err("update ip_read reg: 0x%02x; value: 0x%02x\n", reg, v);
while((mask & (1 << count)) == 0){
count++;
}
ip_err("update mask: 0x%02x; count: %d\n",mask, count);
v &= ~mask;
v |= (mask & (data << count));
ip_err("update ip-write reg: 0x%02x; value: 0x%02x\n", reg, v);
return ip_write(info, reg, v);
}
//-----------------------------------------------------------------------------
static ssize_t addr_value_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct sc8989x *sc = dev_get_drvdata(dev);
return 0;
}
static ssize_t addr_value_store(struct device *dev,
struct device_attribute *attr, const char *buf,
size_t count)
{
struct sc8989x *sc = dev_get_drvdata(dev);
uint8_t reg_addr, data;
ssize_t ret;
if (sscanf(buf, "0x%hhx+0x%hhx", ®_addr, &data) != 2) {
fgu_err(" addr_value_store Failed\n");
return -EINVAL;
}
fgu_err("Register Address: 0x%x, Data: 0x%x\n", reg_addr, data);
ret = sc8989x_write_byte(sc, reg_addr, data);
if (ret < 0) {
fgu_err(" addr_value write Failed\n");
return ret;
}
return count;
}
static DEVICE_ATTR(addr_value, S_IRUGO | S_IWUSR, addr_value_show,
addr_value_store);
i2c读写,更新bit位
于 2024-04-07 17:06:08 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)