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