Other Parts Discussed in Thread: AM67A, TMDS64EVM, SK-AM64B
器件型号: 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
引导日志。
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