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.

[参考译文] SECDEVTOOL-OMAPL138C6748:如何从 DSP 次级引导加载程序中唤醒 ARM?

Guru**** 2560390 points
Other Parts Discussed in Thread: OMAP-L138, SECDEVTOOL-OMAPL138C6748

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/609514/secdevtool-omapl138c6748-how-to-wake-up-arm-from-dsp-secondary-bootloader

器件型号:SECDEVTOOL-OMAPL138C6748
主题中讨论的其他器件:OMAP-L138OMAPL138

大家好、

我正在为启用安全功能的 OMAP-L138芯片编写 DSP 次级引导加载程序、在该程序中、我需要唤醒 ARM 内核并为 ARM 和 DSP 分配入口点。

我已经按照 Rahul (第一个链接)提供的示例、并在下面的部分中阅读了一些有用的主题:

  

我的引导过程如下:

DSP 首先启动、DSP ROM 引导加载程序将 DSP 次级引导加载程序(SBL)加载到存储器中、将控制权转移到 DSP SBL、然后在 SECUREWITHSK 模式下退出

DSP SBL 将 ARM 和 DSP 应用程序映像加载到 mDDR 中、使用安全内核 API 对其进行解密并检索两个入口点。 该过程处于 SECUREWITHSK 模式

DSP SBL 运行 PRUSS 以将 ARM 复位矢量写入0xFFFFFF0000、通过该矢量可唤醒 ARM 内核并开始运行 ARM 应用。 该过程仍处于 SECUREWITHSK 模式

4.同时使用  SK_switchNonSec ()  API 将 DSP SBL 切换到非安全模式,并将控制权转移到 DSB 用户应用程序。 现在、整个系统在不安全的世界中运行。

用于设置 ARM 复位矢量的 PRU 代码和 ARM 代码与 Rahul 示例中的代码相同。

/* PRU 代码*/

unsigned int armBootDmaxCodeConst[]={
0x24000080、//将 ARM 矢量表地址加载到 r0
0x24ffffc0、
0x24000081、//将 ARM 代码地址加载到 R1
0x240000c1、
0xf500e182、//从*R1读取 ARM 代码到 R2、……
0xe500e082、//从 R2写入 ARM 代码、…… 至*r0
0x79000000、//自循环
};

/* arm boot arm code */

unsigned int armBootArmCodeConst[]={
0xEA000007、// vt0:b boot
0xEAFFFFFE、// vt0:自循环
0xEAFFFFFE、// vt0:自循环
0xEAFFFFFE、// vt0:自循环
0xEAFFFFFE、// vt0:自循环
0xEAFFFFFE、// vt0:自循环
0xEAFFFFFE、// vt0:自循环
0xEAFFFFFE、// vt0:自循环
//跳转:、数据:
0x00000000、
//启动:
0xE51F000C、// LDR R0、跳转
0xE1A0F000、// MOV PC、R0
};

我的问题是只有 DSP 应用程序运行、似乎 ARM 内核尚未唤醒。 这很奇怪、因为有些人成功地运行了 Rahul 的考试代码。 我的问题是:

1.我的引导顺序是否正确?

2. ARM 入口点是否需要位于共享 RAM 中(我的位于 DDR 中)?

3.我应该在非安全模式下唤醒 ARM 内核、还是可以在 SECUREWITHSK 模式下唤醒?

4.我应该尝试哪些可接受的解决方案?

