【问题标题】:gpio-keys not working in combination with I/O expander driver gpio-pca953x (TCA6416A)gpio-keys 不能与 I/O 扩展器驱动程序 gpio-pca953x (TCA6416A) 结合使用
【发布时间】:2021-08-26 08:32:55
【问题描述】:

我想借助 DT 覆盖在我的 Raspberry Pi3 B+ Linux 中集成/加载 gpio-pca953x 驱动程序。该驱动程序是通用 I²C 控制的 I/O 扩展器 gpio 驱动程序,适用于各种芯片,即 TCA6416。我设法创建了一个启用驱动程序的 dts 覆盖。

/dts-v1/;
/plugin/;
/ {
        compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";

        fragment@0 {
                target = <&i2c1>;
                __overlay__ {
                        status = "okay";
                };
        };

        fragment@1 {
                target = <&i2c1>;
                __overlay__ {
                        #address-cells = <1>;
                        #size-cells = <0>;

                        tca6416: tca6416@20 {
                                compatible = "ti,tca6416";
                                reg = <0x20>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-parent = <&gpio>;
                                interrupts = <18 0x02>; //IRQ_TYPE_EDGE_FALLING
                        };
                };
        };
};

有一个新的 gpiochip /sys/class/gpio/gpiochip488 并且中断似乎也可以工作。

我认为下一个简单的步骤是在gpio-keys 模块的帮助下创建一个虚拟输入设备。不过好像我错了。

我像这样创建了另一个 DT 叠加层:

    fragment@1 {
            target-path = "/soc";
            __overlay__ {
                    gpio: gpio-button {
                            compatible = "gpio-keys";
                            autorepeat;
                            button@14 {
                                    label = "TestKey";
                                    linux,code = <14>;
                                    gpios = <&tca6416 0 1>;
                            };
                    };
            };
    };

但这一次,这个叠加层永远无法加载。我得到的错误总是在实时设备树符号表中找不到符号 tca6416 。我在这里做错了什么?有没有工作的例子?我还尝试用 gpio488 或任何其他可能的名称替换上面 gpios 中的 tca6416。两者都不起作用。

【问题讨论】:

  • 第一个叠加层是用-@(或--symbols)命令行选项编译的吗?
  • 我都用 -@ 选项编译了。
  • 如果将它们放在一个叠加层中,它会起作用吗?
  • 我想知道第一个叠加层中的符号是否被调整为引用活动树,或者它们是否仍然引用活动树中的fragment@1。您能否列出系统上的活动设备树并检查tca6416 是否出现在__symbols__ 节点中,它指的是什么?
  • No tca6416 不会出现在活动树中的__symbols__ 中。经过多次测试后,我设法找到了一个可行的解决方案,但不使用覆盖,而是修改 dts 文件。我会尽快相应地更改我的帖子。 可能是命名问题,tca6416: tca6416@20 应该是 tca6416_20: tca6416@20 我的第一次测试表明至少是这样。

标签: linux raspberry-pi linux-device-driver gpio device-tree


【解决方案1】:

似乎问题在于它以某种方式自身的 DTS 覆盖机制。 tca6416 永远不会导出为活动树中的符号。我的解决方案是使用叠加层,而是在 bcm2710-rpi-3-b-plus.dts 等主要 DTS 文件之一中包含 DTS 文件。

此包含文件包含:

&i2c1 {
      tca6416_20: tca6416@20 {
              compatible = "ti,tca6416";
              #gpio-cells = <2>;
              reg = <0x20>;
              gpio-controller;
              interrupt-parent = <&gpio>;
              interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
              reset-gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
      };
};

这按预期工作,gpio-keys 也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2013-04-08
    相关资源
    最近更新 更多