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-L138:ARM 在 OMAP L138中将 DSP 置于睡眠模式

Guru**** 2553260 points
Other Parts Discussed in Thread: OMAP-L138

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/787947/rtos-omap-l138-arm-put-dsp-into-sleep-mode-in-omap-l138

器件型号:OMAP-L138
主题中讨论的其他器件:OMAPL138

工具/软件:TI-RTOS

大家好。


现在、我将在 OMAPL138中开发功能 ARM 将 DSP 置于睡眠模式。

我已经通过 OMAPL138的 ARM 将 DSP 置于睡眠模式。 但是、当我通过 ARM 唤醒 DSP 时、DSP 不会唤醒、并且在 DSP 不工作之后。 我不明白为什么?

我 按照 SPRUH77的10.7.4 C674x 超级模块时钟开/关中详述的步骤进行操作。

以下是我的代码:

ARM 代码:


/*********
*@文件 main.c
*@作者
*@版本 V0.0.0 *
@日期
*@简介
*@修订
版 /

/
** 包括
「香港」 /#include

#include 
#include 
#include 
#include 
#include 
#include 
#include "main.h"
#include "interrupt.h"
#include "delay.h"
#include "lcdkOMAPL138.h"


/*静态函数*/
静态空 PMU_DSPExitSleep 模式(void);
静态空 PMU_DSPSleep 模式(void);

//
void main 函数*/ void main (











*** while (dSPEffitSlepMode)(void 10000/(void));void PMPU (d100001)(void PMPU (void 10dsps)
**@简介 睡眠 DSP
**@参数 无
**@返回 无
**@时间 2019年3
月29日,星期五,下午1:51 **@修订
版 /
static void PMU_DSPEnterSleep 模式(void)
{
volatile unsigned int timeout = 0xFFFFFF;
unsigned int status = 0;
unsigned int regTmp=0;
SOS_DEBUG ("ARM:设置 DSP 睡眠\r\n);
//PSCModuleControl_1 (SOC_PSC_0_regs、HW_PSC_DSP、PSC_POWERDOMAIN_PD_DSP、\
PSC_MDCTL_NEW_DISABLE);

/* C674x 超级模块时钟关闭*/
/*步骤1:ARM 停止所有主器件访问 DSP 和 DSP 存储器*/

/*步骤2:ARM 轮询所有主器件的写入完成状态*/

/*步骤3:ARM 启动以下 DSP 时钟关闭过程*/

/*步骤3a:DSP 时钟停止命令*/
regTmp =(HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP))和~PSC_MDCTL_NEXT);
HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP)= regTmp | PSC_MDCTL_NEW_DISABLE;

/*步骤3b:将1写入 GO [1]位*/
HWREG (SOC_PSC_0_regs + PSC_PTCMD)= HWREG (SOC_PSC_0_regs + PSC_PTCMD)| PSC_PTCMD_GO1;

/*步骤3c:检查(轮询0)电源域转换状态寄存器(PSC0.PTSTAT)中的 GOSTAT[1]位*/
操作
{
状态= HWREG (SOC_PSC_0_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT1;
}
while (status && timeout--);
/*步骤3D:检查(轮询2h) DSP LPSC 模块状态寄存器(PSC0.MDSTAT15)中的 STATE 位字段*/
如果(超时!= 0)
{
超时= 0xFFFFFF;
状态= PSC_MDCTL_NEW_DISABLE;
操作
{
超时--;
}
while (timeout &&(HWREG (SOC_PSC_0_regs + PSC_mdstat (HW_PSC_DSP))& PSC_mdstat_State)!= status);
}

如果(超时=0)
{
SOS_DEBUG ("ARM:设置 DSP 睡眠失败!\r\n");
}
其他
{
SOS_DEBUG ("ARM:设置 DSP 睡眠完成!\r\n");
}
}

