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.

[参考译文] AM67A:实现 U-Boot multi-dtb-FIT–执行卡在 dm_uninit 上

Guru**** 2974170 points

Other Parts Discussed in Thread: AM67A, TMDS64EVM, SK-AM64B

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1657687/am67a-implementing-u-boot-multi-dtb-fit-execution-stuck-at-dm_uninit

器件型号: AM67A
Thread 中讨论的其他器件: TMDS64EVM、 SK-AM64B

您好:

我们正在努力根据 AM67A SoC 添加对多个定制电路板的 Linux 支持、每个电路板都有细微的硬件差异。 我注意到、几个用于不同 SoC(例如 AM64x)的 TI 评估板利用 U-Boot multi-DTB FIT 功能来处理电路板型号。

为避免为多个电路板构建和维护单独的二进制文件、我希望实现此方法。 我们的 I2C EEPROM 在所有电路板上都具有通用数据结构、因此电路板检测逻辑的实现非常简单。

对于实现的其余部分(特别是封装多个 DTB 并在电路板初始化代码内进行调整)、我一直使用 AM642 和 J721S2 等 SoC 作为参考。

虽然 I2C 读取和电路板检测功能运行良好、但在尝试替换 tiboot3.bin 时遇到阻碍。 引导过程始终会在 dm_uninit 期间或之后立即卡住。

在我花费过多时间进行调试之前、我想问一下、这种方法中是否有明显的错误、或者对于 AM67A、我需要考虑在初始启动阶段针对多 DTB 适配问题的特定平台问题。

所作的相关更改:

在 j722s_init.c 内:

#ifdef CONFIG_SPL_OF_LIST
void do_dt_magic(void)
{
    int ret, rescan, mmc_dev = -1;
    static struct mmc *mmc;

    /* Perform board detection */
    do_board_detect();

    /*
     * Board detection has been done.
     * Let us see if another dtb wouldn't be a better match
     * for our board
     */
    if (IS_ENABLED(CONFIG_CPU_V7R)) {
        ret = fdtdec_resetup(&rescan);
        printf("fdtdec_resetup returned %d, rescan = %d\n", ret, rescan);
        if (!ret && rescan) {
            printf("Rescanning devices after board detection...\n");
            dm_uninit(); // HERE IT GET STUCK
            dm_init_and_scan(true);
        }
    }
}
#endif


void board_init_f(ulong dummy)
{
    int ret;
    struct udevice *dev;

    k3_spl_init();

#ifdef CONFIG_SPL_OF_LIST
    do_dt_magic();
#endif

    k3_mem_init();
    setup_qos();
    //...
}


我在板级实现了 do_board_detect 和 board_fit_config_name_match 函数:

void do_board_detect(void)
{
    board_eeprom_detect();

    switch (EEPROM_DATA->board) {
    case BOARD_A:
        printf("Board: Board A (HW rev %u.%u)\n",
               EEPROM_DATA->hw_rev_major,
               EEPROM_DATA->hw_rev_minor);
        break;
    case BOARD_B:
        printf("Board: Board B (HW rev %u.%u)\n",
               EEPROM_DATA->hw_rev_major,
               EEPROM_DATA->hw_rev_minor);
        break;
    default:
        printf("do_board_detect: unknown board variant\n");
        break;
    }
}

#if defined(CONFIG_SPL_LOAD_FIT)
int board_fit_config_name_match(const char *name)
{
    printf("board_fit_config_name_match() called with name = %s\n", name);

    if (!eeprom_was_detected()) {
        printf("EEPROM not yet detected, deferring to FIT default config\n");
        return -1;
    }

    printf("EEPROM detected, board type = %u\n", EEPROM_DATA->board);

    switch (EEPROM_DATA->board) {
    case BOARD_A:
        if (!strcmp(name, "k3-am67a-r5-board-a") || !strcmp(name, "k3-am67a-board-a")) {
            return 0;
        }
        break;
    case BOARD_B:
        if (!strcmp(name, "k3-am67a-r5-board-b") || !strcmp(name, "k3-am67a-board-b")) {
            return 0;
        }
        break;
    default:
        printf("Unknown board variant, no matching DTB found\n");
        break;
    }
    return -1;
}
#endif


引导日志。

