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.

[参考译文] RTOS:安全 OMAP 是否可以进入深度睡眠模式?

Guru**** 2615655 points

Other Parts Discussed in Thread: OMAP-L138

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/655559/rtos-can-secure-omap-go-to-deepsleep-mode

主题中讨论的其他器件:OMAPL138OMAP-L138

工具/软件:TI-RTOS

您好!

我的项目使用 OMAPL138。 然后转向深度睡眠模式和唤醒正常。 但是、当我用安全的 OMAPL138替换常规的 OMAPL138时、它无法进入深度睡眠模式。 安全 OMAP 由 JTAG 解锁并进行调试、但当转向深度睡眠时、它会在  " while (pscstatus)"处停止;

这是我的代码

uint32_t savePinMux;
uint32_t pscstatus;
uint32_t 计数;

//解锁 PLL 配置
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP0)&=
~SYSCFG_CFGCHIP0_PLL_MASTER_LOCK;
/*清除 PLL 锁定位*/
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP3)&=
~SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK;

//配置 GP0[8]-深度睡眠引脚-引脚编号9
//确保 DeepSleep 引脚是 DeepSleep 函数的引脚多路复用
savePinMux = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (0));
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (0))= PINMUX0_31_28_DeepSleep &\
SavePinMux;

//清除自刷新/低功耗(SR_PD)位为0
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)和=~DDR2_mDDR_SDRCR_SR_PD;

//设置低功耗模式使能
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)|= DDR2_mDDR_SDRCR_LPMODEN;

//通过将 MCLKSTOPEN 设定为1来关闭 MCLK
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)|= DDR2_mDDR_SDRCR_MCLKSTOPEN;

//等待150个 CPU 时钟以允许 MCLK 停止
对于(count = 0;count < MCLK_STOP_TIME_DELAY;count++)
{
asm (" nop");
}

//禁用 SDRAM 的 VCLK (用于自刷新模式)
//关闭 DDR2的 PSC

//等待任何先前启动的转换
HWREG (SOC_PSC_1_regs + PSC_MDCTL (HW_PSC_DDR2_mDDR)=(PSC_MDCTL_NEW_DISABLE 和 PSC_MDCTL_NEXT);

HWREG (SOC_PSC_1_regs + PSC_PTCMD)= PSC_PTCMD_GO0;
操作
{
pscstatus = HWREG (SOC_PSC_1_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT0;
}
while (pscstatus);


//重新检查状态
pscstatus = PSC_MDCTL_NEW_DISABLE & PSC_MDCTL_NEXT;
while ((HWREG (SOC_PSC_1_regs + PSC_mdstat (HW_PSC_DDR2_mDDR))& PSC_mdstat_State)!= pscstatus);

/*必须先清除 PLLENSRC、PLLEN 位才会产生任何影响*/
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLENSRC;

// PLLEN = 0在 PLL0中将 PLL 置于旁路模式
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLEN;

//等待4个周期 OSCIN
for (count = 0;count < PLLEN_MUX_switch;count++)
{
asm (" nop");
}

在 PLL0中为// PLLPWRDN = 1
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLPWRDN;

/*在 PLLEN 有任何影响之前,必须清除 PLLENSRC。*/
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLENSRC;

// PLLEN = 0在 PLL1中将 PLL 置于旁路模式
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&&=~PLLC_PLLCTL_PLLEN;

//等待4个周期 OSCIN
for (count = 0;count < PLLEN_MUX_switch;count++)
{
asm (" nop");
}

在 PLL1中为// PLLPWRDN = 1
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLPWRDN;

// SLEEPCOUNT 位中的配置延迟(例如:0x0F)
HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)=\
((HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)和
~SYSCFG1_DEEPSLEEPCOUNT)| 0x000F);

//将 DeepSleep 中的 SLEEPENABLE 位设置为1
HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)|=SYSCFG1_DeepSlep_SLEEPENABLE;

