'i2c_get_clientdata'和“i2c_set_clientdata”有什么用?

时间:2013-12-25 17:52:21

标签: linux-kernel linux-device-driver embedded-linux i2c

我一直在研究I2C驱动程序(客户端)代码。 我在每个地方看过这个函数“i2c_get_clientdata”和“i2c_set_clientdata”。

我在这里看到了这个问题。 Use of pointer to structure instead of creating static local copy

有时我觉得像“container_of”宏一样得到指向结构的指针。 但我仍然没有正确理解为什么要使用它以及何时使用它。

下面我发布一个示例代码,我看到它的用法。 如果有人能帮助我理解为什么在那里使用它,以及何时我们在编写自己的驱动程序时使用它。

struct max6875_data {
    struct i2c_client       *fake_client;
    struct mutex            update_lock;

    u32                     valid;
    u8                      data[USER_EEPROM_SIZE];
    unsigned long           last_updated[USER_EEPROM_SLICES];
};

static ssize_t max6875_read(struct file *filp, struct kobject *kobj,
                        struct bin_attribute *bin_attr,
                        char *buf, loff_t off, size_t count)
{
    struct i2c_client *client = kobj_to_i2c_client(kobj);
    struct max6875_data *data = i2c_get_clientdata(client);
    int slice, max_slice;

    if (off > USER_EEPROM_SIZE)
            return 0;

    if (off + count > USER_EEPROM_SIZE)
            count = USER_EEPROM_SIZE - off;

    /* refresh slices which contain requested bytes */
    max_slice = (off + count - 1) >> SLICE_BITS;
    for (slice = (off >> SLICE_BITS); slice <= max_slice; slice++)
            max6875_update_slice(client, slice);

    memcpy(buf, &data->data[off], count);

    return count;
}

1 个答案:

答案 0 :(得分:5)

这些函数用于获取/设置void * driver_data指针,该指针是struct device的一部分,它本身是struct i2c_client的一部分。

这是一个供驱动程序使用的void指针。人们会使用这个指针来主要传递驱动程序相关的数据。

这就是你的例子中发生的事情。 max6875_read是一个获得structu kobject的回调。该kobject是一个i2c_client,它足以使用driver_data指针与底层设备通信,这里允许返回驱动程序相关数据(例如,而不是使用全局变量)。