This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/PROCESSOR-SDK-AM335X:在引导时禁用 IO 复位

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584899/linux-processor-sdk-am335x-disable-io-reset-at-boottime

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

您好!

我已通过函数"GPIO_SET_VALUE (GPIO、val)"将 u-boot 板文件中的 GPIO 引脚设置为"高电平"
这在内核启动期间达到内核消息"Initializing cgroup Subsys IO"之前正常工作。
之后、GPIO 引脚为"低电平"。

如何避免 IO 复位?


BR
Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、

    查看此主题:
    e2e.ti.com/.../2147766

    通过此处所示的 u-boot 和 DTS 配置、我能够使 GPIO 在整个启动过程(从 MLO 到 Linux 命令行)中保持其状态。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    感谢您通过启用上拉电阻器来实现此权变措施。 是否可以使 GPIO 在整个引导过程中保持其状态(由"GPIO_SET_Value"设置)?

    BR
    Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、

    不、我认为每次 u-boot 将控制权传递给 Linux 内核时、GPIO 状态都会复位、因为内核驱动程序会重新配置 GPIO 控制器(我需要进一步挖掘源代码)。
    通过配置引脚多路复用器(内部上拉电阻器)、您可以获得稳定的 I/O 单元状态。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    我在 PWM 生成(ePWM-Module)时面临相同的问题。 但有时 PWM 输出不会复位。

    G、Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    [报价]但有时 PWM 输出不会复位[/报价]

    因此、您需要在 u-boot 和 Linux 内核之间重置 PWM 引脚、对吧?
    您将哪些引脚用于 PWM?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!
    不应复位 PWM 引脚。
    引脚:GPMC_A2 (ehrpwm1a)、spi0_SCLK (ehrpwm0a)、spi0_d0 (ehrpwm0b)、GPMC_A3 (ehrpwm1b)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    您对如何解决问题有什么建议吗?

    BR
    Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、

    我没有时间测试这个... 抱歉。

    您是否尝试配置 u-boot 中的引脚以及 linuc 内核?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    是的、我是这样做的。

    control_module 的寄存器 pwmss_ctrl、CM_PER_EPWMSS0_CLKCTRL 和 CM_PER_EPWMSS1_CLKCTRL 在内核启动期间复位为默认值:
    pwmss_ctrl (0x44E1_0664):0x00000000
    CM_PER_EPWMSS0_CLKCTRL (0x44E0_00D4):0x00030000
    CM_PER_EPWMSS1_CLKCTRL (0x44E0_00CC):0x00030000

    PWM 子系统0和1的寄存器不变。

    BR
    Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也面临同样的问题: e2e.ti.com/.../2040522

    到目前为止还没有解决办法

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为目录/board-support/linux-4.4.32.../arch/arm/mach-omap2中的内容必须更改
    请访问 e2e.ti.com/.../202539
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您可以共享 DTS 节点吗? 我是指 ehrpwm pinmux 设置和 PWM 节点。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    DTS-file 的相关部分:

    #include
    #include
    #include "skelin.dtsi"

    /{
    (笑声)
    OCP:OCP{
    兼容="简单总线";
    #address-cells =<1>;
    大小单元格=<1>;
    范围;
    ti、hwmods ="l3_main";
    (笑声)
    epwms0:epwmss@48300000{
    兼容="ti、am33xx-pwms";
    REG =<0x48300000 0x10>;
    ti、hwmonds ="epwmss0";
    #address-cells =<1>;
    大小单元格=<1>;
    STATUS ="禁用";
    范围=<0x48300100 0x48300100 0x80 //* ECAP *
    0x48300180 0x48300180 0x80 // eQEP *
    0x48300200 0x48300200 0x80>;/* EHRPWM */

    ecap0:ECAP@48300100{
    兼容="ti、am3352-ecap"、
    "TI、am33xx-ECAP";
    #PWM-Cells =<3>;
    REG =<0x48300100 0x80>;
    时钟=<&l4ls_gclk>;
    时钟名称="Fck";
    中断=<31>;
    中断名称="ecap0";
    STATUS ="禁用";
    };

    ehrpwm0:PWM@48300200{
    兼容="ti、am3352-ehrpwm"、
    "TI、am33xx-ehrpwm";
    #PWM-Cells =<3>;
    REG =<0x48300200 0x80>;
    时钟=<&ehrpwm0_TBCLK>、<&l4ls_gclk>;
    时钟名称="TBCLK"、"fck";
    STATUS ="禁用";
    };
    };

    epwms1:epwmss@48302000{
    兼容="ti、am33xx-pwms";
    REG =<0x48302000 0x10>;
    ti、hwmonds ="epwmss1";
    #address-cells =<1>;
    大小单元格=<1>;
    STATUS ="禁用";
    范围=<0x48302100 0x48302100 0x80 // ECAP */
    0x48302180 0x48302180 0x80 // eQEP */
    0x48302200 0x48302200 0x80>;// EHRPWM */

    eCAP1:ECAP@48302100{
    兼容="ti、am3352-ecap"、
    "TI、am33xx-ECAP";
    #PWM-Cells =<3>;
    REG =<0x48302100 0x80>;
    时钟=<&l4ls_gclk>;
    时钟名称="Fck";
    中断=<47>;
    中断名称="eCAP1";
    STATUS ="禁用";
    };

    ehrpwm1:PWM@48302200{
    兼容="ti、am3352-ehrpwm"、
    "TI、am33xx-ehrpwm";
    #PWM-Cells =<3>;
    REG =<0x48302200 0x80>;
    时钟=<&ehrpwm1_TBCLK>、<&l4ls_gclk>;
    时钟名称="TBCLK"、"fck";
    STATUS ="禁用";
    };
    };
    };
    (笑声)
    am33xx_pinmux{(am33xx_pinmux)}
    pinctrl-names ="default";
    pinctrl-0 =<&clkout2_pin>;
    (笑声)
    ehrpwm0_pins:ehrpwm0_pins{
    pinctrl-single、pins =<
    0x150 (PIN_OUTPUT | MUX_MODE3)/* P9_22、A17 */
    0x154 (PIN_OUTPUT | MUX_MODE3)/* P9_21、B17 */
    >;
    };
    ehrpwm0_PINS_SLEEP:ehrpwm0_PINS_SLEEP{
    pinctrl-single、pins =<
    0x150 (PIN_INPUT_PULLDOWN | MUX_MODE3)/* P9_22、A17 */
    0x154 (PIN_INPUT_PULLDOWN | MUX_MODE3)/* P9_21、B17 */
    >;
    };

    ehrpwm1_pins:ehrpwm1_pins{
    pinctrl-single、pins =<
    0x48 (PIN_OUTPUT | MUX_MODE6)/* P9_14、U14 */
    0x4C (PIN_OUTPUT | MUX_MODE6)/* P9_16、T14 */
    >;
    };
    ehrpwm1_PINS_SLEEP:ehrpwm1_PINS_SLEEP{
    pinctrl-single、pins =<
    0x48 (PIN_INPUT_PULLDOWN | MUX_MODE6)/* P9_14、U14 */
    0x4C (PIN_INPUT_PULLUX | MUX_MODE6)/* P9_16、T14 */
    >;
    };
    (笑声)
    };
    (笑声)
    epwms0{(&E)
    状态="正常";

    ehrpwm0:PWM@48300200{
    状态="正常";
    pinctrl-names ="default";
    pinctrl-0 =<&ehrpwm0_PINs>;
    pinctrl-1 =<&ehrpwm0_PINS_SLEEP>;
    };
    };

    epwms1{(&E)
    状态="正常";

    ehrpwm1:PWM@48302200{
    状态="正常";
    pinctrl-names ="default";
    pinctrl-0 =<&ehrpwm1_PINs>;
    pinctrl-1 =<&ehrpwm1_PINs_sleep>;
    };
    };
    (笑声)
    OCP{(&O)
    pwmdriver@0{
    兼容="PWM 驱动器";
    (笑声)
    状态="正常";

    epwm0{
    PWM =<&ehrpwm0 25000 0>;// PWM 周期、单位 ns
    };
    epwm1{
    PWM =<&ehrpwm1 0 25000 0>;// PWM 周期、单位 ns
    };
    };
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否尝试在 arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c 文件中将以下行添加到 am33xx_epwms0_hwmod 和 am33xx_epwmss1_hwmod 结构中:
    flags = HWMOD_INIT_NO_RESET、

    与您的其他参考帖子之一引用的承诺类似(http://arago-project.org/git/projects/?p=linux-am33x.git;a=commit;h=0c2a044c5368a0ba37d103bb56cc841cc12fb63a)。

    Jason Reeder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    关于 EHRPWM1引脚的 I/O 复位的说明。 我使用 BBB 上的配置测试了这一点、探测了 P9_14 (EHRPWM1A)。 以下是我的修改:
    1. U-boot 修改:
    -in board/ti/am335x/mux.c:
    静态结构 MODULE_PIN_mux uart5_PIN_mux[]={
    {offset (LCD_data9)、(mode (4)| PULLUP_EN | RXACTIVE)}、/* UART5_RXD *
    {offset (LCD_data8)、(mode (4)| PULLUUDEN)}、/* UART5_TXD *
    {-1}、
    };

    +静态结构 MODULE_PIN_mux GPIO0_20_PIN_mux[]={
    +{offset (xdma_event_intr1)、(mode (7)| PULLUDEN)}、//与 PULLUP_EN 良好配合使用、使用 PULLUDEN 进行测试
    +{-1}、
    +};

    +静态结构 module_pin_mux ehrpwm1_pin_mux[]={
    +{offset (GPMC_A2)、(MODE (6)| PULLUG_EN)}、
    +{-1}、
    +};
    ===========
    CONFIG_MODULE_PIN_mux (uart3_PIN_mux);


    + void enable_ehrpwm1_pin_mux (void)
    +{
    + CONFIG_MODULE_PIN_mux (ehrpwm1_PIN_mux);
    +}

    + void enable_GPIO0_20_pin_mux (void)
    +{
    + CONFIG_MODULE_PIN_mux (GPIO0_20_PIN_mux);
    +}

    ===========
    CONFIG_MODULE_PIN_mux (mmc0_PIN_mux);
    + CONFIG_MODULE_PIN_mux (GPIO0_20_PIN_mux);
    + CONFIG_MODULE_PIN_mux (ehrpwm1_PIN_mux);

    -in board/ti/am335x/board.c:
    void set_UART_mux_conf (void)

    + ENABLE_GPIO0_20_PIN_mux ();
    + enable_ehrpwm1_pin_mux ();


    2. Linux 内核修改:
    -在 arch/arm/boot/dts/AM335x-bone-common.dtsi 中:
    am33xx_pinmux{(am33xx_pinmux)}
    pinctrl-names ="default";
    + pinctrl-0 =<&GPIO0_PINs>;

    ===========
    + GPIO0_Pins:GPIO0_Pins{
    + pinctrl-single、pins =<
    + 0x1b4 (PIN_OUTPUT 上拉| MUX_MODE7)
    +>;
    +};

    + ehrpwm1_pins:ehrpwm1_pins{
    + pinctrl-single、pins =<
    + 0x48 (PIN_OUTPUT | MUX_MODE6)/* P9_14、U14 */
    + 0x4C (PIN_OUTPUT | MUX_MODE6)/* P9_16、T14 */
    +>;
    +};

    ===========
    + epwms1{(&E)
    + STATUS ="确定";

    + ehrpwm1:PWM@48302200{
    + STATUS ="确定";
    + pinctrl-names ="default";
    + pinctrl-0 =<&ehrpwm1_PINs>;
    +};
    +};

    正如我说过的、我使用示波器探测 P9_14 (EHRPWM1A)、并且在整个启动过程(u-boot 和 Linux 内核)中引脚一直处于低电平状态。 为了确保这些设置已经生效、我在两个阶段都检查了寄存器值:
    U-boot:
    => MD 0x44E10848
    44e10848:00000006 //=>conf_GPMC_A2设置为 MUXMODE6、禁用 PULLUPDOWN。

    内核:
    root@AM335x-EVM:~# devmem2 0x44E10848
    /dev/mem 已打开。
    映射到地址 bb6f37000的内存。
    在地址0x44E10848 (bb6f37848)读取:0x0000000E //==>conf_GPMC_A2设置为 MUXMODE6、启用 PULLUPDOWN
    选择//下拉

    我将按照 Jason 的建议、使用.flags = HWMOD_INIT_NO_RESET 进行检查、以验证寄存器是否也未复位。

    此致、
    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Jason、

    我已经添加了此行。 这没什么帮助。
    我会再次检查这个...

    谢谢、
    Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Stefan、

    您监控的寄存器:
    pwmss_ctrl (0x44E1_0664):0x00000000
    CM_PER_EPWMSS0_CLKCTRL (0x44E0_00D4):0x00030000
    CM_PER_EPWMSS1_CLKCTRL (0x44E0_00CC):0x00030000
    不是 pwmss 寄存器。 第一个 PWMS_CTRL 属于控制模块、以下两个寄存器 CM_PER_EPWMSS0_CLKCTRL 和 CM_PER_EPWMSS1_CLKCTRL 是 PRCM 的一部分、因此我认为这是为什么在 OMAP-HW33mod_hw33xx_ip块 的 PWMSS 结构中使用.flags = HWMOD_INIT_NO_RESET 不会影响上述数据块的原因。

    根据我的经验、PRCM 寄存器设置为 MODULEMODE = 0x2 (ENABLE:模块被显式启用)=> 0x00030002、仅当您从 sysfs 启动 pwmss 时。 如果您没有在 EHRPWM1A/EHRPWM1B 引脚上输出 PWM 脉冲、模块将保持禁用状态。

    编辑:如果 在 u-boot 中设置了 CTRL_MODULE 寄存器、pwmss_ctrl (0x44E1_0664)应保留其状态。 您是否在 u-boot 中的任何位置配置 PWMSS_CTRL 寄存器?


    此致、
    Yordan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Stefan、

    还有一件事要尝试。 能否将以下两个属性添加到 epwms0和 epwms1设备树节点:

    TI、无空闲启动;

    TI、no-reset-on-init;

    例如

    epwms0:epwmss@48300000{

    (笑声)

    ti、hwmonds ="epwmss0";

    TI、无空闲启动;

    TI、no-reset-on-init;

    (笑声)

    STATUS ="禁用";

    (笑声)

    与我们的内核开发人员交谈后、您应该能够撤消对 OMAP-hwmod_33xx_43xx_ipblock_data.c 文件的修改、并使用这些属性来实现相同的目标。

    为了确保我们在同一页上、您在 u-boot 期间配置 PWMSS 外设以生成 PWM 信号、而在内核启动时、您会看到 PWM 信号停止工作、对吧? 哪个看起来是由于内核禁用了到外设的时钟?

    Jason Reeder