//轮询位 SLEEPCOMPLETE
while (0 =(SYSCFG1_DeepSlep_SLEEPCOMPLETE 和 HWREG (SOC_SYSCFG_1_1_regs +)
SYSCFG1_DeepSleep)))
{
}

//将 DeepSleep 中的 SLEEPENABLE 位清零
HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)&=\
~SYSCFG1_DEEPSLEEP_SLEEPENABLE;

//将 PLLCTL 中的 PLLRST 位清零
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLRST;

//清除 PLLCTL 中的 PLLPWRDN 位
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLPWRDN;

//将 PLLCTL 中的 PLLRST 位设置为1 -复位结束
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLRST;

//将 PLLCTL 中的 PLLRST 位清零
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&&=~PLLC_PLLCTL_PLLRST;

//清除 PLLCTL 中的 PLLPWRDN 位
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLPWRDN;

//将 PLLCTL 中的 PLLRST 位设置为1 -复位结束
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLRST;

//等待 PLL 锁定
对于(count = 0;count < pll_lock_time_cNT;count++)
{
asm (" nop");
}

//将 PLLCTL 中的 PLLEN 位置1 -移除旁路模式
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLEN;

//将 PLLCTL 中的 PLLEN 位置1 -移除旁路模式
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLEN;

/*设置 PLL 锁定位*/
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP0)|=
(0x01 <<SYSCFG_CFGCHIP0_PLL_MASTER_LOCK_SHIFT)
& SYSCFG_CFGCHIP0_PLL_MASTER_LOCK;

HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP3)&= CLK_PLL0_SYSCLK3;

/*设置 PLL 锁定位*/
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP3)|=
(0x1 << SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK_SHIFT)
& SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK;

//启用 SDRAM 的 VCLK
HWREG (SOC_PSC_1_regs + PSC_MDCTL (HW_PSC_DDR2_mDDR)=(PSC_MDCTL_NEW_ENABLE 和 PSC_MDCTL_NEXT);

HWREG (SOC_PSC_1_regs + PSC_PTCMD)= PSC_PTCMD_GO0;
操作
{
pscstatus = HWREG (SOC_PSC_1_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT0;
}
while (pscstatus);

//重新检查状态
pscstatus = PSC_MDCTL_NEW_ENABLE & PSC_MDCTL_NEXT;
while ((HWREG (SOC_PSC_1_regs + PSC_mdstat (HW_PSC_DDR2_mDDR))& PSC_mdstat_State)!= pscstatus);

//设置 DDR PHY 中的 RESET_PHY 位
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_MDR_DRPYCRC)|=\
DDR2_mDDR_DRPYRCR_RESET_PHY;
while (DDR2_mDDR_DRPYRCR_RESET_PHY 和\
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_MDR_DRPYCRC));

//清除 SDRCR 中的 MCLKSTOPEN 位
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)&=\
~DDR2_mDDR_SDRCR_MCLKSTOPEN;

//禁用自刷新率
//清除低功耗模式
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)&&=~DDR2_mDDR_SDRCR_LPMODEN; 

谢谢、

