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.

[参考译文] AM5718:M4内核的引导加载程序问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/855540/am5718-bootloader-issue-with-m4-core

器件型号:AM5718

从 AM571x IDK 板上的 microSD 卡启动多核应用时遇到问题。
我有一个用于 A15内核的 TI-RTOS 应用程序、一个用于 DSP 内核的裸机应用程序和一个用于一个 IPU (Cortex-M4)内核的裸机应用程序(两个之一)。
我可以通过 IDK 板的内部 JTAG 运行该多核应用套件。 它的每个部分(针对每个内核)都正确执行它的代码。
所有应用程序都使用 OCMC1 RAM 部分的独立部分。
通过 JTAG 调试器件时、不会检测到冲突或不适当的行为。
我还可以使用 Processor SDK RTOS 01.00.08中的预编译引导加载程序'LO'创建一个'app'文件、以便从 SD 卡加载。 在这种情况下、从 SD 卡引导时、A15和 DSP 内核正确运行卡。
问题出在 IPU 单元(Cortex-M4)。
首先、引导加载程序打印一条错误消息"IPU1 -无效存储器部分"。
在 MMU 关闭时重新编译 IPU 应用程序后、此消息会消失、但 IPU 内核仍然不显示任何生命体征。

我已经使用原始源代码构建了自定义引导加载程序、但仍会继续获得相同的结果。
我尝试修改了 IPU 时钟管理、复位和存储器映射的机制。 根据技术参考手册、所有寄存器数据都是正确的、我可以通过 JTAG 看到用于指示 IPU 模块状态的寄存器字段将其值更改为预期值。 但我的 IPU 内核应用不会以任何方式启动。

如果我可以使用 JTAG 运行 IPU 应用、这是否意味着它也应该适合引导加载程序?
引导加载程序代码(IPU Engage 器件)是否正确?
您能否与在 am571x 芯片中使用 A15内核和一个 Cortex-M4内核的 SD 卡引导加载程序共享多核应用的示例(源代码和二进制文件)?

