diff options
| author | Guodong Xu <[email protected]> | 2026-05-20 06:45:50 -0400 |
|---|---|---|
| committer | Tim Ouyang <[email protected]> | 2026-07-21 17:16:02 +0800 |
| commit | a823fbf0cfbda7787355e95986122737c3df2d6a (patch) | |
| tree | 30d86f29c2098291f32791ec0dd815dd262a73da | |
| parent | eb7de3ccf1a12467b701b65f8e46af74744ec935 (diff) | |
spacemit: k1: Add multiple device tree support
Enable multiple DTB support in the FIT image for the Spacemit K1 SoC,
allowing a single U-Boot binary to support different board variants.
The SPL reads the board type from EEPROM and selects the corresponding
device tree at runtime via board_fit_config_name_match(), ensuring the
correct hardware description is passed to U-Boot proper.
Signed-off-by: Guodong Xu <[email protected]>
| -rw-r--r-- | board/spacemit/k1/spl.c | 42 | ||||
| -rw-r--r-- | configs/spacemit_k1_defconfig | 2 |
2 files changed, 36 insertions, 8 deletions
diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c index da4169fbc8c..d749e21a2d5 100644 --- a/board/spacemit/k1/spl.c +++ b/board/spacemit/k1/spl.c @@ -13,6 +13,7 @@ #include <dm/device.h> #include <dm/uclass.h> #include <i2c.h> +#include <linux/ctype.h> #include <linux/delay.h> #include <log.h> #include <power/regulator.h> @@ -55,6 +56,8 @@ struct ddr_cfg { binman_sym_declare(ulong, ddr_fw, image_pos); binman_sym_declare(ulong, ddr_fw, size); +char product_name[I2C_BUF_SIZE] = "k1"; + static void i2c_early_init(void) { struct udevice *bus; @@ -322,14 +325,8 @@ void nor_early_init(void) udelay(10); } -void *board_spl_fit_buffer_addr(ulong fit_size, int sectors, int bl_len) -{ - return (void *)CONFIG_SPL_LOAD_FIT_ADDRESS; -} - void board_init_f(ulong dummy) { - u8 i2c_buf[I2C_BUF_SIZE] = { 0 }; int ret; ret = spl_early_init(); @@ -344,11 +341,11 @@ void board_init_f(ulong dummy) preloader_console_init(); i2c_early_init(); - ret = read_product_name(i2c_buf, I2C_BUF_SIZE); + ret = read_product_name(product_name, I2C_BUF_SIZE); if (ret) log_info("Fail to detect board:%d\n", ret); else - log_info("Get board name:%s\n", (char *)i2c_buf); + log_info("Get board name:%s\n", product_name); pmic_init(); ddr_early_init(); @@ -363,3 +360,32 @@ u32 spl_boot_device(void) void spl_board_init(void) { } + +int board_fit_config_name_match(const char *name) +{ + char fdt_name[I2C_BUF_SIZE]; + int i; + + memset(fdt_name, 0, I2C_BUF_SIZE); + if (!strncmp(product_name, "k1-x_", 5)) { + snprintf(fdt_name, I2C_BUF_SIZE, "%s-%s", "k1", + &product_name[5]); + } + if (fdt_name[0] == '\0') { + /* set default board name */ + sprintf(fdt_name, "k1-musepi-pro"); + } + for (i = 0; i < I2C_BUF_SIZE; i++) { + if (fdt_name[i] == '\0') + break; + fdt_name[i] = tolower(fdt_name[i]); + } + if (!strcmp(name, fdt_name)) + return 0; + return -ENOENT; +} + +void *board_spl_fit_buffer_addr(ulong fit_size, int sectors, int bl_len) +{ + return (void *)CONFIG_SPL_LOAD_FIT_ADDRESS; +} diff --git a/configs/spacemit_k1_defconfig b/configs/spacemit_k1_defconfig index 64c724c62a5..465788cc2e5 100644 --- a/configs/spacemit_k1_defconfig +++ b/configs/spacemit_k1_defconfig @@ -5,6 +5,7 @@ CONFIG_NR_DRAM_BANKS=2 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x1000000 CONFIG_DEFAULT_DEVICE_TREE="spacemit/k1-musepi-pro" +CONFIG_OF_LIST="spacemit/k1-bananapi-f3 spacemit/k1-musepi-pro" CONFIG_SPL_SYS_MALLOC_F_LEN=0x4000 CONFIG_SPL_STACK=0xc083fb00 CONFIG_SPL_TEXT_BASE=0xc0801000 @@ -27,6 +28,7 @@ CONFIG_SPL_RISCV_MMODE=y # CONFIG_SPL_SMP is not set CONFIG_STACK_SIZE=0x100000 CONFIG_FIT=y +CONFIG_MULTI_DTB_FIT=y CONFIG_SPL_HAS_LOAD_FIT_ADDRESS=y CONFIG_SPL_LOAD_FIT_ADDRESS=0x08000000 CONFIG_SUPPORT_RAW_INITRD=y |
