一段奇怪的I2C读取寄存器代码,小弟不才,求解释!该如何处理

一段奇怪的I2C读取寄存器代码,小弟不才,求解释!!
最近太在做一个FM的驱动,参考了内核中一个FM驱动代码(radio-si470x-i2c.c),碰到下面一段代码就迷糊了,小弟能力有限,请各位大牛指点。
C/C++ code
/*
 * 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的协议过程