Наложение дерева устройств устанавливает состояние GPIO по умолчанию при загрузке

#embedded-linux #gpio #bootloader #device-tree

Вопрос:

Я хочу использовать gpio для сброса внешнего устройства. Он будет сброшен при низком уровне GPIO. Я хочу установить значение по умолчанию, прежде чем устанавливать его с помощью своего пользовательского кода.

В моем dtsi у меня есть текущий контроллер GPIO:

 gpio1: gpio@30200000 {
    compatible = "fsl,imx8mm-gpio", "fsl,imx35-gpio";
    reg = <0x30200000 0x10000>;
    interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>,
                 <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <amp;clk IMX8MM_CLK_GPIO1_ROOT>;
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
    gpio-ranges = <amp;iomuxc 0 10 30>;
};

amp;iomuxc {
    pinctrl_gpio5: gpio5grp {
        fsl,pins = <
            /* SODIMM 216 Reset MCU sync */
            MX8MM_IOMUXC_GPIO1_IO00_GPIO1_IO0       0x034
        >;
    };
};
 

Чтобы установить значение по умолчанию, я сначала определил свинью в наложении дерева устройств:

 amp;gpio1 { 
    syncmcu_reset {
        gpio-hog;
        gpios = <0 GPIO_ACTIVE_LOW>;
        line-name = "MCU_RESET#"; 
        output-low;
        pinctrl-names = "default";
        pinctrl-0 = <amp;pinctrl_gpio5>;
    };
};
 

Значение GPIO установлено правильно, но я больше не могу изменять значение GPIO. Как правильно установить состояние GPIO по умолчанию без их блокировки?

Комментарии:

1. Я предполагаю, что вы используете U-Boot, затем включите там драйвер GPIO и установите значения PIN-кода на все, что вам нужно. В противном случае вам понадобится код типа файла платы в вашем ядре. Или вы можете сделать это из пользовательского пространства, хотя может быть уже слишком поздно.