Linux设备树(DTS):USB-I2C桥上的I2C设备

5

我有一个i2c设备(触摸控制器)。通常情况下,当连接到SoC i2c主机时(在我的情况下是Tegra芯片),我会像这样将其添加到.dts文件中:

    i2c@7000c000 {
            st1332: touchscreen@55 {
                    compatible = "sitronix,st1232";
                    reg = <0x55>;
                    interrupt-parent = <&gpio>;
                    interrupts = <189 IRQ_TYPE_EDGE_FALLING>;
            };       
    };

在SoC的.dtsi文件中定义了i2c控制器i2c@7000c000:

    i2c1: i2c@7000c000 {
            #address-cells = <1>;
            #size-cells = <0>;
            compatible = "nvidia,tegra124-i2c";
            reg = <0x0 0x7000c000 0x0 0x100>;
            interrupts = <0 38 0x04>;
            scl-gpio = <&gpio 20 0>; /* gpio PC4 */
            sda-gpio = <&gpio 21 0>; /* gpio PC5 */
            nvidia,memory-clients = <14>;
            status = "okay";
            clock-frequency = <400000>;
    };

然而,我不想将触摸控制器连接到SoC的i2c主控之一。相反,我将其连接到cp2112 USB至i2c桥上。

cp2112驱动程序正常工作:我可以使用诸如i2cget之类的命令从命令行访问它。但是,我该如何将它添加到.dts文件中,以便触摸控制器驱动程序与其通信?

由于USB设备会自动枚举,因此我没有在.dts文件中拥有可用作触摸控制器节点父节点的节点。我会假设需要在usb控制器(xusb@70090000)下的.dts文件中创建一个占位符节点,然后由内核将枚举的USB设备与该节点关联,并将触摸控制器移入此节点,但我不知道该怎么做。这样的USB设备节点会是什么样子?或者是否有完全不同的解决方案?

我正在运行Linux 3.10.40,使用来自Linux v4.1.0-rc5的hid-cp2112的回溯版本。

2个回答

3

当USB设备枚举时,hid-cp2112驱动程序被探测到时,它甚至不会尝试在设备树中查找自己。我已经创建了以下补丁来链接发现的cp2112设备到设备树中的/i2c@cp2112节点,这当然仅适用于只有一个USB上的cp2112芯片的情况。

diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
index 2bd7f97..fa88590 100644
--- a/drivers/hid/hid-cp2112.c
+++ b/drivers/hid/hid-cp2112.c
@@ -31,6 +31,8 @@
 #include <linux/module.h>
 #include <linux/nls.h>
 #include <linux/usb/ch9.h>
+#include <linux/of.h>
+#include <linux/of_i2c.h>
 #include "hid-ids.h"

 enum {
@@ -1014,6 +1016,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
    dev->adap.algo      = &smbus_algorithm;
    dev->adap.algo_data = dev;
    dev->adap.dev.parent    = &hdev->dev;
+   dev->adap.dev.of_node   = of_find_node_by_path("/i2c@cp2112");
    snprintf(dev->adap.name, sizeof(dev->adap.name),
         "CP2112 SMBus Bridge on hiddev%d", hdev->minor);
    init_waitqueue_head(&dev->wait);
@@ -1029,6 +1032,8 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)

    hid_dbg(hdev, "adapter registered\n");

+   of_i2c_register_devices(&dev->adap);
+
    dev->gc.label           = "cp2112_gpio";
    dev->gc.direction_input     = cp2112_gpio_direction_input;
    dev->gc.direction_output    = cp2112_gpio_direction_output;

.dts文件中触控控制器的条目如下所示:
    i2c@cp2112 {
            #address-cells = <1>;
            #size-cells = <0>;
            st1332: touchscreen@55 {
                    compatible = "sitronix,st1232";
                    reg = <0x55>;
                    interrupt-parent = <&gpio>;
                    interrupts = <189 IRQ_TYPE_EDGE_FALLING>;
            };
    };

2
作为参考,对于那些可能遇到类似问题的人们,请注意Clifford正在将cp2112驱动程序从Linux 4+回溯到v3.10.40
如果您查看i2c总线的内核源代码,似乎它们必须使用of_i2c_register_devices进行注册,但是从内核v3.12开始,这种需求被删除了。这就是为什么cp2112驱动程序不调用of_i2c_register_devices的原因。

自从v3.12之后就不需要这个了,那么我该如何找到连接的USB I2C总线的路径(例如/i2c@cp2112)?我正在使用i2c-tiny-usb,但在/proc/device-tree中找不到任何参考信息。 - hardillb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接