Kernel
想要在 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)
有沒有人經歷過類似的事情?
在設備樹 (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 或由我禁用的其他外圍設備使用。上例中的所有引腳都成功下拉。