我怎样才能 select 使用设备树文件的 pin 的新模式?

How can I select a new mode for a pin using a device tree file?

我正在 iMX6 Wandboard ARM computer 上开发。 Wandboard 的默认配置仅提供 8 个 GPIO 引脚供使用,但 iMX6 有更多可用引脚,可以从当前设置切换到 GPIO 模式。我的项目需要更多 GPIO,为此我一直在尝试更改某些引脚上的模式。

我能够修改 iMX6/wandboard 设备树文件并将其编译成 DTB 并在我的设备上使用它(我通过禁用 HDMI 输出进行测试)但我还没有想出如何改变一些从当前设置到 GPIO 模式的引脚。

我目前正在尝试将 DISP0 显示(下面 pinfunc.h 中的 MX6QDL_PAD_DISP0_DAT0 - DAT23)切换到 GPIO 模式,因为这些引脚在开发板上的接头上可用。我目前正在尝试使用 imx6qdl-wandboard.dsti:

中的这些引脚
&iomuxc {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hog_1>;

        /* other fields unchanged */
        gpio {
            pinctrl_gpio: gpiogrp {
                fsl,pins = <
                    MX6QDL_PAD_EIM_DA12__GPIO3_IO12   0x4001b0b0 /* GPIO3_12 EDM pin 255 */
                    MX6QDL_PAD_EIM_DA11__GPIO3_IO11   0x4001b0b0 /* GPIO3_11 EDM pin 256 */
                    MX6QDL_PAD_EIM_DA10__GPIO3_IO10   0x4001b0b0 /* GPIO3_10 EDM pin 257 */
                    MX6QDL_PAD_EIM_D27__GPIO3_IO27    0x4001b0b0 /* GPIO3_27 EDM pin 258 */
                    MX6QDL_PAD_EIM_D26__GPIO3_IO26    0x4001b0b0 /* GPIO3_26 EDM pin 259 */
                    MX6QDL_PAD_EIM_BCLK__GPIO6_IO31   0x4001b0b0 /* GPIO6_31 EDM pin 260 */
                    MX6QDL_PAD_EIM_DA8__GPIO3_IO08    0x4001b0b0 /* GPIO3_8  EDM pin 261 */
                    MX6QDL_PAD_ENET_RX_ER__GPIO1_IO24 0x4001b0b0 /* GPIO1_24 EDM pin 262 */
                    MX6QDL_PAD_GPIO_19__GPIO4_IO05    0x4001b0b0 /* GPIO4_5  EDM pin 263 */
                    MX6QDL_PAD_SD3_RST__GPIO7_IO08    0x4001b0b0 /* GPIO7_8  EDM pin 264 */
                    /* my added pins */
                    MX6QDL_PAD_DISP0_DAT0__GPIO4_IO21 0x4001b0b0 /* GPIO4_21 GPIO117 JP1-1*/
                    MX6QDL_PAD_EIM_D21__GPIO3_IO21    0x4001b0b0 /* GPIO3_21 GPIO85 JP2-9 */
                >;
            };
       };
};

我首先尝试在 imx6qdl-wandboard.dtsi 中的 &ipu2 上使用 status = "disabled"; 字段,但这不允许我通过 /sys/class/gpio 界面更改值。也没有完全删除 ipu2&iomuxc 块。我不知道接下来要尝试什么。我 90% 确定这些引脚可以用于我正在尝试的目的,但这种配置超出了我的知识范围。

来自魔杖板的相关文件Linux来源

好消息,我终于可以在我选择的一些引脚上设置 GPIO 模式了。

我认为魔杖板 dtsi 文件中的 &iomuxc gpio 节点在某种程度上是不可更改的,或者仅支持已在其组下列出的少数引脚。我花了很多时间尝试禁用不同的功能并重新使用该节点下的相应引脚,但没有结果。

基于他们的 saber iMX6 板的 this post on the Boundary Devices blog and a device tree file,我决定尝试创建我自己的额外 hog 组并且它起作用了。我添加了一个新的 &iomuxc 块并覆盖了 pinctrl-0 列表以包含我自己的 hoggrp(已经有一个 hoggrp-1 所以我只做了我的 hoggrp-2)。

/* at the end of imx6qdl-wandboard.dtsi */
&iomuxc {
    pinctrl-names = "default";
    pinctrl-0 = <
        &pinctrl_hog_1
        &wes_gpios
    >;

    imx6qdl-wandboard {
        wes_gpios: hoggrp-2 {
            fsl,pins = <
                MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25 0x4001b0b0 /* GPIO1_25 test point lead */
                MX6QDL_PAD_DISP0_DAT0__GPIO4_IO21  0x4001b0b0 /* GPIO4_21 GPIO117 JP1-1*/
                MX6QDL_PAD_GPIO_5__GPIO1_IO05      0x4001b0b0 /* gpio5 jp2-17 */
                MX6QDL_PAD_GPIO_16__GPIO7_IO11     0x4001b0b0 /* gpio203 jp2-15 */
            >;
        };
    };
};

我在这个组中使用的每个引脚都按预期在 sysfs 中工作,尽管使用我问题代码中的 EIM_D21 引脚覆盖了为 HDMI 传输 EDID 数据的 i2c 接口,禁用显示器。不过,任何未使用的引脚都可以使用。

(如果有人能告诉我 "hog" 是什么,我很想听听。)