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.

[参考译文] AM5716:RTOS SBL 中的 IPU 问题

Guru**** 2589300 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/641341/am5716-ipu-issue-in-rtos-sbl

器件型号:AM5716

您好!

我使用 AM57xx PDKv1.0.8的 SBL 检查了 IPU 引导的操作。 源代码中似乎存在错误。 如果我的理解是正确的、请在下一个 SDK 版本中进行更正

1.我认为 IRAM_MEM 的起始地址不正确。 它不是 IPU 的 IRAM 区域。

   IRAM_MEM:    org = 0x00800000 len = 0x8000     //  RAM 0x1FBFF*/

   C:\ti\pdk_am57xx_1_0_8\packages/ti\boot\sbl\examples\ipu1MulticoreApp\lnk_cpu0.cmd

2. 我认为以下范围(红色)是0x4000而不是0x10000。

                       if (((section.addr >= CSL_IPU_IPU1_boot_space_regs)&&
                            (section.addr <
                             (CSL_IPU_IPU1_BOOT_SPACE_REGS + 0x10000U)))||
                           ((section.addr >= CSL_IPU_IPU1_RAM_regs)&&
                            (section.addr <(CSL_IPU_IPU1_RAM_regs + 0x10000))))

   C:\ti\pdk_am57xx_1_0_8\packages/ti\boot\sbl\src\rprc\sbl_rprc.c

此致、