替换 tiboot3.bin 时:
U-Boot SPL 2026.01-00054-gd872d2b6be9b-dirty (Jun 23 2026 - 06:15:00 +0000)
SYSFW ABI: 4.0 (firmware rev 0x000b '11.2.8--v11.02.08 (Fancy Rat)')
Probing I2C bus 1 for EEPROM at address 0x53
Reading EEPROM from I2C bus 1 addr 0x53
EEPROM CRC: stored=0x44b9a992 computed=0x44b9a992
EEPROM manufacturerInfo: BOARD_B
Board: Board B (HW rev 0.2)
board_fit_config_name_match() called with name = k3-am67a-r5-board-a
EEPROM detected, board type = 2
board_fit_config_name_match() called with name = k3-am67a-r5-board-b
EEPROM detected, board type = 2
Selecting config 'k3-am67a-r5-board-b'
fdtdec_resetup returned 0, rescan = 1
Rescanning devices after board detection...
dm_uninit() called
// HERE IT GETS STUCK
当 fdtdec_resetup / dm_uninit…时 呼叫被注释掉:
U-Boot SPL 2026.01-00054-gd872d2b6be9b-dirty (Jun 23 2026 - 09:23:48 +0000)
SYSFW ABI: 4.0 (firmware rev 0x000b '11.2.8--v11.02.08 (Fancy Rat)')
Probing I2C bus 1 for EEPROM at address 0x53
Reading EEPROM from I2C bus 1 addr 0x53
EEPROM CRC: stored=0xf0fbb19f computed=0xf0fbb19f
EEPROM manufacturerInfo: BOARD_B
Board: Board B (HW rev 0.2)
SPL initial stack usage: 17176 bytes
Trying to boot from MMC1
board_fit_config_name_match() called with name = k3-am67a-r5-board-a
EEPROM detected, board type = 2
board_fit_config_name_match() called with name = k3-am67a-r5-board-b
EEPROM detected, board type = 2
Selecting config 'k3-am67a-r5-board-b'
Authentication passed
Authentication passed
Authentication passed
init_env from device 9 not supported!
Authentication passed
Authentication passed
Starting ATF on ARM64 core...

NOTICE:  BL31: v2.14.1(release):lts-v2.14.1
NOTICE:  BL31: Built : 14:00:55, Jun 16 2026
I/TC: 
I/TC: OP-TEE version: 4.9.0 (gcc version 14.2.0 (Debian 14.2.0-19)) #1 Tue Jun 16 13:59:35 UTC 2026 aarch64
I/TC: WARNING: This OP-TEE configuration might be insecure!
I/TC: WARNING: Please check optee.readthedocs.io/.../porting_guidelines.html
I/TC: Primary CPU initializing
I/TC: GIC redistributor base address not provided
I/TC: Assuming default GIC group status and modifier
I/TC: SYSFW ABI: 4.0 (firmware rev 0x000b '11.2.8--v11.02.08 (Fancy Rat)')
I/TC: Activated SA2UL device
I/TC: Enabled firewalls for SA2UL TRNG device
I/TC: EIP76D TRNG initialized
I/TC: SA2UL Drivers initialized
I/TC: HUK Initialized
I/TC: Disabling output console

U-Boot SPL 2026.01-00054-gd872d2b6be9b-dirty (Jun 23 2026 - 06:01:11 +0000)
SYSFW ABI: 4.0 (firmware rev 0x000b '11.2.8--v11.02.08 (Fancy Rat)')
DM ABI: 3.0 (firmware ver 0x000b 'MSDK.11.01.00.05--v11.01.09' patch_ver: 9)
Probing I2C bus 1 for EEPROM at address 0x53
Reading EEPROM from I2C bus 1 addr 0x53
EEPROM CRC: stored=0x44b9a992 computed=0x44b9a992
EEPROM manufacturerInfo: BOARD_B
Board: Board B (HW rev 0.2)
Trying to boot from MMC1
board_fit_config_name_match() called with name = k3-am67a-r5-board-a
EEPROM detected, board type = 2
board_fit_config_name_match() called with name = k3-am67a-r5-board-b
EEPROM detected, board type = 2
Selecting config 'k3-am67a-r5-board-b'
Authentication passed
Authentication passed


U-Boot 2026.01-00054-gd872d2b6be9b-dirty (Jun 23 2026 - 06:01:11 +0000)