/*********
**@简介 睡眠 DSP
**@参数 无
**@返回 无
**@时间 2019年3
月29日,星期五,下午1:56 **@修订
版 /
static void PMU_DSPExitSleep 模式(void)
{

SOS_DEBUG ("ARM:WAKEUP DSP\r\n);

volatile unsigned int timeout = 0xFFFFFF;
unsigned int status = 0;
unsigned int regTmp = 0;
//上的// C674x 超级模块时钟
/*步骤1:等待电源域转换状态寄存器(PSC0.PTSTAT)中的 GOSTAT[1]位清零。 */
DO
{
status = HWREG (SOC_PSC_0_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT1;
SOS_DEBUG ("../r\n");
}
while (status & timeout--);
/*步骤2:向 DSP 本地电源睡眠控制器(LPSC)模块控制寄存器(PSC0.MDCTL15)中的下一个位字段写入3h。*/
regTmp =(HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP))和~PSC_MDCTL_NEXT);
HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP)= regTmp | PSC_MDCTL_NEW_ENABLE;

/*步骤3:向 GO [1]位写入1 */
HWREG (SOC_PSC_0_regs + PSC_PTCMD)= HWREG (SOC_PSC_0_regs + PSC_PTCMD)| PSC_PTCMD_GO1;

/*步骤4:检查(轮询0) PSC0.PTSTAT 中的 GOSTAT[1]位*/
超时= 0xFFFFFF;
操作
{
状态= HWREG (SOC_PSC_0_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT1;
}
while (status && timeout--);

/*步骤5:等待 DSP LPSC 模块状态寄存器(PSC0.MDSTAT15)中的 STATE 位字段更改为3h.*/
如果(超时!= 0)
{
超时= 0xFFFFFF;
状态= PSC_MDCTL_NEW_ENABLE;
操作
{
超时--;
}
while (timeout &&(HWREG (SOC_PSC_0_regs + PSC_mdstat (HW_PSC_DSP))& PSC_mdstat_State)!= status);
}

如果(超时=0)
{
SOS_DEBUG ("ARM:唤醒 DSP 失败!\r\n");
}
其他
{
SOS_DEBUG ("ARM:唤醒 DSP 完成!\r\n");
}
/*用于唤醒 DSP 的 SYSCFG_CHIPSIG_CHIPSIG2中断*/
regTmp = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CHIPSIG)| SYSCFG_CHIPSIG_CHIPSIG2;//0x00000004;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CHIPSIG)= regTmp;
} 

DSP 代码:

#include 

#include 
#include 

#include "hw_syscfg0_OMAPL138.h"
#include "hw_types.h"
#include "SoC_OMAPL138.h"

#include "中间 件/调试/调试.h"
#include "in中间 件/ipc/ipc.h"

uint32_t isSleep DSP = 0;
uint32_t noSleep = 0;




while (void 1)
{1 (void)}
/*切换 LED */
TOGGLE_LED();
延迟(5000);

}



/*********
**@简介来自断电控制
的中断句柄**@paramfunc_param
**@returnnone
**@time
**@revision
******** /
void PDC_IRQHandler (void)
{
IntEventClear (SYS_INT_PDC_INT);
//将0001 5555h 写入 PDCCMD *
HWREG (SOC_PWRDWN_PDC_regs)= 0x00015555;
isSlepDSP = 1;
SOS_DEBUG ("PDC 接口\r\n);
asm (" IDLE ");
}

/*************
**@简介来自 ARM
的中断句柄**@paramfunc_param
**@returnnone
**@time
**@revision
******** /
void IPC_IRQ_handler ()
{

Hwi_disableInterrupt (5);
if (isSlepDSP)
{
WAKEUP_IRQHandler();
isSlepDSP = 0;
noSlep++;
SOS_DEBUG ("DSP 为睡眠、noSleep:%d\r\n"、noSleep);
}
其他
{
SOS_DEBUG ("DSP 处于活动状态\r\n);
}
Hwi_enableInterrupt (5);
} 


注意:SOS_DEBUG 是 UART 提供的调试功能。

运行结果:ARM 正常运行。 但 DSP 打印日志"PDC 接口"、然后 DSP 不工作。


有人可以帮助我将 DSP 置于睡眠状态并将其唤醒吗?


谢谢,最棒的地方!
Huy DAI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否使用 Processor SDK RTOS? 哪个版本?

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

     @、我使用 SYS/BIOS。 版本6.45.1.29

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。 我在项目中使用 SYS/BIOS 版本6.45.1.29。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅 C6748和 OMAP-L138的电源模块 wiki 页面:

    在"睡眠模式"部分下有一个演示激活和从不同睡眠模式唤醒的示例。 为了方便您、我还将其附在这篇文章中。

    e2e.ti.com/.../Sleep6x.zip

    此致、
    Sahin