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.

[参考译文] AM263P4-Q1:在 AM263P4上启用 XIP 时出现问题

Guru**** 2037690 points
Other Parts Discussed in Thread: UNIFLASH, AM263P4, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1442848/am263p4-q1-issue-with-enabling-xip-on-am263p4

器件型号:AM263P4-Q1
主题中讨论的其他器件:UNIFLASHAM263P4SysConfig

工具与软件:

你(们)好

我使用 CCS theia 版本  1.5.1.3.

使用 AM263P LaunchPad 时、我尝试让一个在 XIP 中运行的简单应用程序、但似乎无法做到。

我遵循这个主题:

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1373279/faq-am263p4-enabling-xip-in-am263px

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1374233/faq-am263p4-how-to-debug-xip-application-in-am263px

因此、我的 SYSCFG 设置如下所示:

MPU 设置:  

在存储器区域中、按如下方式设置闪存:

然后、在章节中、我有:

在 OCRAM 中添加了.rodata.cfg 下面的所有段、允许代码执行、直到在开始时引入了 main 和 while 循环。

否则、代码会在 启动代码中的_system_pre_init 和__TI_auto_init 中从 RESET 进入预取中止。

然后、我就像上面线程中建议的那样、将闪存中的其余代码:

刷写时、我会将 launchpad 板置于 UART 引导模式、并使用从命令行调用的 uart_uniflash python 脚本进行闪存:

Python uart_uniflash.py -p COM11 --cfg=C:/ti/mcu_plus_sdk_am263px_10_00_00_35/tools/boot/sbl_prebuilt/am263px-lp/default_sbl_ospi_Seb.cfg

我的配置文件如下所示:

#首先指向 sbl_uart_uniflash 二进制文件,其作为服务器来刷写一个或多个文件
--flash-writer=sbl_prebuilt/am263px-lp/sbl_uart_uniflash.release.tiimage

#对 OSPI PHY 调优攻击向量进行编程
--operation=flash-phy-tuning-data

#发送 bootloader 时、请确保闪存偏移量为0x0。 ROM 期望引导加载程序位于偏移量0x0处
--文件=sbl_prebuilt/am263px-lp/sbl_ospi.release.tiimage --操作=flash -- flash-offset=0x0

#发送应用程序映像时、请确保闪存在偏移0x81000 (默认值)处或引导加载程序配置的任何偏移处
#--file=../../examples/drivers/ipc/ipc_notify_echo/am263px-lp/system_freertos_nortos/ipc_notify_echo_system.release.appimage --operation=flash --flash-offset=0x81000
#--file=C:/AM263P_VxPlatform/DevOnLaunchpad/Bootloader/LedBlinkingApp_am263px-lp_r5fss0-0_nortos_ti-arm-clang/Debug/LedBlinkingApp_am263px-lp_r5fss0-0_nortos_ti-arm-clang=flash-offset=flash-offset=image-offset-offset

--file=C:/AM263P_VxPlatform/DevOnLaunchpad/Bootloader/LedBlinkingApp_xip_am263px-lp_r5fss0-0_nortos_ti-arm-clang/Debug/LedBlinkingApp_xip_am263px-lp_r5fss0-0_nortos_ti-flash_offset=ti-arm-offset=flash-offset-image-flash-offset-offset-image-flash-offset-image-apper-image-apper-add-apper-image-apper-flash

#XIP 部分
--file=C:/AM263P_VxPlatform/DevOnLaunchpad/Bootloader/LedBlinkingApp_xip_am263px-lp_r5fss0-0_nortos_ti-arm-clang/Debug/LedBlinkingApp_xip_am263px_r5fss0-0_nortos_ti-arm-flash-ip-ip-image-operation

刷写操作正常、我可以看到 SBL 的以下输出:

调试应用程序时、我将按预期在主函数开始时进入等待循环:

 单步执行代码时、执行过程会一直进行、直到从闪存执行蹦床函数、这会再次导致预取中止:

我认为我遵循了 AM263P4开发者培训中规定的所有步骤。

我必须错过一些东西或做一些错误的事情。 鉴于例外情况、它看起来像是 CPU 没有对外部闪存的可见性。

根据下面的文档、我希望 SBL 将闪存设置为正确支持 XIP、尤其是激活 DAC 模式:

https://software-dl.ti.com/mcu-plus-sdk/esd/AM263PX/10_00_00_35/exports/docs/api_guide_am263px/BOOTFLOW_XIP.html

从文档来看、它看起来并不是一般的文档、但实际上并不是。 是否有可能向我指出我在做什么错、并向我指出正确的方向?

如果需要、欢迎分享该项目。

谢谢

此致