SoC:   J722S SR1.0 HS-FS
Model: Board B
DRAM:  2 GiB (total 4 GiB)
Core:  80 devices, 28 uclasses, devicetree: separate
MMC:   mmc@fa10000: 0, mmc@fa00000: 1
Loading Environment from MMC... Reading from MMC(0)... OK
In:    serial@2800000
Out:   serial@2800000
Err:   serial@2800000
Probing I2C bus 1 for EEPROM at address 0x53
Reading EEPROM from I2C bus 1 addr 0x53
EEPROM CRC: stored=0x44b9a992 computed=0x44b9a992
EEPROM manufacturerInfo: BOARD_B
Board: Board B (HW rev 0.2)
Net:   No ethernet found.
Press SPACE to abort autoboot in 2 seconds

谢谢!
Martin

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

    尊敬的 Martin:

    很抱歉、我今天没有机会了解这个问题。 如果不是更早、我会通过此星期五回复您。

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

    尊敬的 Bin:

    你有没有机会去看它?

    对我来说、最重要的问题是、在这个平台上是否可能做到这一点。

    如果是这种情况,那将是 值得投入更多的时间在它。

    当然,我会感谢任何关于我犯了错误的提示。

    谢谢!

    Martin

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

    尊敬的 Martin:

    根据您的描述、我的理解是、使用电路板检测实现时、dm_uninit () 挂起、但如果 dm_uninit () 被移除、定制电路板会正确引导至 U-Boot。 对吧?

    也许您可以调试 drivers/core/device-remove.c 以查看哪个器件移除导致了问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对我来说最重要的问题是它是否应该在该平台上实现。

    为 AM64x 平台实现的电路板检测逻辑也可用于任何其他平台。 唯一需要注意的是、确保包含多器件 DTB 的 tiboot3.bin 二进制文件不超过 SRAM 大小。

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

    是的

    我花了一些时间调试相关部分、尝试删除 MAIN_uart0 时执行似乎挂起。 具体而言、会针对串行@2800000 调用 device_remove、我能够跟踪它到对 device_free 的调用。

    我怀疑删除实际上是成功的,但因为这会使我的串行控制台崩溃,我从那一点前失去所有的输出。 可能是它在后续 dm_init_and_san 期间实际上失败了、但我对它视而不见、因为 dm_uninit。 您是否熟悉这种行为?

    遗憾的是、目前我的调试功能受限于电路板设计和可用硬件、因此设置适当的 JTAG/硬件调试环境需要一些时间。

    关于您关于 SRAM 大小的第二点:我假设 CONFIG_SPL_SIZE_LIMIT 和 CONFIG_SPL_MAX_SIZE 可防止其溢出。 这不正确吗?

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

    尊敬的 Martin:

    您是否熟悉此行为?

    实际上、我们的开发团队为 AM64x U-Boot 实现了此逻辑、并且这个逻辑一直都能正常工作、因此我从来没有机会调试这部分代码。

    可能是它在后续 dm_init_and_scan 期间实际上失败、但我对它视而不见、因为 dm_uninit。

    好的、这听起来很合理。 在 u-boot 器件树上、您能否尝试禁用除 MAIN_uart0 之外的所有其他模块以查看 dm_init_and_scan () 是否可以恢复控制台输出?

    关于您关于 SRAM 大小的第二点:我的假设是 CONFIG_SPL_SIZE_LIMIT 和 CONFIG_SPL_MAX_SIZE 可防止其溢出。 不正确吗?

    我相信这是正确的。 我的评论是为了确保一旦多个电路板 dtb 包含在二进制文件中、tiboot3.bin 的总大小不会超过限制。 否则、无法加载和运行二进制文件。

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

    嗨 Bin、遗憾的是、通过 DT 禁用设备无法提供任何见解。 取消初始化后、UART 仍然静默。

    我还尝试通过 OpenOCD 和 Tumpa 设置正确的 JTAG 调试、但我还没有让它能够与我的定制电路板一起使用。
    这可能是由于 OpenOCD 配置不正确造成的、因此我仍在努力。

    您是否知道是否计划在任何时候为 J722S/AM67A 提供多板时基故障特性?

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

    你好,我是不在办公室的假期,并将在下周中期回来.  

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

    尊敬的 Martin:

    U-Boot 为 AM64x 实现了多种板适配、因为它同时支持 SK-AM64B 和 TMDS64EVM。 但据我所知、J722S/AM67A 只有一个 EVM、因此为 J722S/AM67A 实现相同的多板适配支持没有意义。