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.

[参考译文] TMS320C6657:UART 引导模式问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/662159/tms320c6657-uart-boot-mode-problems

器件型号:TMS320C6657

我们正在尝试在定制 PCB 上对 C6657执行 UART 模式引导。

根据 TI 文献中的指导、我们合成了一个包含二进制引导表(从 hex6x 实用程序的.hex 输出转换)的文件、该文件打包成数据包以满足 Xmodem 标准。  当我们在上电复位后启动引导加载时、我们的整个引导文件会成功地与预期的来自6657数据包的 ACK 进行传输。   但是、这之后引导映像似乎没有运行、当我们在引导后通过 JTAG 连接到处理器时、我们看不到 C6657的 SRAM 区域(L2和 MSMC)中安装了代码或 CINIT 段的任何证据。

下面是我们项目的二进制、xmodem 打包引导表和范围跟踪、用于验证其到 C6657的确切传输。

您能否查看详细信息并向我们建议错误的操作?   

我们已重新排序段说明符和段数据的字节序(32位级别)。  但会发生相同的结果。  我们在 TI 文献中找不到任何进一步的信息来说明问题是什么。

  

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

    我已通知工厂团队。 他们将直接在此处发布反馈。

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

    工厂是否会对此做出响应?

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

    David、

    此问题当前已分配给我。 然而,由于问题的现有优先次序,我未能做到这一点。 我可能只能在本周即将结束时尽早研究这一点。

    同时、如果您提供有关电路板和启动设置的一些信息、我可以尝试确定是否有任何东西在我身上跳过。

    1.您是否已在已知良好硬件的 TI EVM 上测试过此测试、或仅在电路板上测试过此情况。
    2.您能否尝试仅在入口点为0x0c000000的情况下将代码段加载到 MSMC 存储器中、并检查这是否会产生影响。
    请共享应用程序的二进制文件和映射文件、以便我们查看加载段的位置。 还列出了用于生成 UART 二进制文件的步骤和工具。
    4.当引导失败并且您连接到 DSP 时、程序计数器仍在 ROM 中还是在 MSMC/L2 RAM 区域中。 如果它仍在 ROM 存储器中、请提供程序计数器的值、以便我们可以在引导 ROM 中使用符号对其进行标记。


    此致、
    Rahul

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

    1. 尚未在 EVM 上进行测试。  我们相信、我们的定制6657电路板能够充分满足 UART 启动过程的需求。  正如我在原始文章中所述、ROM 引导加载程序正在完全读取我们的整个引导映像文件、所有 XMODEM 确认均如 TI 文献中所述。

    2. 测试程序是为 MSMC 设计的。  如果仔细检查我的第一个帖子、您将在文件位置0xC0处看到段标题、段长度= 0x07A0且加载地址 = 0x0C00C000。  这是程序的.text 段。   另一个加载段是引导映像的开始、 即长度为0xA0字节的 CINIT 段、位于 L2 SRAM 0x00804000处。

    3. 附加文件存档(.zip)   

            BootTest_A.hex (Hex6x.exe 中的引导表)  

             BootTest_A.map   

             BootTest_A.dat   (引导表文件 BootTest_A.hex 的二进制实现)、

             BootTest_AXmodem.bin

        生成 UART 二进制文件的步骤:

         a) 修改 了 BConvert64x (PDK 中提供的源代码)以在 Visual Studio 2015 C++中编译。   

                更改: 修复了 Win10中允许的文件访问 API 的问题。   

                        将位流输出到二进制文件而不是 ASCII 文件中。

                        已验证二进制文件是否与 _.hex 相同

         b) 我们有一个 Python 实用程序、用于将 BootTest_A.dat 打包成 Xmodem 格式

         C) 我们将通过 USB 链路将 UART 映像加载到 Cypress USB Bridge 处理器中、该处理器将流转换为 UART 115.6K。   第一个后置中的范围跟踪验证这是否正常工作。

    4) 将在今天晚些时候连接 JTAG (非程序加载)和发布结果时检查该执行地址和处理器状态。

                         e2e.ti.com/.../BootTest_5F00_AXmodem.zip

             

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

    最后一个(4):  PC 位于 0x20B11B54  (在 ROM 引导加载空间中)

    Dave

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

    略为详细的逆向工程...   在读取引导映像后、ROM 引导加载程序执行区域设置限制为:

    0x20B0 2E88

      --> 分支(调用)  0x20B1 1B34

         从0x20B1 1B56返回     到0x20B0 2EA0

         从0x20B0 2EA6返回   到0x20B0 2E88

    Dave

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

    David、

    感谢您提供相关信息。 我快速查看了这些文件。

    您n`t 提供的 MAAP 文件来自十六进制工具、而不是与您的应用程序.out 对应的文件、因此它不会告诉我们所有符号和代码/数据段的加载位置。  n`t 测试 XMODEM 传输的方法是使用 Windows 串行终端实用程序并将二进制文件发送到 DSP、因此我们不会按照您提到的任何 XMODEM 格式对二进制文件进行封装。

    我提供了一个示例二进制文件、我们过去使用其中一个内部电路板来测试该器件上的 UART 启动。

    e2e.ti.com/.../C6657_5F00_UART_5F00_boot.zip

    创建映像的步骤为:

    • hex6x -a -order=$(ORD)-boot -e=_c_int00 -bootorg=0x0400 -memwidth32 -romwidth32 -o=tmp.btbl
    • b2ccs tmp.btbl application.btbl.ccs
    • byteswapccs  application.btbl.ccs application.btbl.swap.ccs
    • ccss2bin application.btbl.swap.ccs application.btbl.swap.bin

    然后、该器件配置为在 UART 引导模式下引导、串行终端以115.2kbps 的速率连接到 SOC 上的 UART0。 此处所述的工具用于将引导映像发送到 SOC。

    processors.wiki.ti.com/.../KeystoneII_Boot_Examples

    此致、

    Rahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您连接到部件时、程序计数器会指示 ROM 处于某些延迟功能中:

    虽然由于 TI 政策、我无法发布所有 BootROM 符号。 为了获得调试方面的其他帮助、下面是 UART 引导函数在与您的用例相关的 ROM 中的位置。

    20b06600 _uartXmodemNack
    20b066c0 _uartXmodemTimerExpire
    20b068a0 _uartXmodemCrc
    20b06944 _uartXmodemData
    20b06f20 _uartXmodemBoot
    20b072f8 _bootMainUart
    20b07498 _bootInitBootParamsUart
    20b0ff64 _hwUartClearReceiver
    20b0fd54 _hwUartConfig
    20b0fccc _hwUartDisable
    20b0fc84 _hwUartGetData
    20b0fc40 _hwUartSendChar
    20b000a0 _romtBcfgInit
    20b000a8 _romtBcfgProcess
    20b00020 _romtBootExit
    20b00010 _romtBtblInit
    20b00018 _romtBtblProc
    20b0c490 _bootExit

    希望这对您有所帮助。

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

    这是该 项目的链接器.map 文件。

    我们将仔细回顾您提到的步骤、这些步骤在本论坛上的过去文章中似乎很熟悉。   

    但是、这些后端实用程序在我们最近安装的用于 Windows 的 CC7和 SDK 中不会作为可执行程序出现。  我们确实在这些实用程序的 PDK 中找到了这些实用程序的 C 源代码。  在使用 VS 2015 C++的 Windows 环境中构建这些 C 程序会由于正在使用的 File-API 被弃用而产生错误、因此必须在每个程序中进行更正。   

    我缺少什么吗?   我认为这些后端处理步骤在文献中没有说明(6657数据表和 Keystone 引导加载程序指南都没有说明)?   

    Dave

    e2e.ti.com/.../BootTest_5F00_A_5F00_Map.zip

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

    又花了一天的时间进行实验。   

    1) 1) 您发送给我用于6657 UART 引导的.bin 映像使用 TeraTerm 正确引导到我的 EVM 中。  

       为此、需要使用下图所示的 EVM 开关配置:

      

             此处的关键课程:  SW3:1: 针对大端字节序设置

    调查结果:

      在任何情况下、如果开关3:1处于小端序关闭位置、C6657 ROM 引导加载程序都不会将任何数据复制到任何 C6657存储器中。  在 XMODEM 交换时、引导加载程序似乎在完整的二进制引导表中读取、但仅丢弃数据。 ROM B/L 最终会"卡在"由本帖子中更高提到的 ROM BL 地址位置封装的环路中。  

    我生成的任何引导映像都是如此、其中引导映像 TI 提供了我、并生成了一个小的手动编码(即非常简单)二进制引导表。  诸如反转段头的字节排序等排列没有任何不同。  确定性行为:  

      上电端序= BIG (SW3:1打开)-       XMODEM 传输后、始终在 C6657存储器中找到引导映像数据(即使映像中的端序错误也是如此)

                          小尺寸(SW3:1关闭)   C6657存储器在 XMODEM 传输后"未触摸"、RBL 仍在循环中执行。  

    假设:

      要使用 UART 引导模式、必须将芯片配置为大端字节序。  

      这意味着引导的固件要正常工作、必须为大端序 ALU 操作编译它。

    支持测试:

      我们在 CCSv7的大端字节序设置中重建了引导测试程序。   

    为 hex6x 提供了命令行:

             hex6x -boot -a -e=_c_int00 -order=M -memwidth=32 -romwidth=32 -oBootTest_A.hex -mapBootTest_A.map  BootTest_A.out

    转换为二进制:

       使用在 VS2015C++编译器中修改的 BConvert64实用程序仅输出二进制文件、并应用 -be 标志。

             bConvert64    BootTest_A.hex  BootTest_A.dat  -be   //修改的 BConvert64。   写入二进制文件、而不是 ASCII 文件

    UART 发送到6657:

      Tera Term XMODEM 传输。   通过与 XDS100 mini USB 关联的 USB 虚拟通信将.dat 文件传输到 EVM。

    已验证:
      已连接调试、无程序加载或 GEL 加载。

    一旦我们重新接线以将 GPIO[0] ENDIAN 设置为大电平、我确信这在我们的定制板上也能正常工作。

    结论:  

     如果不能查看 T.I.的 ROM B/L 的源代码、我很有信心上述断言是正确的。  

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

    David、

    感谢您分享您的引导观察结果、因为这对于其他开发人员而言非常有用。 我能够重现此问题、并可以确认使用您的映像和我提供的映像、我只能在启用大端开关时在 DSP 上启动。

    在您的努力的基础上再接再厉、 我重新查看了我在2012年推出的 SOC 中的笔记、并注意到我与您共享的映像旨在测试大端模式下的引导、这意味着 DSP 将处于大端模式、应用程序也在大端模式下编译。

    如果需要在小端字节序模式下完成相同的操作、则需要使用使用在16位边界交换的映像创建的映像、而不是使用字节序实用程序。  让我来描述一下这个过程。 需要使用引导工具按以下顺序创建引导映像:

    • hex6x -a -order=$(ORD)-boot -e=_c_int00 -bootorg=0x0400 -memwidth32 -romwidth32 -o=tmp.btbl
    • b2ccs tmp.btbl application.btbl.ccs
    • swap16 application.btbl.ccs application.btbl.swap.ccs
    • ccss2bin application.btbl.swap.ccs application.btbl.swap.bin

    测试小端字节序的 UART 引导映像:

    e2e.ti.com/.../testbig.gauss.le.btbl.swap16.bin

    我使用为小端 DSP 模式构建的应用程序创建引导映像、并将 SW3[1]设置为小端模式、从而对此进行了测试。 当我在引导映像传输后连接到 DSP 时,我会在位置0x0c000534看到 DSP 执行代码,该代码确认了引导。

    请尝试一下、并告诉我这是否适用于您的设置。 如果您有任何疑问、请告诉我。

    此致、

    Rahul

    PS:我意识到 swap16 totol 不是我们软件的一部分、所以我在这里附上源代码和二进制文件供您参考:

    e2e.ti.com/.../swap16.zip