Kazu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kazu、

    [引用用户="Kazu Kon"]

    1.我认为 IRAM_MEM 的起始地址不正确。 它不是 IPU 的 IRAM 区域。

       IRAM_MEM:    org = 0x00800000 len = 0x8000     //  RAM 0x1FBFF*/

       C:\ti\pdk_am57xx_1_0_8\packages/ti\boot\sbl\examples\ipu1MulticoreApp\lnk_cpu0.cmd

    [/报价]

    是的、你是对的。 复位时用于 IPU 的 IRAM 从0x00000000而不是0x00800000开始。 这似乎是从 DSP 存储器映射中获取的、其中该映射是 L2 RAM 的本地地址。 正确的 IRAM_MEM 设置为 pdk_am57xx_1_0_8\packages/ti\cSL\examples\lnk_m4.cmd。

    我与开发团队进行了检查、他们提到 SBL 示例仅针对 M4的 ARM 和 DSP 启动进行了验证、他们建议使用 CSL 或 PDK 驱动程序二进制文件与 SBL。

    [引用用户="Kazu Kon"]

    2. 我认为以下范围(红色)是0x4000而不是0x10000。

                           if (((section.addr >= CSL_IPU_IPU1_boot_space_regs)&&
                                (section.addr <
                                 (CSL_IPU_IPU1_BOOT_SPACE_REGS + 0x10000U)))||
                               ((section.addr >= CSL_IPU_IPU1_RAM_regs)&&
                                (section.addr <(CSL_IPU_IPU1_RAM_regs + 0x10000))))

       C:\ti\pdk_am57xx_1_0_8\packages/ti\boot\sbl\src\rprc\sbl_rprc.c

    [/报价]

    我认为0x10000 是 IPU L2 RAM 的正确大小。 请注意、在上电复位时、IPU MMU 会将 IPU RAM 设置为位置0x00、如 IPU 存储器映射表下 TRM 中的脚注所示。

    当 IPU L2被放置在0x00时、整个64KB 可使用范围为0x000000至0x10000的地址进行访问、这是 该设置中所指的内容。 这n`t 令人困惑、因为代码使用 CSL_IPU_IPU1_BOOT_SPACE_regs、但该地址对应于 IPU IRAM、该值为64KB、因此我不认为这里存在问题。

    请告知我们这是否仍然不清楚

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

    Rahul、

    感谢您的快速回答。

    我知道。 整个 L2 RAM (IPU_RAM)由 MMU (Ammu)从0x00000000映射、不是吗? 但是、在 TRM 表2-9 IPU 存储器映射中、IPU_BOOT_SPACE 的空间写入为16KB 而不是64KB。 这是否意味着 Ammu 使用一个 cache_MMU_small_policy_k 对 IPU_boot_space 执行仅16KB 的地址转换?

    此致、
    Kazu

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

    复位时、MMU 加载第0页、强制 L2 RAM 为地址0x0。 复位后使用 GEL 文件初始化 SOC 时、您会注意 到 TI 提供的大多数 MMU 配置都将整个 L2RAM 置于0x00000000至0x00020000的可寻址范围内。

    例如、如果查看 GEL 文件 AM572x_multicore_reset.gel 、您将看到小页面配置如下所示:

    /*小页*/
    regAddr = IPU_MMU_CFG;
    regAddr += 0x920;
    WR_MEM_32 (regAddr、 0x00000000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x40000000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x00004000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x00008000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x20000000);regAddr += 0x4;
    
    regAddr = IPU_MMU_CFG;
    regAddr += 0x9A0;
    WR_MEM_32 (regAddr、 0x55020000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x55080000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x55024000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x55028000);regAddr += 0x4;
    WR_MEM_32 (regAddr、 0x55020000);regAddr += 0x4; 

    在 RTOS SDK 中、您将看到小页面设置如下:

    /*小页*/Ammu.smallPages
    [0]。pageEnabled = Ammu.Enable_Yes;
    Ammu.smallPages [0];ammu.smallPages
    [0];translatedAddress = 0x55020000;
    Ammu.smallPages [0];translationEnabled = Ammu.Enable_Amma.size;ammu.Ammu.=1620000.Amma.Amma.Amma.Amma.Amages[0]
    
    Ammu.smallPages [0].volatileQualifier = Ammu.volatile_follow;
    Ammu.smallPages [0].L1_posted= Ammu.cachepolicy_cacheable;Ammu.csatege_cachePages[0].smallages[0].L1_posted= Amachemu.PostedPolicy_non_posted;Ammu.Ammu.Ammu.pages[0].Ammu.Amnateges[0].Amateges_amages[0].all_amages[0].allateges_
    
    
    
    
    Amsize.smallPages 启用= Ammu.Enable_Yes;
    Ammu.smallPages [1].logicalAddress = 0x40000000;
    Ammu.smallPages [1].translatedAddress = 0x55080000;
    Ammu.smallPages [1].translationEnabled = Ammu.Enable_Yes;Ammu.Amages1.Ammu.Amages[1].translation_1.translationEnabled
    
    Ammu.smallPages [1].volatileQualifier = Ammu.volatile_follow;
    Ammu.smallPages [1].L1_cacheable = Ammu.csefice_non_cachable;
    Ammu.smallPages [1].L1_posted= Ammu.PosedPolicy_non_posted;Ammu.Pached.pages[1].Ammu.Ammu.smallateges[1].ategi_nategations=Ammu.amu.poulations.pnategations=Ammu.amu.amu.ature_on_posted.pag
    
    
    
    Ammu.smallPages 启用= Ammu.Enable_Yes;
    Ammu.smallPages [2].logicalAddress = 0x00004000;
    Ammu.smallPages [2]。translatedAddress = 0x55024000;
    Ammu.smallPages [2].translationEnabled = Ammu.Enable_Yes;Ammu.Ammu.smallages[2]
    ;Ammu.Amma.Amma.Amma.Amages[2]
    Ammu.smallPages [2].L1_cacheable = Ammu.csachepolicy_cacheable;
    Ammu.smallPages [2].L1_posted= Ammu.PostedPolicy_non_posted;
    Ammu.smallPages [2].L2_cachable = Ammu.csefolice_non_csedPolicy=Ammu.Ammu.Ammu.pages[posted].Ammu.Ammu.pages=Ammu.Ammu.Ammu.Amstepage=Ammu.Amnon_posted.pages=Ammu.Ammu.
    
    
    
    Amable.smallPages [3].logicalAddress = 0x00008000;
    Ammu.smallPages [3].translateAddress = 0x55028000;
    Ammu.smallPages [3].translationEnabled = Ammu.Enable_Yes;
    Ammu.smallachePaages[3].size = Ammu.small_16K;Ammu.micro.al.polages[3]
    ;Ammu.amu.ul_natures[Amcages[3]
    Ammu.smallPages [3].L1_posted= Ammu.PostedPolicy_non_posted;
    Ammu.smallPages [3].L2_cacheable = Ammu.csachepolicy_non_cachable;
    Ammu.smallPages [3].L2_posted= Ammu.PostedPolicy_non_posted;
    
    

    只要您了解 MMU 设置需要与您在链接器命令文件中使用的地址一致、就可以了。 要检查 MMU 设置、我喜欢使用存储器浏览器、CCS 仿真器将显示从 IPU 内核看到的存储器位置的内容。

    如果在连接到 IPU_C0时转至0x00000000、则内容将与0x55020000匹配。 类似地、0x00004000将与0x55024000匹配、以此类推。

    此致、

    Rahul

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

    Rahul、

    感谢您的支持。 请允许我向您提出几个问题。

    [引用用户="Rahul Prabhu"]

    正确的 IRAM_MEM 设置为 pdk_am57xx_1_0_8\packages/ti\cSL\examples\lnk_m4.cmd。

    [/报价]

    我认为长度为0x10000 (64KB)、而不是0x1000 (4KB)。 RAM 0x1FBFF 的注释也很奇怪。 对吧?

    IRAM_MEM:org = 0x00000000 len = 0x1000 // RAM 0x1FBFF*/

    [引用用户="Rahul Prabhu"]

    如果在连接到 IPU_C0时转至0x00000000、则内容将与0x55020000匹配。 类似地、0x00004000将与0x55024000匹配、以此类推。

    [/报价]

    我可以​​使用 CCS 存储器浏览器对0x55020000 ~ 0x5502FFFF 的所有64KB 区域进行读取和写入。 我可以对0x00000000 ~ 0x0000BFFF 的48KB 区域执行此操作、但无法对0x0000C000 ~ 0x0000FFFF 的最后16KB 区域执行此操作。 我想这个区域不是由 Ammu 小页定义的(16KB)。 正确吗?  

    此外、AMmu 中等页面(256KB)的以下 GEL 配置适用于 OCMC_RAM1的后半部分。 我想第1页的物理地址设置为0x40340000、而不是0x40400000。 (逻辑地址也是0x00340000、而不是0x00400000。)

    /*中页*/
    regAddr = IPU_MMU_CFG;
    regAddr += 0x860;
    WR_MEM_32 (regAddr、0x00300000);regAddr += 0x4;
    WR_MEM_32 (regAddr、0x00400000);regAddr += 0x4;

    regAddr = IPU_MMU_CFG;
    regAddr += 0x8A0;
    WR_MEM_32 (regAddr、0x40300000);regAddr += 0x4;
    WR_MEM_32 (regAddr、0x40400000);regAddr += 0x4;

    [引用用户="Rahul Prabhu"]

    在 RTOS SDK 中、您将看到小页面设置如下:

    [/报价]

    我找不到源代码。 您提到的是 PSDK-RTOS 的哪个目录?

    此致、

    Kazu

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

    [引用用户="Kazu Kon"]

    我认为长度为0x10000 (64KB)、而不是0x1000 (4KB)。 RAM 0x1FBFF 的注释也很奇怪。 对吧?

    IRAM_MEM:org = 0x00000000 len = 0x1000 // RAM 0x1FBFF*/

    [/报价]

    已商定、如果将 L2RAM 移动到逻辑地址0x00000000、则之后的存储器长度应为64KB (0x10000) 、这将对应于 GPMC 直接地址空间。

    [引用 USER="Kazu KON">我可以​​使用 CCS 内存浏览器读取和写入0x55020000 ~ 0x5502FFFF 的所有64KB 区域。 我可以对0x00000000 ~ 0x0000BFFF 的48KB 区域执行此操作、但无法对0x0000C000 ~ 0x0000FFFF 的最后16KB 区域执行此操作。 我想这个区域不是由 Ammu 小页定义的(16KB)。 正确吗?  [/报价]

     n`t 正确、顶部的16MB 似乎是在小型 AMmu 表中配置的。

    [引用用户="Kazu Kon"]

    /*中页*/
    regAddr = IPU_MMU_CFG;
    regAddr += 0x860;
    WR_MEM_32 (regAddr、0x00300000);regAddr += 0x4;
    WR_MEM_32 (regAddr、0x00400000);regAddr += 0x4;

    regAddr = IPU_MMU_CFG;
    regAddr += 0x8A0;
    WR_MEM_32 (regAddr、0x40300000);regAddr += 0x4;
    WR_MEM_32 (regAddr、0x40400000);regAddr += 0x4;

    [/报价]

    该设置将256KB 的 OCMC_0 (0x4030_0000)映射到逻辑地址(0x0030_0000)、将256KB 的 OCMC_1 (0x4040_0000)地址映射 到逻辑地址(0x0040_0000)。 如果您需要 OCMC 的整个512KB、 则需要在介质表中添加另一个条目、以重新映射上部256KB。

    [引用用户="Kazu Kon"]

    Rahul Prabhu

    在 RTOS SDK 中、您将看到小页面设置如下:

    [/报价]

    很抱歉未提供这些设置的确切路径。 如果您使用 M4内核上支持的任何驱动程序示例、例如 UART、SPI、I2C 等、则 M4的示例中有一个.cfg 文件具有此设置。 让我向您介绍 SPI 驱动器 M4示例配置。

    pdk_am57xx_1_0_x\packages/ti\drv\spi\test\am572x\m4\BIOS\spi_m4_idkAM572x.cfg

    对于 M4上的所有 PDK 驱动程序示例、AMmu 设置通常相同。

    希望这对您有所帮助。

    此致、

    Rahul