gpt4 book ai didi

linux-kernel - 'i2c_get_clientdata"和 "i2c_set_clientdata"有什么用

转载 作者:行者123 更新时间:2023-12-04 12:52:42 42 4
gpt4 key购买 nike

我研究了一段时间的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;
}

最佳答案

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

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

这就是您的示例中发生的情况。 max6875_read 是一个获取结构对象的回调。 kobject 是一个 i2c_client,它足以使用这里的 driver_data 指针与底层设备通信,允许取回与驱动程序相关的数据(例如,而不是使用全局变量)。

关于linux-kernel - 'i2c_get_clientdata"和 "i2c_set_clientdata"有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20775391/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com