想要在 GPIO 引脚上下拉

想要在 GPIO 引脚上下拉

我希望某些输入引脚的默认值是弱下拉。我使用的是运行 Debian 4.12.8 的 sama5d36。我修改了dts文件如下:

ahb {
    abp {
        pinctrl@fffff200 {
            board {
                pinctrl_inputs: input_pins {
                    atmel,pins = 
                        <AT91_PIOC 26 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOC 27 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOA 30 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOA 31 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>;
                };
            };
        };
    };
};

myInputs {
    compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_inputs>;
};

只是想补充一点,我确实在 /sys/kernel/debug/pinctrl/ahb:apb:pinctrl@fffff200/pinconf-pins 中看到 PULL_DOWN:

pin 30 (pioA30): PULL_DOWN|DRIVE_STRENGTH_MED
pin 31 (pioA31): PULL_DOWN|DRIVE_STRENGTH_MED
pin 90 (pioC26): PULL_DOWN|DRIVE_STRENGTH_MED
pin 91 (pioC27): PULL_DOWN|DRIVE_STRENGTH_MED

但 /sys/class/gpio/pioA30 仍然显示值 1:

direction -> in
active_low -> 0
value -> 1

其他引脚(PioA31、pioC26、pioC27)也相同。我不需要这个引脚处于低电平有效,我只是添加了它来显示输入为高电平,没有任何连接,这是我用示波器验证的。

更新:我添加了以下引脚,它们实际上可以工作:

                    <AT91_PIOD 6 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                    <AT91_PIOD 7 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>;

这让我更加困惑。我检查了 /sys/kernel/debug/pinctrl/ahb:apb:pinctrl@fffff200/pinmux-pins ,所有引脚显示如下:

pin 102 (pioD6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 103 (pioD7): (MUX UNCLAIMED) (GPIO UNCLAIMED)

有人经历过类似的事情吗?

答案1

在设备树 (dts) 中设置节点需要兼容节点,例如 gpio-keys 或 gpio-led。你不能像我试图做的那样只是组成一个节点。因为我需要的线路是 SPI BLE 的一部分,所以我将其添加到我的 spi1 节点,如下所示:

        spi1: spi@f8008000 {
            cs-gpios = <0>, <0>, <0>, <0>;
            pinctrl-0 = <&pinctrl_spi1 &pinctrl_ble_irq>;
            dmas = <0>, <0>;
            status = "okay";
            spidev@0 {
                compatible = "semtech,sx1301";
                spi-max-frequency = <10000000>;
                reg = <0>;
            };
        };

        pinctrl@fffff200 {
            board {
                pinctrl_ble_irq: ble_irq {
                    atmel,pins =
                        <AT91_PIOB 14 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOB 20 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOB 22 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOB 26 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOC 17 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOD 6 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOD 15 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOE 16 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOE 23 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOE 31 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>,
                        <AT91_PIOD 8 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_DOWN>;
                };
            };
        };

我仍然不知道为什么其他引脚不会下拉,但至少现在我的启动中没有出现错误。我必须在内核中打开 Earlyprintk 才能看到该消息。

更新:终于能够让下拉菜单工作了。硬件中的多个引脚被上拉,因此下拉无效。有几个引脚被设置为 LED 或被我禁用的其他外设使用。上例中的所有引脚均已成功下拉。

相关内容