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.

[参考译文] TMS320C6678:引导加载程序:SPI 模式中的错误行为

Guru**** 2609955 points
Other Parts Discussed in Thread: TMS320C6678

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580078/tms320c6678-bootloader-erroneous-behavior-in-spi-mode

器件型号:TMS320C6678

您好!

 

我当前在 DSP TMS320C6678上开发引导软件。 该软件 加载在 FLSAH NOR SPI 中。

我正在测试引导加载程序(RBL),以便在 DSP 重置后将该软件加载到 RAM 中。

使用 TRACE32和 Lauterbach 探针完成测试。

 

以下是测试协议:

-         在小端字节序(DEVSTAT 寄存器的 LSB 设置为1)中配置 DSP。

-         引导参数表以大端字节序格式生成。

-         运行 .CMM 文件,将程序计数器设置为引导加载程序的入口点 (@0x20B0FC00)

-         将 DEVSTAT 寄存器(@0x02620020)设置为0x0000260D 值、这意味着 SPI 闪存开始时的 SPI 引导模式和引导参数表  

       SPI 中的引导参数表:  

-         再次运行相同的.CMM 文件

 

问题1:此测试协议是否正确? 目前,我尚未实施该解决方案来设置  

            用于正确状态下引导模式配置的 GPIO。

 

以下是发生的情况:

-         引导参数表复制到 RAM 中,地址为@ 0x00873680,这是 引导加载程序在 RAM 中的存储地址 :

      考虑到引导加载程序在小端字节序中工作、记忆似乎正确。

-     以下是生成的 SPI 寄存器配置:

      生成的配置与 所需的配置不完全对应:

    • 所需 C2Delay 为0。 在专用 SPI 寄存器中、C2Delay 设置为1。
    • SPI 不处于主控模式且未启用

  除了这些点之外、配置可用于所用的闪存 NOR。

     

     问题2:我的配置有什么问题(请注意主 PLL 需要1GHz)?

                            实际上,我想知道 RAM 中存在的引导参数表 在默认情况下是否不是引导参数表!!!

     

     问题3:是否应以小端字节序格式生成引导参数表?

                             我已经完成了相关的测试。

               引导参数表未在@ 0x00873680…正确记忆   此区域的内容与实际引导参数表有很大不同

               但在这种情况下、SPI 处于主模式、已启用、芯片选择处于保持状态

 

在所有情况下、引导表都不会复制到 RAM 中或 RAM 中的未知位置。

请注意、引导表是使用连续的 hex6x、bconvert64x 和 b2i2c 生成的。

闪存 SPI 中的引导表设置为@0x0800。

如果没有任何其他信息、我就无法再进行调查了。 非常感谢您将来的回答  

此致

 

