最近太在做一个FM的驱动,参考了内核中一个FM驱动代码(radio-si470x-i2c.c),碰到下面一段代码就迷糊了,小弟能力有限,请各位大牛指点。
/*
* si470x_get_register - read register
*/
int si470x_get_register(struct si470x_device *radio, int regnr)
{
u16 buf[READ_REG_NUM];
struct i2c_msg msgs[1] = {
{ radio->client->addr, I2C_M_RD, sizeof(u16) * READ_REG_NUM,
(void *)buf },
};
if (i2c_transfer(radio->client->adapter, msgs, 1) != 1)
return -EIO;
radio->registers[regnr] = __be16_to_cpu(buf[READ_INDEX(regnr)]);
return 0;
}
/*
* si470x_set_register - write register
*/
int si470x_set_register(struct si470x_device *radio, int regnr)
{
int i;
u16 buf[WRITE_REG_NUM];
struct i2c_msg msgs[1] = {
{ radio->client->addr, 0, sizeof(u16) * WRITE_REG_NUM,
(void *)buf },
};
for (i = 0; i < WRITE_REG_NUM; i++)
buf[i] = __cpu_to_be16(radio->registers[WRITE_INDEX(i)]);
if (i2c_transfer(radio->client->adapter, msgs, 1) != 1)
return -EIO;
return 0;
}
为什么在读写寄存器的时候没有指定寄存器的地址。这样也行?我查了一下I2C协议,也没有说有这样的方法。求解释
------解决思路----------------------
地址包含在 msgs 里面啊. 楼主可以再去看看i2c_transfer函数, 看看地址是怎么被用到的.
------解决思路----------------------
好深奥啊
------解决思路----------------------
这个你要看si470x的spec, 因为各个I2C设备的约定不一样。有的设备只支持从0开始,然后全部读,全部写。还有的是通过I2C写指令,设置当前的设备的当前寄存器索引, 然后再去读。 从你的代码看, 该设备应该是从0开始,全部读取或者写入的。
------解决思路----------------------
i2c_transfer函数中通过
adap->algo->master_xfer(adap,msgs,num);
最后通过这个函数完成i2c的协议过程