Nhan

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

    您使用的是哪个 RTOS SDK 版本?

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

    我使用 SYS/BIOS 版本6.45.1.29、但在我的代码中、"Go to DeepSlep"函数在 ARM 中运行、遵循"OMAP-L138技术参考手册10.10 DeepSleep 模式"、它在正常 OMAP 模式下运行正常、但在禁用 DDR 的 VCLK 时停止、所有 IOPU 通过 ini 文件解锁

    [IOPUCONFIG]
    IOPUSELECT = 0x000000FF
    MPPAVALUE = 0xFFFFFFFF

    [IOPUCONFIG]
    IOPUSELECT = 0x000100FF
    MPPAVALUE = 0xFFFFFFFF

    [IOPUCONFIG]
    IOPUSELECT = 0x000200FF
    MPPAVALUE = 0xFFFFFFFF

    [IOPUCONFIG]
    IOPUSELECT = 0x000300FF
    MPPAVALUE = 0xFFFFFFFF

    [IOPUCONFIG]
    IOPUSELECT = 0x000600FF
    MPPAVALUE = 0xFFFFFFFF

    [IOPUCONFIG]
    IOPUSELECT = 0x00060707
    MPPAVALUE = 0x00000000

    我不知道正常 OMAP 和安全 OMAP 之间有什么区别
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,Nhan
    我们没有看到任何客户在深度睡眠中使用安全性的用例、我不确定我们是否明确测试了这种组合、但我也认为在安全与非安全土地中的其他 PSC 处理方式中、这种组合不应该有任何不同。 我将就此与我们的安全专家进一步讨论。

    我想确认几件事

    1) 1)您是否完全确定您的安全映像与非安全映像之间没有区别、特别是在 DDR 的使用方面。 如果您尝试禁用的模块正在使用中且其状态机不空闲、PSC 通常不允许时钟门控模块。 您能否确保不尝试从 DDR 执行此代码(没有从 DDR 获取程序/数据或未完成的事务)? 可能还可以直观地比较您的非安全与安全上的地图文件?
    2) 2)为了确保在安全模式下 PSC 处理不会出现问题,您能否确认,如果您尝试在 DDR VCLK 之前启用/禁用任何其他模块,在深度睡眠代码中,它在安全设备中正常工作?
    3) 3)如果需要、您是否可以发送自包含测试程序在我们的硬件上尝试此操作? 深度睡眠代码测试是某个较大系统测试的一部分、还是您在定制板上单独尝试这一测试?

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

    您好、Mukul、

    感谢您的回复、

    1、我完全确定安全映像和非安全映像之间没有区别。 我还确保代码在共享 RAM 中运行、而不是在 DDR 中运行。

    2、我会试着让你发热

    3、我的板上有独立代码、稍后我将向您发送测试程序。

    我阅读了该流程、似乎有一个问题

    我尝试使用强制位来关闭、打开 VCLK、它可以关闭 VLCK、但无法唤醒。 我仍然不知道为什么...

    请帮帮我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,Nhan
    感谢您指出5年前的话题、我没有看到该客户返回我们来推动问题解决的任何历史。

    因此、请将您的意见(包括我在该较旧的 e2e 帖子中提出的一些问题、这些问题没有得到解决/澄清)随时发送给我。

    如果您要在非安全设备上尝试使用强制位的深度睡眠测试、您是否还可以检查它是否适合您?

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

    您好、Mukul、

    现在、安全 OMAPL138进入深度睡眠模式并使用强制位成功唤醒。 我希望它运行稳定。 原因我仍然不知道安全的 OMAPL138架构。

    谢谢、

    Nhan  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,Nhan
    感谢您的更新。 我看到您已将帖子标记为已解决。 如果您可以与未来用户分享、那么您能将器件置于深度睡眠模式并使用用于 DDR 的强制位但不将其唤醒的问题是什么?

    我假设只有安全启动设备需要使用强制位,根据您之前的帖子,当您使用通用(非安全设备)进行深度睡眠时,您不需要使用此位,对吗?

    通常、我们不建议使用强制位、因为它本质上是通过传递 PSC"正常"握手来禁用到 IP 的时钟。 因此、如果您不打算进一步找出根本原因、请确保您对其进行彻底测试。

    祝你一切顺利。
    如果您有任何其他问题、请告知我们。
    Regars
    Mukul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mukul、

    感谢您的想法。 当然,当问题不是真正的解决办法解决时,它可能会不稳定。 我确信、对于非安全 OMAP、我不需要使用强制位。 我仍然想知道安全器件需要强制位才能进入睡眠模式的原因。

    我会仔细测试它、希望它运行良好。

    感谢 您的热情、

    Nhan。