'i2c_get_clientdata'和"i2c_set_clientdata"有什么用?

Vir*_*mar 2 i2c linux-device-driver linux-kernel embedded-linux

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

我在这里看到了这个问题. 使用指针结构而不是创建静态本地副本

有时我觉得像"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;
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*oni 5

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

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

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