gpt4 book ai didi

linux - 在一个驱动模块中处理多个 i2c_clients(使用 sysfs)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:11 24 4
gpt4 key购买 nike

我想为 tmp102 温度传感器创建一个内核驱动程序。在一个项目中,我只有 1 个传感器,而在另一个项目中,我有 2 个传感器。我希望我的内核模块能够支持 N​​ 个传感器,而不是固定数量。我在管理超过 1 个 struct i2c_client 并为每个 struct i2c_client 创建 sysfs 条目时遇到问题。这是我的做法:

  1. probe() 函数中,我为每个提供 I2C_BOARD_INFO() 的设备获取 struct i2c_client* .

  2. 然后我 kobject_create_and_add("tmp102", kernel_kobj) 获取 sysfs 中模块的主目录。

  3. 我正在为每个设备创建 sysfs_create_group(),它获取指向静态创建的属性的指针。这些属性将 (*show)()(*store)() 指针设置为静态函数,例如

    static ssize_t tmp102_sysfs_thigh_get_one(struct kobject *kobj, struct kobj_attribute *attr, char *buf)

在这个函数中,我想通过 I2C 读取。问题是...我不知道如何为应该以某种方式链接到此 sysfs 条目的设备获取 struct i2c_client *,I2C 地址是那里!

我应该如何正确地将 i2c_client 与 sysfs 条目“链接”起来,以便我可以获得函数内部的 I2C 地址?

理想情况下,我希望只有一组函数(每个属性一个)。 sysfs 树应该是这样的:

  /sysfs/kernel/tmp102
|
|-> <hex i2c address, e.g. /48>
| |
| |-> temperature
|
|
|-> /49
|
|-> temperature

我希望两个“温度”属性都使用相同的函数,该函数能够确定它应该写入的 I2C 地址。

或者我的架构完全错误?如果是这样,对于需要处理多个 i2c_client 的驱动程序来说应该是什么样子?

编辑:

我决定使用 struct device_attribute 而不是常规的 attribute。据我了解,使用常规属性时,获取struct device指针并不容易,与struct i2c_client一样。它们不容易与 /sys/kernel 中的 kobject“链接”,我需要在该项目中拥有我的属性。 device_attribute 可以在 /sys/devices 中找到 - 我使用了 sysfs_create_group 并将我设备的 kobjectdevice_attribute 组。我使用了 sysfs_create_link,并将我设备的 kobject/sys/kernel/tmp102 链接起来。这样我就可以为每个设备创建一个文件夹(链接),它指向 /sys/devices 中的原始属性文件夹。

最佳答案

首先,您应该知道已经有一个具有 sysfs 接口(interface)的 tmp102 内核驱动程序。看看drivers/hwmon/tmp102.c .

现在,对于您的问题,您有一个传递给您的 sysfs 回调的 struct kobject。您可以调用 kobj_to_dev() 来获取指向设备的指针。然后,例如,您可以使用 dev_get_drvdata() 获取指向您自己的私有(private)结构的指针,该结构将包含指向 i2c 客户端的指针。不要忘记首先在您的探测器中使用 dev_set_drvdata() 设置它。

您可以在 drivers/rtc/rtc-ds1343.c 中找到示例但它使用的是 spi_driver。

关于linux - 在一个驱动模块中处理多个 i2c_clients(使用 sysfs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46283121/

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