提前感谢、

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

    我已通知 RTOS 团队。 他们的反馈将在此处发布。

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

    器件型号:SECDEVTOOL-OMAPL138C6748

    你(们)好。

    我正在为启用安全功能的 OMAP-L138芯片编写 DSP 次级引导加载程序、但在将代码段从 DSP 加载到 ARM 本地 RAM 时遇到问题。

    为了澄清、当我分析 ARM+DSP 二进制应用程序映像的内容时、在启动过程中、有两部分代码必须位于 ARM 本地 RAM (0xFFFFFF0000 - 0xFFFFFFFF)中(如下文所示)。

    但是、在 OMAP-L138的数据表中、只能从 ARM 或 PRU 内核访问该存储器区域。 如表3-4 (第24页)所示、灰色表示 DSP 不能直接读取或写入此存储器范围。  

    因此、 当我尝试从 DSP 次级引导加载程序将代码/数据加载到 ARM 本地 RAM 时、引导过程始终挂起(如下面的 UART 调试屏幕所示)

    问题:

    我知道可以使用 PRU0将数据从 SHARD_RAM/DDR_RAM 加载到 ARM 本地 RAM、但我不知道如何对其进行编程。 是否有人可以为我提供 PRU 代码来执行此任务?

    2.是否有另一种方法可以解决此问题、 这种方法不使用 ARM 次级引导加载程序?

    提前感谢、

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

    我已将此内容转发给 OMAP-L13x 软件专家。 他们的反馈应发布在此处。

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

    RTOS 团队是否有任何反馈?
    我期待您的回复。

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

    田北俊

    很抱歉耽误您的时间才能发布此帖子。

    您能否在解密 DSP 和 ARM 映像后以非安全状态执行步骤3和步骤4。 另外需要注意的是、ARM 和 DSP .map 文件不能重叠。 如果两个程序使用相同的存储器地址、它们将相互覆盖、并且很可能会崩溃。 应写入链接器命令文件以防止这种情况发生。 是使用 TI ARM 编译器还是 GNU 编译器编译 ARM 二进制文件? 只要 SBL 正在正确初始化 DDR、就不需要入口点位于共享 RAM 中。

    在执行此序列之前、您是否已确保解锁 KICK 寄存器。 我假设您在调用 device_set_arm_reset_vector()时更新了入口点。 检查 PSC 寄存器以确保启用 ARM RAM 和 ARM。

    /*打开 ARM RAM */
    DEVICE_LPSCTransition (0、7、0、PSC_ENABLE);
    
    DEVICE_SET_ARM_RESET_VECTOR (DEVICE_ARM_UBL_LOAD_ADDR);
    
    /*打开 ARM */
    DEVICE_LPSCTransition (0、14、0、PSC_ENABLE);
    
    /*取消置位 ARM 本地复位*/
    PSC0->MDCTL[14]|= 0x100; 

    此外、在您解密并在 DDR 中加载代码后、请检查 ARM 的入口点是否与 ARM 映射文件匹配。

    此致、

    Rahul

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

    您好、Rahul、

    感谢你的答复。 下面我将回答您的问题

    您能否在解密 DSP 和 ARM 映像后以非安全状态执行步骤3和步骤4。

    是的、我在切换至非安全模式之前和之后尝试唤醒 ARM。 在我调用函数  DEVICE_ENABLE_ARM (ARMBootAdd)后、有一段时间出现非停止怪异字符串"-system_ini"推送到 UART 屏幕但在大多数情况下都没有发生任何情况、只有 DSP 应用程序运行(DSP 调试字符串显示在 UART 屏幕上)。

    另外需要注意的是、ARM 和 DSP .map 文件不能重叠。

    我已经检查并验证了这两个分区是否相互独立。

    是使用 TI ARM 编译器还是 GNU 编译器编译 ARM 二进制文件?

    我使用了 CCS 中内置的 TI ARM 编译器

    在执行此序列之前、您是否已确保解锁 KICK 寄存器。

    在 SBL 的开头,我在函数 device_Init()中将其解锁。 我必须再次执行它吗?

    我假设您在调用 device_set_arm_reset_vector()时更新了入口点。  

    是的、你是对的。

    检查 PSC 寄存器以确保启用 ARM RAM 和 ARM。

    我无法检查 PSC 寄存器、因为我无法在调试模式下运行它、因为它处于 SECUREWITHSK 模式。 但我非常确定 PSC 寄存器是否已设置、因为我的 SBL 确实能够处理 ARM 的小映像(ARM 的闪烁 LED 映像和 DSP 的 UART 映像组合在一起)。  

    现在、我一直在使用更大的 ARM 映像、其入口点位于 DRAM 中、一些段位于共享 RAM 中、两个小段位于本地 ARM RAM (IRAM)中。 有关诊断的更多信息,我已经检查了 IRAM 中的两个部分(通过读取映像的二进制文件),一个从地址0xFFFFFF0000开始的部分看起来与  示例代码中的 armBootArmCodeConst[]数组非常相似(示例位于下面)。  它有 一个包含 ARM Entrypoint 值的元素。 因此、当唤醒 ARM 时、我用  armBootArmCodeConst[]覆盖它 、然后运行  local_wakeUpARM() 函数。 问题是这样吗?

    --> IRAM 中从0xFFFFFF0000开始的部分:

    [E59FF018;E59FF018;E59FF018;E59FF018;

    E59FF018;E59FF018;E51FA1C;E51FFA24;

    C1B33CE8 (入口点);C1B30E04;C1B30E04;C1B30E04;

    C1B30E6C;C1B30E04;C1B30024;C1B2CC2C]

    请提供任何帮助。

    最恰当的考虑。

     

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

    如果您能够使用较小的 ARM 应用程序代码进行引导、那么我相信加电序列应该是准确的、除非该序列中除了入口点以外的任何内容发生了变化。  您是否有办法将 LED 闪烁代码添加到 ARM 应用的顶部、以便一旦 ARM 唤醒、LED 就会闪烁。 我想了解 ARM 是否出现、然后在某些代码中挂起。

    另一个需要验证的问题是、如果您解锁 JTAG、如果您将入口点手动放入 ARM 内核(如果它正确运行 ARM 应用程序)、如果 PSC 正确打开、则您应该能够连接到 ARM。

    n`t 您手动将n`t 点放置到 ARM 程序计数器并运行内核并且应用程序没有出现、则说明 ARM 代码加载正确、或者在 ARM 解密阶段出现错误。

    是这种自定义 SBL 代码、或者您是否已为此应用程序使用了 Starterware 代码。 DSP 和 ARM 代码是否按此处所述合并?

    [引用 USER="TIen Ngoc"]要了解更多诊断信息,我已经检查了 IRAM 中的两个部分(通过读取映像的二进制文件),一个从地址0xFFFFFF0000开始,看起来与  示例代码中的 armBootArmCodeConst[]数组非常相似(示例位于下面的 bellow 中)。  它有 一个包含 ARM Entrypoint 值的元素。 因此、当唤醒 ARM 时、我用  armBootArmCodeConst[]覆盖它 、然后运行  local_wakeUpARM() 函数。 这是问题吗?[/quot]

    这可能会产生影响、具体取决于其他 ARM 代码所执行的操作。 您能否将 armBootArmCodeConst 与您在二进制文件中看到的内容匹配、以便在 PRU 将代码移至 ARM IRAM 时仅更新入口点。 您是否可以在此处发布 ARM 二进制文件的映射文件。 根据您在此处所指示的内容、您的 ARM 应用二进制文件在 IRAM 中包含代码、因此当您的 SBL 尝试将代码加载到该段时、不会加载代码、因为在调用 device_enable_arm 之前不会启用 ARM IRAM PSC。  

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

    您好、Rahul、

    感谢您的快速回答、

    很好的建议是在 ARM 应用的开头放置一个闪烁的 LED 代码。 我明天回来上班时就会尝试做这个、很快就会给您详细介绍。

    请继续更新此主题、因为我非常需要您的支持。

    谢谢、

    最恰当的考虑。

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

    您好、Rahul、

    你是怎么做的? 我在休息2天后回到工作岗位。

    有关调试的建议。 我有一些有趣的结果、希望它能帮助您诊断问题。

    1.在 ARM main 的开头放置闪烁的 LED 代码()

    LED 一直在闪烁、直到 BIOS 启动(我的 ARM 应用程序中有 BIOS)、而直到调度程序初始化某些内容。 我认为问题是在 BIOS 中内联。 在启用安全功能的 OMAPL138上使用 BIOS 时、我是否需要注意任何事项?

    2. 另外要验证的是,如果您解锁 JTAG,如果您将入口点手动放入 ARM 内核(如果它运行了 ARM 应用程序),如果 PSC 已正确打开,则您应该能够连接到 ARM。

    是的、一切都正常工作、因为 ARM 应用现在可以在挂起之前使 LED 发生切齿。

    但我有疑问。 在调试时,通过内存查看,我发现对2个 KICK 寄存 器的写入没有影响(例如,system->KICKR[0]= 0x83e70b13不会改变该寄存器的原始零值)。 但是、我仍然能够初始化 PLL、NAND 接口。 此外、OMAPL138芯片的技术手册指出 :"在芯片修订版本2及更高版本中禁用了 KICK 寄存器"、而我的芯片是 OMAPL138BE、比该芯片晚了。 那么、您能否验证解锁踢脚对于唤醒 ARM 或加载代码 ARM IRAM 是否仍然是强制性的?


    3.是这种自定义 SBL 代码,或者您是否使用了该应用程序的 starterware 代码。 DSP 和 ARM 代码是否按此处所述合并?

    这是一个自定义 SBL、序列与您的链接中描述的类似、但有一些小差异。 下面我将演示我的引导过程

    1.将 CCS 中的 ARM 和 DSP 应用程序用于获取相应的.out 文件

    2.使用"OMAPL138_StarterWare_1_10_04_01\tools\out2rprc\"中的 out2rprc.exe 合并两个.out 文件

    $ out2rprc.exe (在我的 SBL 中、我首先分配 DSP 入口点、因此我放置了 在前面 )

    3.使用 LoadModGen_OMAP_L138.exe 为启用安全功能的 OMAPL138创建引导加载模块文件(如第3.5节"TMS320C674x/OMAP-L1x 处理器安全用户指南"中所述)

    $ LoadModGen_OMAP_L138.exe -ini loadmod_generic.ini -otype binary -o

    4.负载 (以前使用 SecureHexAIS_OMAP-L138.exe 创建的加密 )和 按该顺序连接到板的 NAND 闪存。

    5.从 NAND 引导。 。 然后、图像由 DSP RBL 解密并运行

    5.1. SBL 负载 到 DDRAM,使用 SK_decrittMod() API 对其进行解密。

    5.2. SBL 解析映像、检索2个入口点并将每个段加载到其指定位置(此过程类似于 Starterware 中提供的 ARM SBL 中发生的情况)。 我确认所有位置不会相互重叠、解密的图像区域也是如此。

    5.3. SBL 使用 PRUSS 唤醒 ARM 并跳转到 ARM 入口点。

    5.4. SBL 切换到非安全并跳转到 DSP 入口点。

    4.您是否可以在此处发布 ARM 二进制文件的映射文件。

    这是我的 ARM 应用的内存使用情况。

    5.从此处所示的内容来看,ARM 应用程序二进制文件在 IRAM 中有代码,因此当 SBL 尝试将代码加载到该段时,不会加载代码,因为在调用 DEVICE_ENABLE_ARM 之前,不会启用 ARM IRAM PSC。

    我注意到了。 我在加载代码之前启用 ARM IRAM PSC。 然后在 DEVICE_ENABLE_ART()中重新启用它,之后还会打开 ARM 和 ARM Int PSC。

    您能从这些调试日志中获得任何见解吗?

    我期待你的答复。

    最恰当的考虑。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从我可以看出、这不是您的启动顺序问题、而是 ARM9上的 BIOS 启动问题。 我对 ARM9上的安全器件上的 BIOSn`t 任何经验、因此我不清楚此问题的根本原因是什么。

    当您解锁 JTAG 并在 ARM 内核上加载和运行代码时,BIOS 是否开始工作? 唤醒 ARM 时、这可能是一些 MMU 或高速缓存问题。 是使用 GNU 编译器还是 TI ARM 编译器与 BIOS。

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

    您好、Rahul、

    说实话、您热情的支持对我解决问题非常有帮助。  

    我的答案是:

    当您解锁 JTAG 并在 ARM 内核上加载和运行代码时,BIOS 是否开始工作?

    是的、当我在调试模式下运行 ARM 应用程序时、BIOS 工作正常。 您可能对 MMU 和高速缓存很了解、我将对其进行检查。

    您使用的是 GNU 编译器还是 TI ARM 编译器与 BIOS 吗?

    我使用 TI 编译器。  我选择的编译器如何影响 ARM 唤醒过程?

    最恰当的考虑。

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

    您好、Rahul、

    最后、我能够唤醒 ARM 内核并运行这两种应用。
    我的问题是、PRU 没有将 IRAM 中的代码段加载到其指定位置(0xFFFFFF0000-0xFFFFFFFF)、而 BIOS 初始化系统非常重要。 因此、当进入 BIOS 初始化时、它总是会死。
    我的解决方案是 DSP 将该段加载到 SHARD_RAM 中的特定位置、然后唤醒 ARM 并让它自行加载。

    非常感谢您的支持 Rahul、它确实指导我完成代码调试步骤。
    最恰当的考虑。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的更新并确认您的问题已解决。 您能不能点击绿色"这解决了我的问题"、以便我们可以关闭该主题。