Linux 设备树中的AM335x GPIO多路复用在内核加载期间重置

Linux 设备树中的AM335x GPIO多路复用在内核加载期间重置,linux,kernel,gpio,Linux,Kernel,Gpio,我想配置一组SoC引脚,将其用作GPIO输入或输出的默认值。我们正在使用am3352 SoC和类似于Beaglebone Black的定制板 我通过调试日志检查设备树是否正确解析 但当我在内核加载后检查时,我使用pinmuxed的所有GPIO都处于默认状态(即:所有都是输入,值为0) 我在设备树中设置的方向和默认值不存在。(重置?) 任何线索或帮助都将不胜感激 我决定在设备树中执行此pinmuxing操作,我的设备树条目如下所示 /*在am33xx.dtsi中,与Beaglebone Black

我想配置一组SoC引脚,将其用作GPIO输入或输出的默认值。我们正在使用am3352 SoC和类似于Beaglebone Black的定制板

我通过调试日志检查设备树是否正确解析

但当我在内核加载后检查时,我使用pinmuxed的所有GPIO都处于默认状态(即:所有都是输入,值为0)

我在设备树中设置的方向和默认值不存在。(重置?)

任何线索或帮助都将不胜感激

我决定在设备树中执行此pinmuxing操作,我的设备树条目如下所示

/*在am33xx.dtsi中,与Beaglebone Black中使用的文件相同*/

gpio0: gpio@44e07000 {
        compatible = "ti,omap4-gpio";
        ti,hwmods = "gpio1";
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
        reg = <0x44e07000 0x1000>;
        interrupts = <96>;
    };

    gpio1: gpio@4804c000 {
        compatible = "ti,omap4-gpio";
        ti,hwmods = "gpio2";
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
        reg = <0x4804c000 0x1000>;
        interrupts = <98>;
    };

    gpio2: gpio@481ac000 {
        compatible = "ti,omap4-gpio";
        ti,hwmods = "gpio3";
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
        reg = <0x481ac000 0x1000>;
        interrupts = <32>;
    };

    gpio3: gpio@481ae000 {
        compatible = "ti,omap4-gpio";
        ti,hwmods = "gpio4";
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
        reg = <0x481ae000 0x1000>;
        interrupts = <62>;
    };
gpio0:gpio@44e07000 {
compatible=“ti,omap4 gpio”;
ti,hwmods=“gpio1”;
gpio控制器;
#gpio细胞=;
中断控制器;
#中断单元=;
reg=;
中断=;
};
gpio1:gpio@4804c000 {
compatible=“ti,omap4 gpio”;
ti,hwmods=“gpio2”;
gpio控制器;
#gpio细胞=;
中断控制器;
#中断单元=;
reg=;
中断=;
};
gpio2:gpio@481ac000 {
compatible=“ti,omap4 gpio”;
ti,hwmods=“gpio3”;
gpio控制器;
#gpio细胞=;
中断控制器;
#中断单元=;
reg=;
中断=;
};
gpio3:gpio@481ae000 {
compatible=“ti,omap4 gpio”;
ti,hwmods=“gpio4”;
gpio控制器;
#gpio细胞=;
中断控制器;
#中断单元=;
reg=;
中断=;
};
/*然后在am335x-boneblack.dts文件中,我添加了以下内容*/

