Kernel

想要在 gpio 引腳上下拉

  • February 22, 2021

我希望某些輸入引腳的預設值為弱下拉。我正在使用執行 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)

有沒有人經歷過類似的事情?

在設備樹 (dts) 中設置節點需要兼容的節點,例如 gpio-keys 或 gpio-leds。你不能像我試圖做的那樣僅僅組成一個節點。因為我需要的行是 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 或由我禁用的其他外圍設備使用。上例中的所有引腳都成功下拉。

引用自:https://unix.stackexchange.com/questions/424201