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/AM3352:在待机模式下使用 eHRPWM

Guru**** 2581915 points
Other Parts Discussed in Thread: AM3352, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/623330/linux-am3352-use-of-ehrpwm-in-standby-mode

器件型号:AM3352
Thread 中讨论的其他器件: SysConfig

工具/软件:Linux

您好!

我们计划创建一个 Linux 嵌入式器件、该器件使用 EHRPWM 生成 PWM 输出、同时 AM3352 CPU 处于 Linux 待机模式(而不是深度睡眠0)。

(请参阅  )

我 注意到 PWM 子系统位于外设电源域内

CPU 处于睡眠模式时是否可以使用 PWM 输出、Linux 暂停代码是否可能支持此功能?

我们仍在使用 Processor SDK 1.0 (内核3.14.y)、但可能会很快升级到最新版本。

此致、

Bastian Schmitz

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

    这取决于您计划使用的引脚、请参阅器件 TRM 的第8.1.4.3.2节待机:
    "待机模式下的唤醒是使用任何 GPIO 实现的。 通过将管脚切换到 GPIO 模式并配置相应的 GPIO 组来生成 MPUSS 中断、可以实现 GPIO 唤醒。 请注意、没有 GPIO 多路复用模式(例如 ADC 或 USB)的焊盘不能导致这些唤醒。 如果需要额外或其他唤醒源、相关的外设模块时钟和互连时钟域应保持启用(这可能要求相关的 PLL 保持锁定)、并且必须针对唤醒对模块进行适当配置
    通过将其配置为生成一个到 MPUSS 的中断"

    您可以通过修改 arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c 中的 PWM hwmod 来尝试此操作、相关结构为:
    /* pwmss */
    静态结构 omap_hwmod_class_sysconfig am33xx_epwmss_sysc ={

    /* epwms1 */
    struct omap_hwmod am33xx_epwmss1_hwmod

    /* epwms2 */
    struct omap_hwmod am33xx_epwmss2_hwmod

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

    Yordan、您好!

    只是为了验证您是否正确理解了我的问题:您引用的文本主要是关于 GPIO 从待机模式唤醒、但我的问题是关于在待机模式下使用 EHRPWM 功能块。

    您是否建议更改引用的数据结构、以使时钟保持启用状态、并使 ehrpwm 函数块在待机模式下运行?

    此致、

    Bastian Schmitz

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

    是的、正确。 尝试添加:
    flags = HWMOD_IDLEMODE_NO、

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

    Yordan、您好!

    我应用了该更改

    -- a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c
    ++ b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c
    @@-529、9 +529、7 @@静态结构 omap_hwmod_class_sysconfig am33xx_epwmss_sysc ={
           .reV_fs      = 0x0、
           .sysc_fs     = 0x4、
           .sysc_flags    =(SYSC_has _sIDLEMODE | SYSC_has _MIDLEMODE)、
    -      .idlemodes     =(sidle_force | sidle_no | sidle_smart|
    -                      sidle_smart_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
    -                      MSTANDBY_SMART | MSTANDBY_SMART WKUP)、
    +      .idlemodes     =(sidle_no | MSTANDBY_NO)、
           .sysc_fields   =&omap_hwmod_sysc_type2、
     };

    @@-563,6+561,7 @@ struct omap_hwmod am33xx_epwmss0_hwmod ={
                           .modulemode    = MODULEMODE_SWCTRL、
                   }、
           }、
    +      .flags = HWMOD_SWSSup_Sidel_ACT | HWMOD_SWSSup_MSTANDBY、
     };

     /* ecap0 */
    @@-600、6 + 599、7 @@ struct omap_hwmod am33xx_epwmss1_hwmod ={
                           .modulemode    = MODULEMODE_SWCTRL、
                   }、
           }、
    +      .flags = HWMOD_SWSSup_Sidel_ACT | HWMOD_SWSSup_MSTANDBY、
     };

     /* eCAP1 */
    @@-637、6 +637、7 @@ struct omap_hwmod am33xx_epwmss2_hwmod ={
                           .modulemode    = MODULEMODE_SWCTRL、
                   }、
           }、
    +      .flags = HWMOD_SWSSup_Sidel_ACT | HWMOD_SWSSup_MSTANDBY、
     };

     /* ecap2 */

    因为_enable_sysc 中的以下代码、我想这些代码是您在之前的回答中指出的设置标志。

    静态 void _enable_sysc (struct omap_hwmod *oh)

    (笑声)

       IF (SF & SYSC_USH_SIDLEMODE){
          if (oh->flags & HWMOD_SWSSup_sidle ||)
             OH->FLAGS & HWMOD_SWSSup_Sidel_ACT){
             idlemode = HWMOD_IDLEMODE_NO;

    (笑声)

       IF (SF & SYSC_USH_MIDLEMODE){
          if (oh->flags & HWMOD_FORCE_MSTANDBY){
             idlemode = HWMOD_IDLEMODE_FORCE;
          }如果(oh->flags & HWMOD_SWSSup_MSTANDBY){
             idlemode = HWMOD_IDLEMODE_NO;

    遗憾的是 、当我执行时、PWM 信号仍然在高电平或低电平状态下冻结(似乎取决于占空比)

    rtcWAKE -m STANDBY -s 5.

    并在唤醒后重新发生。

    因此、我猜我应用的代码更改不会执行、或者我错过了某个东西、或者 由于另一个原因、PWM 单元被禁用。

    BTW。 我已经检查了 PWM-tiwms.c 和 PWM-tiehrpwm.c 挂起和功能、如果它们以某种方式禁用 PWM 单元。

    您是否有任何提示、接下来要检查什么? 您是否认为在进入待机模式时跟踪 PWM 信号消失的点是可行的?

    此致、

    Bastian

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

    让我进一步检查一下。

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

    我们将对此进行研究。 我已联系设计团队寻求帮助、他们的反馈将直接发布在此处。

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

    尝试在暂停期间在 Linux/arch/arm/mach-omap2/pm33xx.c 中放入断点(am33xx_pm_suspend 将是一个良好的开始)。

    接下来、您需要深入研究 PM 固件(此处为 repo: git.ti.com/.../)。 请务必结算正确的分支(您希望旧版内核具有 ti-v3.14.y)。

    您需要处理的下一个问题是、我们在待机期间将内核 PLL 置于旁路模式以节省功耗。 PWM 模块从这个 PLL 获得它们的时钟。 其效果是 PWM 模块将接收到一个等于晶振频率的时钟。 PM 固件的 pm_services/prcm_core.c 中的 DS_save 函数负责在待机期间将内核 PLL 置于旁路状态。

    在 PM 固件中可能要解决的另一个问题是、我们将互连置于待机模式。 由于 PWM 模块将保持活动状态、因此将互连置于待机状态将失败、这将导致待机基本上挂起、因为 M3电源管理处理器从未达到 WFI 状态。

    本质上、您将需要自定义待机路径以适应在待机期间保持 PWM 信号的需求。

    您的电源目标是什么? 您是否需要一直到待机状态、或者有选择地禁用关键外设是否足够好?

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

    您是否能够在这方面取得进展?

    此致、
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mike:
    您的帖子说服我们将该功能移至电路板上的另一个现有微控制器。 除了及时解决这一问题的风险之外、没有人想要为内核和 M3保持这样的更改集。 感谢您的详细描述。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bastian、

    感谢您花时间进行更新。