此致。

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

    尊敬的 Anton:

    >>我可以通过 IDK 板的内部 JTAG 来运行该多核应用套件。 它的每个部分(针对每个内核)都正确执行它的代码。

    您是否使用 GEL 文件设置 IPU (PLL、MMU 等)? 如果是、您能否从 CCXML 中删除 GEL 文件并重试。 如果 在删除 GEL 文件后 IPU 无法运行、则您的问题是 IPU 程序中的 IPU 设置。 SBL 不会为您设置 IPU (GEL 文件将会设置 IPU)。 您必须在应用程序中设置 IPU。

    Ming

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

    您好、Ming。

    显然、如果没有 GEL 文件、JTAG 不会运行。 我已经知道、复位和 MMU 配置是在 AM571x_multicore_reset.gel 文件的 IPUSSClkEnable()函数中执行的、并且每次从 OnTargetConnect ()-> AM571x_multicore_EnableAllCores()-> IPU1SSClkEnable_API ()-> IPUSSClkEnable (1)调用。

    但问题不在于这一点。

    我必须说、根据上一个 PDK 版本的源代码、SBL 实际上确实有一个用于 IPU 内核的设置序列。
    pdk_am57xx_1_0_16/packages/ti/boot/SBL/board/idkAM571x/SBL_main.c:101:SBL_SlaveCorePrcmEnable()-> pdk_am57xx_1_0_16/packages/ti/boot/spl/soc/am57xx/sbl_slave_prcmEnable()-> pdk_am57xx_mu1_u1:IPU1_reset_u_u1 (与 IPU1相同、例如:IPU1_u_reset_u1)。

    我只能理解  pdk_am57xx_1_0_16/packages/ti/boot/sbl/soc/am57xx/SBL_slave_core_boot.c:553:HW_WR_REG32 (((MPU_IPU1_RAM + 0x4)、EntryPoint)调用的含义。

    为什么要在内部存储器中将条目地址值写入0x4偏移量?

    在对 IPU 引导过程进行详细研究后、我可以看到它应该以某种方式工作、但它不工作。 我觉得这个问题正处于棘手的境地、因为我尝试构建小型程序并将其完全放在内部 IPU 存储器中、以排除可能的 OCMC_RAM1地址问题、但它仍然不运行。

    SBL 源代码的 IPU 引导部分是否不正确?

    您能否从零开始分享正确的 IPU 初始化示例?

    此致、Anton。

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

    尊敬的 Anton:

    作为标准 Cortex-M4S 的 IPU 内核将从位于0x0000_0000的矢量表引导。 这是通常的 Cortex-M 格式。 MPU_IPU1_RAM + 0x4是复位处理程序。 实际上、在将复位处理程序设置为入口点后。 该程序将使议会联盟脱离复位状态。

    Ming

    uint32_t vector_table[]={
    //堆栈指针
    (unsigned long)&_stack_top、
    //重置处理程序
    (unsigned long) rst_handler、
    //标准 Cortex-M4异常处理程序
    (unsigned long) empty_def_handler、 // NMI 处理程序。 2.
    (unsigned long) empty_def_handler、 //硬故障处理程序。 3.
    (unsigned long) empty_def_handler、 //内存管理故障 4.
    (unsigned long) empty_def_handler、 //总线故障 5.
    (unsigned long) empty_def_handler、 //用法故障 6.
    (unsigned long) empty_def_handler、 //保留 7.
    (unsigned long) empty_def_handler、 //保留 8.
    (unsigned long) empty_def_handler、 //保留 9.
    (unsigned long) empty_def_handler、 //保留 10.
    (unsigned long) empty_def_handler、 // SV 调用 11.
    (unsigned long) empty_def_handler、 //调试监视器 12.
    (unsigned long) empty_def_handler、 //保留 13.
    (unsigned long) empty_def_handler、 // PendSV 14.
    (unsigned long) empty_def_handler、 // SysTick 15.
    //现在64个特定于 CPU 的中断处理程序
    (unsigned long) empty_def_handler、 // ISR 0x00
    
    。} 



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

    尊敬的 Anton:

    >>您能否从零开始分享正确的 IPU 初始化示例?

    pdk_am57xx_1_0_16/packages 文件夹中

    使-C ti/boot/sbl example_clean Board=idkAM571x SOC=AM571x

    使-C ti/boot/SBL 示例 Board=idkAM571x SOC=AM571x

    将为您构建 A15、DSP 和 IPU 映像的 SBL 示例。

    它们将位于 pdk_am57xx_1_0_16\packages/ti\boot\sbl\binary\idkAM571x\example 中。

    Ming

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

    尊敬的 Anton:

    有关引导加载程序调试、请参阅以下链接:

    http://software-dl.ti.com/processor-sdk-rtos/esd/docs/06_01_00_08/rtos/index_Foundational_Components.html#common-steps-to-debug-application-boot

    4.6.4.1.2.软件调试步骤

    Ming

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

    尊敬的 Anton:

    为了使 idkAM571的多核应用程序成为"app" 、 您需要在 SBL 示例构建后执行以下操作:

    cd .\ti\boot\sbl
    导出 bin_path=./二进制文件
    导出 APP_MPU_CPU0=./binary/idkAM571x/example/a15/mpuc0/bin/sbl_app.out
    导出 APP_MPU_CPU1=""
    导出 APP_DSP1=./binary/idkAM571x/example/c66/dsp1/bin/sbl_app.xe66
    导出 APP_DSP2=""
    导出 APP_IPU1_CPU0=./binary/idkAM571x/example/m4/ipu1/bin/sbl_app.xem4
    导出 APP_IPU1_CPU1=""
    ..\tools\scripts\AM57xImageGen.bat

    生成的"app" 将位于.\binary\app

    将 MLO 和应用程序复制到 FAT32格式 的 SD 卡、您将可以为 idkAM571x 进行引导。

    见4.6.3.2.6.3。 有关详细信息 、请参阅《Processor SDK 的 Windows 环境 RTOS 软件开发人员指南》。

    Ming   

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

    您好、Ming。

    最终、我使 IPU1-0内核按设想运行。 问题出在 Ammu 配置中。 SBL 源中的 Ammu 默认寄存器值会导致与 GMPC 控制器发生冲突、我在自定义引导加载程序中从 A15内核配置该控制器的时间比启动 IPU 早一点。 我使用 cslr_unicache_mmu.h 文件中的 mac玫瑰花 重写了 IPU1_Ammu_Config()函数,现在 IPU1-0的固件已加载并从 OCMC-RAM1运行。

    我将源代码留在这里、以防它 变得很方便。

    void IPU1_Ammu_Config (void)
    {
    CSL_UnicacheMMuRegs * ammuReg =(CSL_UnicacheMMuRegs *) CSL_IPU_UNICACHE_MMU_regs;
    
    //大页面翻译
    //逻辑地址
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_ADDR (0)、0x40000000);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_ADDR (1)、0x8000000);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_ADDR (2)、0xA0000000);
    
    //物理地址
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_XLTE (0)、0x40000000);//所有外设
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_XLTE (1)、0x8000000);// DDR0
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_XLTE (2)、0xA0000000);// DDR0
    
    //策略寄存器
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_policy (0)、
    CSL_FMKT (UNICACHEMMU_LARGE_POOLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_LARGE_POLICE_SIZE、512MB)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_Cacheable、disable)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_POSTED、NON_POSTED)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_WR_policy、WT);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_POLICE_policy (1)、
    CSL_FMKT (UNICACHEMMU_LARGE_POOLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_LARGE_POLICE_SIZE、512MB)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_Cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_POSTED、POSTED)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_WR_policy、WB);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_LARGE_policy (2)、
    CSL_FMKT (UNICACHEMMU_LARGE_POOLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_LARGE_POLICE_SIZE、512MB)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_Cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_POSTED、POSTED)|
    CSL_FMKT (UNICACHEMMU_LARGE_L1_WR_policy、WB);
    
    //中页
    //逻辑地址
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_MED_ADDR (0)、0x00300000);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_MED_ADDR (1)、0x00340000);
    
    //物理地址
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_MED_XLTE (0)、0x40300000);// OCMC SRAM1
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_MED_XLTE (1)、0x40340000);// OCMC SRAM1
    
    //策略寄存器
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_MED_policy (0)、
    CSL_FMKT (UNICACHEMMU_MED_POLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_MED_POLICE_SIZE、256KB)|
    CSL_FMKT (UNICACHEMMU_MED_policy_L1_cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_MED_POL1_POSTED、POSTED)|
    CSL_FMKT (UNICACHEMMU_MED_POL1_WR_policy、WB);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_MED_policy (1)、
    CSL_FMKT (UNICACHEMMU_MED_POLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_MED_POLICE_SIZE、256KB)|
    CSL_FMKT (UNICACHEMMU_MED_policy_L1_cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_MED_POL1_POSTED、POSTED)|
    CSL_FMKT (UNICACHEMMU_MED_POL1_WR_policy、WB);
    
    //小页
    //为 SRAM 的前16kB 启用缓存
    CSL_FINST (ammuReg -> SMall_POLICY0、UNCHEMU_SMall_POLICY0_L1_cachable、enable);
    //将区域扩展到16kB 以进行 L2MMU/WUGEN 访问
    CSL_FINST (ammuReg -> small_Policy1、UNICACHEMMU_SMall_Policy1_SIZE、MAX);
    
    //逻辑地址
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMAL_ADDR (0)、0x00004000);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMAL_ADDR (1)、0x00008000);
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMAL_ADDR (2)、0x0000C000);
    
    //物理地址
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMall_XLTE (0)、0x55024000);// SRAM
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMall_XLTE (1)、0x55028000);// SRAM
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMall_XLTE (2)、0x5502C000);// SRAM
    
    //策略寄存器
    HW_WR_REG32 (CSL_IPU_UNCH_MMU_regs + CSL_UNCHEMMU_SMIT_POLICE_policy (0)、
    CSL_FMKT (UNICACHEMMU_SMIT_POLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_SMIT_POLICE_SIZE、16KB)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_Cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_POSTED、NON_POSTED)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_WR_policy、WT);
    HW_WR_REG32 (CSL_IPU_UNICACHE_MMU_regs + CSL_UNCHEMMU_SIMPLE_POLICAL (1)、
    CSL_FMKT (UNICACHEMMU_SMIT_POLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_SMIT_POLICE_SIZE、16KB)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_Cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_POSTED、NON_POSTED)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_WR_policy、WT);
    HW_WR_REG32 (CSL_IPU_UNICACHE_MMU_regs + CSL_UNCHEMMU_SMASE_POLICAL (2)、
    CSL_FMKT (UNICACHEMMU_SMIT_POLICE_ENABLE、ENABLE)|
    CSL_FMKT (UNICACHEMMU_SMIT_POLICE_SIZE、16KB)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_Cacheable、enable)|
    CSL_FMKT (UNICACHEMMU_SMIT_POL1_POSTED、NON_POSTED)|
    CSL_FMKT (UNICACHEMMU_SMALL_POICE_L1_WR_POLICTION、WT);
    } 

    和用于 M4内核的链接器文件部分。

    打开 MMU 时的#ifdef MMU /*内存映射*/
    
    内存
    {
    IRAM: O = 0x00000000 l = 0x00010000 // 64KB 内部 SRAM */
    //OCMC_RAM1:O = 0x00300000 l = 0x00080000 // 512KB L3 OCMC SRAM1总计*/
    //OCMC_RAM1:O = 0x00300000 l = 0x00010000 // 64KB L3固件使用的 OCMC SRAM1 *
    OCMC_RAM1:O = 0x00310000 l = 0x00020000 // 128KB L3固件使用的 OCMC SRAM1 */
    //OCMC_RAM1:O = 0x00330000 l = 0x00050000 //引导加载程序使用的320KB L3 OCMC SRAM1 *
    DDR0: o = 0x8000000 l = 0x40000000 // 1GB 外部 DDR 组0 */
    }
    
    #else // MMU 关闭时的内存映射*/
    
    MEMORY
    {
    IRAM: O = 0x00000000 l = 0x00010000 // 64KB 内部 SRAM */
    //OCMC_RAM1:O = 0x40300000 l = 0x00080000 // 512KB L3 OCMC SRAM1总计*/
    //OCMC_RAM1:O = 0x40300000 l = 0x00010000 // 64KB L3固件使用的 OCMC SRAM1 *
    OCMC_RAM1:O = 0x40310000 l = 0x00020000 // 128KB L3固件使用的 OCMC SRAM1 *
    //OCMC_RAM1:O = 0x40330000 l = 0x00050000 //引导加载程序使用的320KB L3 OCMC SRAM1 *
    DDR0: O = 0x8000000 l = 0x40000000 // 1GB 外部 DDR 组0 */
    }
    
    #endif
    
    SECTIONS
    {
    .intvecs:> 0x00000000
    .intc_text:> IRAM
    .text: > OCMC_RAM1
    .const: > OCMC_RAM1
    .cinit: > OCMC_RAM1
    init_array:> IRAM
    .data: > OCMC_RAM1
    .bss: > OCMC_RAM1
    .stack: > OCMC_RAM1
    .sysmem: > OCMC_RAM1
    .TI.noinit:> OCMC_RAM1
    } 

    我还必须添加一个可能性、即可以将 IPU 固件从 SD 卡加载到地址>= 0x300000的段、以供 MMU 使用选项。

    无论如何、仍然有一个问题。

    在我的实验中、我找不到从0xA0000000及更高版本开始的 DDR0存储器地址运行 IPU1-0代码的方法。 DDR0的任何低位地址都可以。 我假设有一些更深层次的问题、但只要我最初打算将 OCMC-RAM1用于 IPU1-0代码、这并不是一个关键问题。

    但是、很高兴弄清这一点。

    此致、Anton。