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.

[参考译文] PROCESSOR-SDK-AM335X:SPI 引导失败

Guru**** 2553260 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/590255/processor-sdk-am335x-spi-boot-fails

器件型号:PROCESSOR-SDK-AM335X

您好!

我有一个在调试中运行良好的系统--一个在 L3 OCMC RAM 中运行的次级引导加载程序和一个在外部 DRAM 中运行的应用程序。  但我无法在加电时使次级引导加载程序从 SPI 闪存中运行。

SYSBOOT[4:0]设置为11001b、因此 ROM 引导加载程序引导序列应为 SPI0->MMC0->EMAC1->UART0。

当闪存为空时、我看到 ROM 引导加载程序执行 4个短 SPI 突发(大概每个为512字节页) 、然后停止。  当使用我的 SBL 代码对闪存进行编程时、会有更长的 SPI 突发(大约44ms)、这将是在 SBL 中读取的合理时间、因为它的大小为38860字节。

但是,它显然不执行。  我唯一可以告诉它的方法是在当前版本的 SBL 中,它将 在完成系统初始化后一直闪烁一个 LED --并且没有 LED 活动。

 闪存中的前几个字节如下,从地址0开始,并布局为32位大端字。 。
00 00 97 D4  40 30 00  E5 9F F0 18  E5 1F F0 08  E5 9F F0 18 等

将这个展开一个位、您可以看到标头后跟一个相当正常的外观 ARM IRQ_Vector/instruction 序列:
0x000097D4
0x40300000
0xE59FF018
0xE51FF008
0xE59FF018
0xE51FF008
0xE51FF008
0xE51FF008
0xE51FF008
0xE51FF008
0x40300050
0x00000000
0x40300049
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
0x4030004F
0xE7FE7FE
0xE7FE7FE
0xE7FE7FE
0xE59F002C
0xEE0C0F10
0xEE113F50
0xE383360F
0xEE013F50
0xE3A03000
0xE3A00101
0xEEE80A10
0xEE073F95
0xE59FA00C
0xE1A0E00F
0xE12FFF1A
0xE24FF008
等等      

将在地址0x40300000处的底部 L3 OCMC RAM 加载 SBL。  它不超过0x4030B800的可用限制、如 TRM 的初始化一章中所示。

TRM 还声称您可以使用0x402F0400和0x40300000之间的 SRAM 区域、但我无法在该区域成功链接和调试。  然而 ,这目前并不是一个主要问题。

有人能看到这里有什么问题吗?  我一定会做错事、但我根本看不到。  我曾尝试返回小端字节序以查看代码的正文、但这也不起作用!

我的设置如下:
定制 PCB
AM3352BZCZ30
CCS 版本:6.1.2.00015
BIOS_6_45_01_29
PDK_AM335x_1_0_3
GNU v4.0.3 (Linaro)
Win 7 64位

谢谢、
GerryL

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

    您是否在 SPI 闪存上运行任何诊断。 是一般的读写操作、按预期工作。 您如何刷写二进制文件、是 SPI 闪存基础的 MLO、以及偏移正确的应用(默认为0x20000)。 您能否确认创建_ti.bin 文件所使用的步骤。

    您是否在任何 TI 支持的评估平台上尝试过同样的方法。

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

    闪存读取/写入工作正常。 我有一个闪存和 SPI 代码库、多年来一直在可靠运行、这只是一个将 Starterware McSPI 函数插入我的代码的问题、一切都正常。 我通过串行端口手动测试、这就是我为原始帖子获取部分闪存转储的方式。

    我不熟悉术语 MLO、但图像标头-大小和地址-位于闪存位置0。 ROM 代码应从0x20000开始运行、但我正在尝试从地址0x40300000运行我的代码。

    该图像是通过几个步骤进行汇编和编程的。 。
    1.使用 SiZiOUS 中的 elf2bin 将.out 转换为二进制文件。 (我尚未检查输出的每个字节、但文件的早期部分看起来正确、总长度完全对应于 BSS 部分的开始。)
    2.使用可靠的 Bin2c 将二进制文件转换为.h。
    3.构建包含.h 的小型闪存编程应用程序,以便通过调试器在 Sitara 上运行。 大端字节序改编在此处完成。

    这不是从.out 到编程闪存的理想方式、但除了一些代码示例、我找不到任何 TI 工具来完成工作。

    我不使用评估板。 我们必须直接转到硬件。

    返回到原始帖子、
    闪存中的字节序列对您来说是否正常?
    - 0x40300000 bas 地址是否可以让 ROM 引导加载程序跳转到?

    (BTW,闪存是一个 Micron N25Q128A11ESE40 --忘记了。)

    谢谢、
    Gerry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人能就此提供任何建议吗?

    我在水中有些死了、很难弄清楚如何解决问题。 任何见解都是有价值的。

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

    很抱歉耽误您就此问题返回。 如果您有仿真器连接、您可以在 ARM 无法引导时提供程序计数器的值。 我可以将其与 ROM 符号表进行比较、并告诉您失败的位置。

    另一个选项是、您可以使用我们在此处介绍的 SPI 闪存实用程序、以确保闪存上的映像格式正确。
    processors.wiki.ti.com/.../AM437x

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

    您好、Rahul、

    我有一个 XDS100v2调试探针--我不确定如何使用它来拦截 ROM 操作。

    同时,我在 一段时间前尝试了 SPI_FLASH_writer_AM335X.OUT,它产生了以下输出。 。

    [CortxA8] AM335X 器件被检测到。
    SF:获取 idcode 20 bb 18
    检查是否可以使用 Winbond 闪存写入器..
    SF:不支持 Winbond ID bb18
    未找到已知的串行闪存

    我使用的是 Micron N25Q128A11ESE40、因此没有乐趣。

    返回前面的一些问题:
    闪存中的字节序列是否正常? (请参阅原始文章)
    - 0x40300000是否可以作为加载和执行代码的基址?

    谢谢、
    Gerry

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

    这个问题已经解决。

    基本上、对于 SBL 构建:
    -关闭链接器的标准系统启动文件(-nostartfiles)。
    -使用从 C:\ti\pdk_am335x_1_0_3\packages/ti\starterware\soc \armv7a\gcc\sbL_init.S 借用的一些代码修改了原始 startup_arMCA8.S  它执行一些额外的初始化,然后直接跳转到 main()而不是_start()。  (我在这个过程中失去了 malloc、所以必须做一个我自己的真正简单的。  如果有人知道标准启动是如何 初始化 malloc 的、那么我很想知道这一点。)

    您可以将 SBL 放置在0x402F0400 到0x4030B800范围内的任何位置(请参阅 TRM 初始化章节中的公共 RAM 存储器映射)。  使用0x40300000非常方便、因为调试器对此感到满意。  但是、如果您需要更大的空间、则下拉至0x402F0400、尽管调试器不会在该处运行(它尝试在0x402F0054附近加载数据、这超出范围)。

    BTW,针对硬件设计人员的*BIN*警告--要从 SPI 闪存引导,MOSI 和 MISO 的 McSPI 连接都不直观,与默认设置不同。 。

      信号  McSPI 引脚  闪存引脚
         ====       ===========       ===========
      MOSI    spi0_D1    DQ0
      MISO    spi0_d0    DQ1

    GerryL

    对于它的价值来说,这里是我最终得到的启动文件和.lds 文件(该帖子不接受.lds 文件,因此它被加载为.txt)。 。

    e2e.ti.com/.../7127.startup_5F00_SBL.S

    e2e.ti.com/.../SBL_5F005F00_lds.txt