![想要在 GPIO 引脚上下拉](https://linux22.com/image/127734/%E6%83%B3%E8%A6%81%E5%9C%A8%20GPIO%20%E5%BC%95%E8%84%9A%E4%B8%8A%E4%B8%8B%E6%8B%89.png)
我希望某些输入引脚的默认值是弱下拉。我使用的是运行 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 或被我禁用的其他外设使用。上例中的所有引脚均已成功下拉。