单端

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

    尊敬的 Seb:

    对于延迟、我们深表歉意、

    我认为此问题可能是由于您在系统初始化中进行 OSPI 初始化而引起的。

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

    在执行 XIP 时、如果您尝试初始化 OSPI 或闪存、它将提供预取中止。

    您能否从应用程序中删除 OSPI 和闪存(通过 syscfg)并重试。

    假设您要执行 OSPI/FLASH INIT、请确保代码位于 RAM 中而不是闪存中

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

    你好、Nilabh  

    感谢您的答复。 遗憾的是、这无法解决问题。 我从工程中删除了 OSPI、但最终遇到相同的问题。

    我添加了上下文信息、以找到一种将 OSPI 置于 DAC 模式的方法、使其对 CPU 可见。

    但是按照线程中关于 XIP 的指令、似乎没有必要这样做。 在查看程序流时,跳转到 DPL_Init ()函数时的中止,这比任何 OSPI 初始化都要早得多。

    在示例和在线提供的说明中、有一件事对我来说毫无意义。

    示例项目将具有位于0x60100000的闪存区域。 预编译引导加载程序期望在偏移量0x81000处刷写应用程序。

    但是、当您查看发生中止的反汇编时、该指令位于0x60112BE1。

    此应用的闪存大小为0x10b18。 在0x81000处刷写时、闪存中的最大地址应为0x91b18、并可由 CPU 0x60091b18看到。

    如果我的理解是正确的、实际上就没有指令@  0x60112BE1。

    但是、当我将闪存位置更改为从0x60081000开始以与闪存位置对齐时、我会收到 SBL 失败错误消息。

    我将进一步深入探究这一点、但有一个详细的示例来解释相关内容的工作原理以及闪存位置应如何与应用程序内存映射保持一致、这会非常有用。

    期待您的阅读。

    此致

    单端

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

    进一步挖掘我的侧边:

    -当将 SysConfig 中的闪存区域的开始对齐到0x60081000,如上所述,我收到 SBL 失败消息。 这是由 地址0x81000处的 SBL 读取未返回正确的标头标记引起的。

     

    应用图像-从0x60100000开始的闪存区域与 XIP 文件匹配

     

    =>切换到应用程序不起作用。 最终进入预取中止

     

     

    应用程序闪存与闪存脚本位置对齐:

     

    图像被截断72字节!!

     

     

    SBL 无法识别顶部提到的接头

     

    向闪存中的起始位置添加72个字节

     

     

    向闪存起始位置添加256个字节:

     

     

    闪存器的起始地址似乎需要与0x1000对齐

     

     

    图像不会截断、即打印和图像文件十六进制视图匹配

     

    这次、应用程序卡在这里:

     

     

    启用 DAC 模式似乎只是引导加载程序_verifyMulticoreImage ()函数的一部分、未执行该函数。 此外、此配置设置为0:

     

    在 main.c 中启用 PHY 也是如此 在 gOspiHandle 中、配置设置为0

     

     

    SysConfig

    生成的代码

     

     

    该配置不会转换为要激活的 phyEnable 参数。

     

     

    默认情况下、进入闪存 args 结构的 DAC 模式不会设置为->值0

     

    我找不到启用 DAC 模式的方法。

    我们需要清楚地解释:
    - SBL 和应用程序交互
    -应用程序图像对齐要求与 SBL(不仅仅是与闪存位置对齐)
    -当在 XIP 中运行时,如果没有对齐,软件如何检索正确的指令地址?
    - PHY 和 DAC 模式是如何在 SBL 中启用的,因为 SYSCFG 参数似乎不会反映在代码中
    -也 DAC 模式启用似乎链接到需要身份验证的图像,但我在 SysConfig 中看不到任何参数来启用这一点
    -我们是否真正激活身份验证以启用 XIP

    我们需要您的帮助、以了解使其正常工作的详细步骤。 有关此方面的文档太浅。

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

    若要启用 DAC 模式、可使用此 API:

    int32_t OSPI_enableDacMode (OSPI_Handle handle)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="237858" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1442848/am263p4-q1-issue-with-enabling-xip-on-am263p4/5550747 #5550747"]-应用程序图像对齐要求与 SBL 间的关系(不仅仅是与闪存位置对齐)
    -当在 XIP 中运行时,如果没有对齐,软件如何检索正确的指令地址?
    - PHY 和 DAC 模式是如何在 SBL 中启用的,因为 SYSCFG 参数似乎不会反映在代码中
    -也 DAC 模式启用似乎链接到需要身份验证的图像,但我在 SysConfig 中看不到任何参数来启用这一点
    -我们是否真正激活了验证以启用 XIP[/报价]

    对于 SBL 和应用交互、我建议您 仔细学习: AM26x 器件中的次级引导加载程序流程

    在您使用 XIP 时、我们需要对齐代码和 RO-Data

    PHY 模式启用通过 syscfg 进行、SBL 将 DAC 模式配置为 XIP 执行、您可以参考 SBL OSPI 示例

    图像认证仅适用于安全器件(HSSE)、不适用于不安全器件

    XIP 不需要非身份验证。

    您能告诉我以下哪一个示例您尝试使用 XIP 和 SBL 吗?如果您可以共享 syscfg 文件更好。

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

    你好、Nilabh

    感谢您的回答。

    我已经介绍了引导流程。 当代码留在 RAM 中时、我可以使它非常正常地工作。

    到目前为止,没有成功让这个应用在 XIP 中运行。

    该文档可以很好地解释代码从 RAM 运行时的引导流程、但不适用于 XIP、也不适用于 SBL 已将应用部分加载到 RAM 中如何检索指令地址。 闪存位置和应用闪存配置之间的对齐。

    如果您有2个应用程序、并且您需要在启动时切换到另一个应用程序(即 SBL 将加载一个或另一个应用程序...)、该程序的行为将如何?

    在学院、论坛或文档上都看不到任何与 NOR 相关的内容。

    随附了3个项目。 一个是我测试的引导加载程序。 然后、您有用于 AM263P LaunchPad 的2个 LED 闪烁项目。 其中一个配置为从 RAM 格式工作。

    另一个(*_XIP*)配置为在 XIP 中工作。 它将包含我上次尝试的设置。 请参阅上面的帖子。

    为了进行闪存存储、我将电路板置于串行引导模式并使用 uniflash_uart.py 脚本、配置文件位于 XIP 项目中。

    期待您的来信。

    此致

    单端

     

    e2e.ti.com/.../0317.Project.zip

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

    尊敬的 Sebastian:

    问题在于您配置的闪存地址、它应该是0x8000000而不是60000000。

    [报价 userid="237858" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1442848/am263p4-q1-issue-with-enabling-xip-on-am263p4/5550747 #5550747"]

    向闪存起始位置添加256个字节:

    [报价]

    不知何故、我没在第一次去验证它。