我有两个 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_device
和delete_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),
},
...
};