Alban

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

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

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

    我尚未收到 RTOS 团队的反馈。

    请问他们可以尽快回答我的问题吗?

    实际上、我无法再进行调查、因为我对引导加载程序软件调试没有任何掌握。

    这对我来说非常紧迫。

    此致

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

    我在内部对此进行了升级。

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

    Wiki 文章 Keystone 引导加载程序和资源中提供了 SPI 引导示例。 有关详细信息、请参阅该示例。 该示例中提供了可引导、引导参数格式。
    processors.wiki.ti.com/.../KeystoneI_Bootloader_Resources_and_FAQ

    如果您尚未实施基于 GPIO 的解决方案来设置 DEVSTAT、 测试这种情况的理想方法是连接到 DSP 内核、然后将引导映像闪存到 SPI NOR 闪存、执行 CPU 复位、然后解锁 KICK 寄存器并将 DEVSTAT 设置为正确的值。 现在、您可以像 CPU 脱离复位一样运行引导加载程序。

    此外、如果您有引导映像、我们建议您测试 EVM 上的引导、然后在自定义硬件上进行测试、因为我们只有在报告我们可以在环境中重现的问题时才能为您提供帮助。

    如果您有任何疑问、请查看示例并告知我们。

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

    您好 Rahul、

     尽管我仔细阅读了各种启动示例,但它目前不起作用。

     更新遇到的问题后查找提示 :

    引导参数表如下所示:

    BootParamConfig ={    

         0x0028、    /*表长度= 40 */

         0x0000、    /*校验和:无 RBL 校验和验证*/

         0x0032、    /* SPI 引导模式= 50 */

         0x0000、    /*端口号:不适用*/

         0x4028、    /* PLL 配置 MSW:PLL 模式、PLLM = 40、PreDiv = PostDiv = 2 */

         0x0202、    /* PLL 配置 LSW:PLL 模式、PLLM = 40、PreDiv = PostDiv = 2 */

         0x0001、    /*加载类型:引导表加载*/

         0x0018、    /*地址宽度:24位*/

         0x0004、    /*操作模式、4引脚*

         0x0002、    /*芯片选择被使用= CS0 */

         0x0002、    /*标准 SPI 模式:CPOL = 1、CPHA = 0 */

         0x0001、    //芯片生效和事务之间的建立时间*/

         0x03E8、    // CPU 频率 MHz:1GHz */

         0x001B、    /* SPI 总线频率 MHz:36ns */

         0x0302、    /* SPI 总线频率 KHz:36ns */

         0x0000、    /*要从中读取的第一个地址、MSW:0   */

         0x0800、    /*要从中读取的第一个地址、lsw:2048 */

         0x0000、    /*下一个芯片选择(仅用于引导配置模式)*/

         0x0000、    /*下一个读取地址 MSW (仅在引导配置模式下使用)*/

         0x0000     /*下一个读取地址 lsw (只在引导配置模式中使用)*/      

    };

     

    此表配置 : 主 PLL 设置为1GHz (CLCKIN = 100MHz)

                          1位传输周期设置为36ns 的总线 SPI

                          引导表位于 闪存 SPI 中的@0x0800处

    此 PLL 和 SPI 配置的对比已经由测试软件 …验证 它在标称状态下工作。

      

    以下是发生的情况:

    -         引导参数表复制到 RAM 中的@ 0x00873680处、这是 引导加载程序在 RAM 中的存储地址。

    -         PLL 和 SPI 配置正确

    -         引导表不会从闪存 SPI 复制到 RAM (在本地 S2 RAM 中为@0x00810000)

    -         寄存器 BOOTCOMPLETE 保持 为值0x00000000、这意味着引导加载程序始终处于活动状态。

    实际上、引导加载程序似乎在代码的同一个部分循环中执行、并且始终保持在该段内。

     

    使用以下工具从.ELF 文件生成引导表: hex6x、bconvert64x 和 b2i2c    

       

    问题1:“引导参数表”中是否存在错误参数 ?

    问题2:在处理引导表生成 时是否存在错误?

      

    此致

     Alban

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

    我将4DSP 的电路板 FMC667用作评估板。

    此致

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

    感谢您查看示例并提供有关引导情况的更多信息:

    您能否运行此处提供的调试 GEL 并在引导失败时提供输出:
    processors.wiki.ti.com/.../Keystone_Device_Architecture
    注意:确保在运行调试 GEL 文件之前没有运行其他 GEL 文件。

    它将有助于评估启动失败的位置并提供 PC 值、以便我们可以查看 ROM 引导加载程序源以确定问题。

    由于复制了引导参数表并设置了 PLL 和 SPI 时钟、我认为 DEVSTAT 或引导模式设置没有问题、但您能否提供这些信息以供我分析。 您是否测量了 SPI 时钟并观察了它是否设置为正确的值。 如果 SPI 时钟超出规格、则可以解释为什么不复制引导表。 如何使用 romparse 或使用自己的实用程序附加引导参数表? 如何在引导参数表中计算引导表地址的偏移值。

    您能否在此处提供您的引导二进制文件、以便我查看格式并提供反馈?

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

    您好 Rahul、

    我不使用 GEL 文件、因为我不使用 CCS。 我使用 TRACE32。 但是、 我可以向您提供一些信息。

    DEVSTAT 寄存器由 TRACE32手动设置为0x0000260D。

    我检查主 PLL,它在1GHz:它是可以的,因为它是所需的值。

    我还检查寄存器 SPIFMT0 = 0x00020508。 预分频值为05、这意味着 SPI 总线时钟为36ns。 因为它是所需的值。 请注意、36ns 会导致 SPI 总线时钟= 27.77MHz

    当我在测试软件中使用此类 PLL 和 SPI 配置时,它会起作用!!!

    引导加载程序在 PC=@0x20B0A350处循环。 在另一篇文章中、据说它对应于处理 SPI 传输的函数。

    当我停止执行时、可以看到 SPIBUF 寄存器包含一些接收到的数据。

    但是、这些接收到的数据似乎始终是引导软件的前四个字节。

    查找引导软件中包含的内容:  

    e2e.ti.com/.../SBoot_5F00_Sw.dat

    感谢您花时间回答我的问题

    此致

    Alban

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

    完成我的答案....

    您可以在上一个帖子中看到 Boot Parameter Table (引导参数表):
    引导参数表设置为@0x000000
    引导表设置为@0x000800 ( 0x0000、 /*要从中读取的第一个地址,MSW:0 */
    0x0800、 /*要从中读取的第一个地址,lsw:2048 */)

    为提醒,使用以下工具从.ELF 文件生成引导表:hex6x、bconvert64x 和 b2i2c

    此致

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

    您好、Rahul、

    能不能回答我的问题 实际上、我不知道要调查哪个方向。

    以下是我生成 SBoot_Sw.dat 的过程:  

    原始文件:   SBot_sw.out

      第一个命令:     /ccsv6/tools/compiler/ti-cgt-C6000-8.0.3/bin/hex6x.exe ./sbot_sw.rmd

                                          RMD 文件如下所示:  

    ------------------------------------------------------------------

    C:\Users\F553417\Desktop\HDF\BOOT\GenBootTableBoot\SBot_SW.out
    -A
    -boot
    -e _c_int00

    ROM

    ROM1:org = 0x800、length = 0x80000、memwidth = 32、romwidth = 32
    文件={C:\Users\F553417\Desktop\HDF\BOOT\GenBootTableBoot\SBot_SW.btbl}

    ------------------------------------------------------------------

    第二个命令:               /mcsdk_2_01_02_06/tools/boot_loader/ibl/src/util/bconvert/bconvert64x.exe -be

    /SBot_sw.btbl ./SBot_sw.btbl.big

     第三个命令:          /mcsdk_2_01_02_06/tools/boot_loader/IBL/src/util/btocs/b2i2c.exe

                             /SBot_sw.btbl.big ./SBoot_Sw.dat

     

    我还有一些问题:大家可以看到,我不使用实用程序 ROMPARSE 来转换 CCS 格式的文件,因为我不使用 Code Composer Studio。

                                引导加载程序是否需要 CCS 格式才能正常工作,或者仅当我们使用 Code Composer Studio 时才提供 CCS 格式?

                               初始文件.out 文件实际上是.ELF 文件吗?

    此致

    Alban Michelangeli

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

    Alban、

    很抱歉、由于某些软件发布阻止活动、我被侧边跟踪。 让我从我们离开的地方开始。
    对于 CS0的小端模式和参数表索引0、在24位寻址和4引脚模式下以及在下降沿上的数据锁存、DEVSTAT 值似乎已正确配置、以用于 SPI 引导、这看起来很准确。 此外、正如您提到的、软件基于您的 PC 卡在 SPI 传输中、正如您提到的。 如果使用 romparse 实用程序附加引导参数表、则偏移量2048 (0x800)偏移是正确的、因为 romparse 追加了8个引导参数表、每个表的大小为0x100、因此引导表应出现在所有引导参数表之后。 在您的 flsh 二进制文件中、您可以看到引导表是否从0x800偏移开始。

    在n`t 情况下、如果您不使用 ROM 解析、我不确定0x800偏移是否正确。 如果只有一个引导参数表、那么您的偏移量应等于 sizeof (引导参数表)、我认为它是0x100。 在上述步骤中、您尚未指定引导参数表如何附加到引导表。 ROM 解析是实用程序

    此外、您能否说明如何将映像刷写到 SPI NOR 中。 我们提供的示例使用 SDK 中的 SPI 写入器。 获得 SPI 映像需要在 NOR 闪存上刷写的格式非常重要、这就是我们对映像进行位翻转、然后将其传递给 SPI 写入器的原因。

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

    Alban Michelangeli 说:
     是引导加载程序需要 CCS 格式才能正常工作,或者只有在使用 Code Composer Studio 时 CCS 格式才可用?

    是的、引导表只需采用 CCS 格式、以便可以使用 CCS 存储器加载程序将其加载到存储器中、以便 SPI 写入器读取引导介质并将其刷写到引导介质中。

    Alban Michelangeli 说:
     是初始文件.out 文件,实际上是.ELF 文件?

    如果您使用的是 CGTtools 7.4.x 和更高版本、则初始.out 为 ELF 格式、默认情况下、它将在 ELF 中生成.out。 使用 hex6x utilty 将.out 文件转换为引导表、只需执行所有其他步骤即可获得刷写所需的正确格式的映像。

    romparse 是我们在 SDK 中提供的实用程序、用于将引导参数表附加到引导表、以便更改默认引导设置。

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

    您好 Rahul、

    感谢您的回答。

    我们不使用 Code Composer Studio (CCS)来刷写闪存 SPI NOR 中的数据。  我们将 TRACE32与 Lauterbach 探针结合使用

    我们使用 TRACE32工具来刷写上述闪存中的数据。 这些工具在字节后直接刷写原始数据字节。  这就是 CCS 格式与我们的流程不兼容的原因。

    首先、我们将引导参数表闪存为@0x000000。

    然后、我们独立地将引导表闪存到@0x000800。 它必须是原始数据、而不是 CCS 格式。  

    现在,我了解了为什么引导加载程序无法在 RAM 中加载我们的引导软件:这是因为 到目前为止,我没有以原始数据格式刷写引导表。

    我的“我的”和“我的“我的

    您是否有工具可以获取包含原始数据格式引导表的文件?

    此致

    Alban Michelangeli