我一直在研究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;
}
答案 0 :(得分:5)
这些函数用于获取/设置void * driver_data指针,该指针是struct device的一部分,它本身是struct i2c_client的一部分。
这是一个供驱动程序使用的void指针。人们会使用这个指针来主要传递驱动程序相关的数据。
这就是你的例子中发生的事情。 max6875_read是一个获得structu kobject的回调。该kobject是一个i2c_client,它足以使用driver_data指针与底层设备通信,这里允许返回驱动程序相关数据(例如,而不是使用全局变量)。