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.

[参考译文] Linux/AM5728:调试 AM5728上的 SPL/MLO

Guru**** 2569255 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/570252/linux-am5728-debugging-spl-mlo-on-am5728

器件型号:AM5728

工具/软件:Linux

我们正在开发基于 AM5728 EVM 的产品。  我们正在尝试使原型板上的引导加载正常工作。  使用 JTAG 进行的步进调试显示处理器遇到硬异常错误。

错误发生在对芯片 PROM 中的引导代码进行调用时(步越 SMC 0步骤最终会产生一个硬异常):

在 u-boot/arch/arm/mach-omap2/lowlevel_init.S 中:

条目(omap_smc1)
按{R4-R12、LR}@保存寄存器- ROM 代码可能会污染
@我们的寄存器
MOV R12、r0 @服务
MOV r0、R1 @参数

DSB
DMB
SMC 0 @ SMC #0进入监控模式
@调用 ROM 代码 API 以获得所请求的服务
弹出{R4-R12、PC}
ENDPROC (OMAP_smc1)

代码表示对 ROM 中服务的调用、这看起来像是一个 API。  是否有任何有关 ROM API 提供的服务的文档、如果有、我可以在哪里找到它?

谢谢!

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

    [引用]代码意味着调用 ROM 中的服务、这看起来像是 API。 是否有任何有关 ROM API 提供的服务的文档、如果有、我可以在哪里找到它? [/报价]

    AM5728 TRM 的第33章初始化介绍了有关 ROM 代码的公开信息。

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

    这里的材料水平很高。  例如、未提及 ROM 期望数据结构、ROM 在 SPL 代码中回叫板函数 board_init_r (忽略了甚至无需提及或讨论 board_init_r 代码的事实、 地址、或者 ROM 是如何知道的)。

    因此、对 SPL 代码进行反向工程是唯一解决此问题的方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、仅介绍了 API 表、似乎没有相关文档。

    API 表将获得两个命中点、一个在图33-5中、另一个在33.3.2.1末尾处的描述性段落:

    API 表
    此表的目的是允许外部代码访问系统维护、实用程序和器件
    用于确保 ROM 代码引导功能的驱动程序函数。 可以是这些功能
    通过调用此表中硬编码的固定地址在运行时重复使用。

    那么什么也没有。 由于这是一个8000页的文档、搜索是查找内容的唯一现实方法。 对于 API 表、没有其他命中。

    我唯一可以看到的是第33.4节、但它们看起来只是监控和监控功能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 board_init_r 上找到信息,但仍然无法找到有关 API 表的任何信息。 文档中 API 表的详细信息在哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris、Yordan、

    我们还在开发基于 AM578的产品、并在从 OMAP-SMc1执行"SMC 0"时看到同样的问题。

    是否有任何表扬?

    谢谢。

    Wilson
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在本例中、我们的试验电路板使用的是芯片修订版本1.1、而最终的外形尺寸电路板将使用芯片修订版本2.0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们的问题是 EMIF 端口配置错误。

    我能够通过将开关注释到 SPL 中的外部存储器来将其与存储器问题隔离、并且它工作正常、表明外部存储器存在问题。

    我从头开始使用 EMIF 配置展板、并获得了工作值。

    祝您一切顺利。

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

    谢谢、Chris!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用 JTAG 器件和 Code Composer Studio 进行了初始调试。

    只需浏览我的注释、您就可以在 SPL 中的 board_init_f 处获得成功的断点。 这是我在激活主管(SMC 0)后发现的第一件事。

    这在 SPL 中非常早、此时全部在片上、因此您应该能够从那里继续并解决后续问题。

    遗憾的是、您必须对正在发生的情况进行逆向工程、因为它的文档很少。 我的日志中的调用树如下所示:

    Board_init_f (hwinIT-common.c)*
    EARLY_SYSTEM_INIT (hwinIT-common.c)*
    init_omap_revision *
    HW_DATA_INIT *
    Watchdog_init (不调用 warm 复位)
    Set_mux_conf_regs *
    src_enable *
    DIO_SETTINGS *
    Setup_EARLY_Clocks *
    DO _ board _检测*
    vcores_init *
    prcm_init *

    SDRAM_init (arch\arm\cpu\armv7\omap-common\emif-common.c)紧随其后、是我发现问题的点。

    我发现另一个有用的东西是在"发出呼叫"中放置一个断点。 使用调试在(include/common.h #define debug)上构建 uboot 不幸的是、串行端口直到游戏后期才会初始化、但在此之前有大量的调试信息。 PUT 调用将进入一个空过程、您可以在其中保留最终断点、并且每次调用调试字符串时都可以看到该断点。

    此外、我能够在 board_init_f 的开头发出初始化串行端口的调用、并从串行链路获得调试。 调用为 preloader_console_init。 我目前没有具体的细节、但我的注释表明我已将其添加到 arch/arm/mach-omap2/hwinit common.c 中、以便在启动之前激活串行调试输出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如我所讨论的、当事情不起作用时、您必须有效地对 uboot 代码进行反向工程。

    出现问题时、PROM API 文档不有用。 您最终只会得到一个无限循环、而 PROM 文档提供的唯一内容是您最终得到的无限循环类型。

    您必须仔细查看堆栈跟踪、以尝试查找问题发生的位置、因为堆栈损坏导致跟踪无效。

    在我们的案例中、划分并克服 u-boot 代码以隔离问题。