&am33xx_pinmux {
  gpio0_pins: gpio0_pins {
    pinctrl-single,pins = <                                                       
        0x144 (PIN_OUTPUT_PULLUP | MUX_MODE7)     /* RMII1_REF_CLK as GPIO out */
        0x158 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_spi0_d1 as GPIO out */              
        0x15c (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_spi0_cs0 as GPIO out */              
        /*0x160 (PIN_INPUT | MUX_MODE7)*/             /* pin conf_spi0_cs1 as GPIO input */              
    >;
  };

  gpio1_pins: gpio1_pins {
    pinctrl-single,pins = <                                                      
        0x050 (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_a4 as GPIO input */              
        0x054 (PIN_OUTPUT_PULLUP | MUX_MODE7)     /* pin conf_gpmc_a5 as GPIO out */              
        0x05c (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_a7 as GPIO input */              
        0x058 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_gpmc_a6 as GPIO out */              
        0x060 (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_a8 as GPIO input */              
        0x064 (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_a9 as GPIO input */              
        /*0x068 (PIN_OUTPUT_PULLUP | MUX_MODE7)*/     /* pin conf_gpmc_a10 as GPIO out */              
        0x06c (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_a11 as GPIO input */              
        /*0x078 (PIN_OUTPUT_PULLUP | MUX_MODE7)*/     /* pin gpmc_ben1 as GPIO out */              
        0x080 (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_csn1 as GPIO input */              
        0x084 (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_csn2 as GPIO input */              
    >;
  };

  gpio2_pins: gpio2_pins {
    pinctrl-single,pins = <                                                      
        0x088 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_gpmc_csn3 as GPIO output */              
        0x08c (PIN_INPUT | MUX_MODE7)             /* pin conf_gpmc_csn3 as GPIO input */              
        0x0a4 (PIN_OUTPUT_PULLUP | MUX_MODE7)     /* pin conf_lcd_data1 as GPIO out */              
        0x0a8 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_lcd_data2 as GPIO out */              
        0x0b0 (PIN_INPUT | MUX_MODE7)             /* pin conf_lcd_data4 as GPIO input */              
        0x0b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_lcd_data5 as GPIO out */              
        0x0b8 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_lcd_data6 as GPIO out */              
        0x0bc (PIN_OUTPUT_PULLDOWN | MUX_MODE7)   /* pin conf_lcd_data7 as GPIO out */              
        0x0e8 (PIN_INPUT | MUX_MODE7)             /* pin conf_lcd_pclk as GPIO input */              
        0x0e0 (PIN_INPUT | MUX_MODE7)             /* pin conf_lcd_vsync as GPIO input */              
    >;
  };

  gpio3_pins: gpio3_pins {
    pinctrl-single,pins = <                                                      
        /*0x1a0 (PIN_OUTPUT_PULLUP | MUX_MODE7)*/   /* pin conf_mcasp0_aclkr as GPIO out */              
        0x1a4 (PIN_INPUT | MUX_MODE7)   /* pin conf_mcasp0_fsr as GPIO input */              
        0x1a8 (PIN_INPUT | MUX_MODE7)   /* pin conf_mcasp0_axr1 as GPIO input */              
    >;
  };
};

&gpio0{
    ti,gpio-always-on;
    pinctrl-names = "default";
    pinctrl-0 = <&gpio0_pins>;
    status = "okay";
};

&gpio1{
    ti,gpio-always-on;
    pinctrl-names = "default";
    pinctrl-0 = <&gpio1_pins>;
    status = "okay";
};

&gpio2{
    ti,gpio-always-on;
    pinctrl-names = "default";
    pinctrl-0 = <&gpio2_pins>;
    status = "okay";
};

&gpio3{
    ti,gpio-always-on;
    pinctrl-names = "default";
    pinctrl-0 = <&gpio3_pins>;
    status = "okay";
};
&am33xx\u pinmux{
gpio0_引脚:gpio0_引脚{
pinctrl单端,引脚=<
0x144(引脚输出上拉多路复用模式7)/*RMII1参考时钟作为GPIO输出*/
0x158(引脚输出下拉|多路复用器模式7)/*引脚配置为GPIO输出的spi0\U d1*/
0x15c(引脚输出下拉|多路复用器模式7)/*引脚配置(spi0)cs0作为GPIO输出*/
/*0x160(PIN_输入| MUX_模式7)*/*PIN配置_spi0_cs1作为GPIO输入*/
>;
};
gpio1_引脚:gpio1_引脚{
pinctrl单端,引脚=<
0x050(PIN_输入| MUX_模式7)/*PIN配置_gpmc_a4作为GPIO输入*/
0x054(引脚输出上拉|多路复用模式7)/*引脚配置gpmc a5作为GPIO输出*/
0x05c(引脚输入|多路复用模式7)/*引脚配置gpmc_a7作为GPIO输入*/
0x058(引脚输出下拉|多路复用器模式7)/*引脚配置(gpmc)a6作为GPIO输出*/
0x060(PIN_输入| MUX_模式7)/*PIN配置_gpmc_a8作为GPIO输入*/
0x064(PIN_输入| MUX_模式7)/*PIN配置_gpmc_a9作为GPIO输入*/
/*0x068(引脚输出上拉|多路复用模式7)*/*引脚配置gpmc作为GPIO输出*/
0x06c(引脚输入|多路复用模式7)/*引脚配置_gpmc_a11作为GPIO输入*/
/*0x078(引脚输出上拉|多路复用器模式7)*/*引脚gpmc_ben1作为GPIO输出*/
0x080(PIN_输入| MUX_模式7)/*PIN配置_gpmc_csn1作为GPIO输入*/
0x084(PIN_输入| MUX_模式7)/*PIN配置_gpmc_csn2作为GPIO输入*/
>;
};
gpio2_引脚:gpio2_引脚{
pinctrl单端,引脚=<
0x088(引脚输出下拉|多路复用模式7)/*引脚配置gpmc作为GPIO输出的csn3*/
0x08c(引脚输入|多路复用模式7)/*引脚配置(gpmc)csn3作为GPIO输入*/
0x0a4(引脚输出上拉|多路复用模式7)/*引脚配置lcd数据1作为GPIO输出*/
0x0a8(引脚输出下拉|多路复用器模式7)/*引脚配置lcd数据2作为GPIO输出*/
0x0b0(引脚输入|多路复用模式7)/*引脚配置lcd数据4作为GPIO输入*/
0x0b4(引脚输出下拉|多路复用器模式7)/*引脚配置lcd数据5作为GPIO输出*/
0x0b8(引脚输出下拉|多路复用器模式7)/*引脚配置lcd数据6作为GPIO输出*/
0x0bc(引脚输出下拉|多路复用器模式7)/*引脚配置lcd数据7作为GPIO输出*/
0x0e8(引脚输入|多路复用模式7)/*引脚配置lcd _pclk作为GPIO输入*/
0x0e0(引脚输入|多路复用模式7)/*引脚配置液晶显示作为GPIO输入的vsync*/
>;
};
gpio3_引脚:gpio3_引脚{
pinctrl单端,引脚=<
/*0x1a0(引脚输出上拉|多路复用模式7)*/*引脚配置mcasp0作为GPIO输出的aclkr*/
0x1a4(PIN|U输入| MUX|U模式7)/*PIN配置_mcasp0_fsr作为GPIO输入*/
0x1a8(引脚输入|多路复用模式7)/*引脚配置MCASP0AXR1作为GPIO输入*/
>;
};
};
&gpio0{
ti,gpio始终打开;
pinctrl names=“默认”;
pinctrl-0=;
status=“好”;
};
&gpio1{
ti,gpio始终打开;
pinctrl names=“默认”;
pinctrl-0=;
status=“好”;
};
&gpio2{
ti,gpio始终打开;
pinctrl names=“默认”;
pinctrl-0=;
status=“好”;
};
&gpio3{
ti,gpio始终打开;
pinctrl names=“默认”;
pinctrl-0=;
status=“好”;
};

我遇到了类似的问题,当我在引导加载程序中配置gpio时,gpio在内核启动时被重置,并找到了不同的解决方案

我遇到的解决方案是在设备树中

    &gpio0 {
       ti,no-reset-on-init;
    };

这停止了初始化进程重置gpio模块。我必须将此选项添加到两个gpio模块中,以保持引导加载程序设置的状态。

SoC不仅仅是CPU。是否已为启用调试
    &gpio0 {
       ti,no-reset-on-init;
    };