GPIO 핀을 풀다운하고 싶습니다.

GPIO 핀을 풀다운하고 싶습니다.

일부 입력 핀의 기본값을 약한 풀다운으로 설정하고 싶습니다. 저는 데비안 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로 설정되거나 비활성화된 다른 주변 장치에서 사용되는 여러 핀이 있습니다. 위 예의 모든 핀은 성공적으로 당겨졌습니다.

관련 정보