通过sysfs动态添加I2C设备时。是否还可以定义 I2C 设备附带的 GPIO 引脚?

通过sysfs动态添加I2C设备时。是否还可以定义 I2C 设备附带的 GPIO 引脚?

我有两个 I2C 设备想要连接到我的 Linux 设备。温度传感器 TMP117 通过将其写入/sys/bus/i2c/devices/i2c-x/new_device.另外,我想添加一个加速度计ADXL343。然而,当使用与 TMP117 相同的方法时,我收到一条错误,表示dmesg未找到中断的 GPIO。这也会影响 GPIO 扩展器,它需要我的应用程序的中断信号。

是否可以动态添加带有附加信号(例如中断)的 I2C 设备?

答案1

https://www.kernel.org/doc/Documentation/i2c/instantiating-devices接下来,您可以仅有的传递 I²C 地址作为参数。那么,内核如何知道中断线连接在哪条 GPIO 线上呢?

因此,包含更多硬件而不仅仅是 I²C 设备的复杂驱动程序不能以这种方式使用。

如果您知道硬件在启动时位于何处(或者即使您不知道 - 如今,您可以在运行时修改设备树),“正确”的方法可能是编写设备树条目(上述文档中的 1b)。如果这不是一个选择,您需要编写一个内核模块。

不过,好消息:ADI 的 Michael Hennerich(好人,如果你见到他请他喝杯咖啡)写了adxl34x司机(包含在上游 Linux 中),所以这实际上只是告诉你的内核(再次通过 devicetree)在 I²C 总线上的哪个地址找到 ADXL34x,以及在哪些中断线上监听。

答案2

正如你所读到的,Linux提供了4种实例化I2C设备的方法

由于 sysfs 接口仅提供 2 个属性文件(new_devicedelete_device),并且new_device仅接受 2 个参数(I2C 设备的名称和 I2C 设备的地址),恐怕您无法从用户态篡改 IRQ。

然而,自从 i2c_board_info结构提供一些 IRQ 设置 我建议您更喜欢通过总线号声明 I2C 设备,如中所述方法1a(参见第一个链接)使您能够精确定义结构,如给出的示例所示:

static struct i2c_board_info h4_i2c_board_info[] __initdata = {
    {
        I2C_BOARD_INFO("isp1301_omap", 0x2d),
        .irq        = OMAP_GPIO_IRQ(125),
    },
...
};

相关内容