代码之家  ›  专栏  ›  技术社区  ›  Bart

在一个驱动程序模块中处理多个i2c_客户端(带sysfs)

  •  1
  • Bart  · 技术社区  · 7 年前

    在一个项目中,我只有一个传感器,在其他项目中,只有两个传感器。我希望我的内核模块能够支持N个传感器,而不是固定数量的传感器。我在管理1个以上的struct i2c_客户端并为每个客户端创建sysfs条目方面存在问题。我是这样做的:

    1. probe() 我得到的函数 struct i2c_client* I2C_BOARD_INFO() 对于

    2. kobject_create_and_add("tmp102", kernel_kobj) 获取中模块的主目录 系统文件系统

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

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

    在这个函数中,我想通过I2C进行读取。问题是。。。我不知道怎么拿到 struct i2c_client * 输入,I2C地址在那里!

    我应该如何正确地“链接”i2c_客户端 条目,以便我可以获得函数中的I2C地址?

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

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

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

    i2c_client

    编辑:

    struct device_attribute attribute s、 据我所知,获得 struct device 使用常规属性时的指针,与 struct i2c_client . 它们不容易与 kobject /sys/kernel ,其中我需要具有此项目的属性。 device_attribute /sys/devices -我用过 sysfs_create_group 并链接了我的设备 kobject公司 device_属性 组我用过 sysfs_create_link ,并链接我的设备的 kobject公司 /sys/kernel/tmp102 . 这样,我可以为每个设备创建一个文件夹(链接),指向中的原始属性文件夹

    1 回复  |  直到 7 年前
        1
  •  2
  •   Alexandre Belloni    7 年前

    drivers/hwmon/tmp102.c .

    现在,对于你的问题,你有一个 struct kobject kobj_to_dev() 获取指向设备的指针。例如,你可以使用 dev_get_drvdata() dev_set_drvdata() 在你的探测器里。

    drivers/rtc/rtc-ds1343.c 但它使用的是spi\U驱动程序。