K1 SPL 启动流程 — 四个实体与关系 ① 构建产物 (Host) u-boot-spl-ddr.bin SPL 代码 + ddr_fw.bin (binman 打包) FSBL.bin 签名后的启动镜像 build_binary_file.py ② K1 SoC (片上) BootROM 128KB ③ SRAM (片上, 256KB, 上电即可用) SPL 代码 (.text) 0xC080,1000 ~ 最大 204KB ddr_fw (镜像内嵌位置) binman_sym 定位偏移 DDR FW 执行区 0xC082,D000 memcpy BSS / Stack gd / heap → 0xC084,0000 DDR Controller 4 AXI ports · LPDDR3/4 · DFC ddr_init(0xC000,0000, cs, rate, puts) 加载 FSBL 函数指针调用 ddr_init() USB fastboot / SPI NOR 等 ④ DDR 存储芯片 (SoC 外部) LPDDR4X · 最大 16GB · CPU 视角: 低 2GB @ 0x0, 高段 @ 0x1,0000,0000 BPI-F3: 2GB (memory@0, reg = <0 0 0 0x8000,0000>) DDR training 读/写训练 + 2400MT/s 验证: write 0xAA55,AA55 → read back 图例 ① 构建产物 (Host PC) ② K1 SoC (片上逻辑) ③ SRAM (片上存储) ④ DDR 芯片 (板上外部) 跨实体传输 SRAM 内部搬移 K1 CPU 视角 — 物理地址空间布局 0x0000,0000 DRAM 低段 (0 ~ 2GB) 0x0000,0000 SDRAM_BASE 0x0020,0000 SYS_LOAD_ADDR — U-Boot proper 加载地址 0x0100,0000 INIT_SP — U-Boot proper 初始栈 (16MB) DDR 验证地址 (write 0xAA55,AA55) BPI-F3: 全部 2GB DDR 落在此段 0x8000,0000 Device IO 空间 (2 ~ 4GB) 0xC000,0000 ddrc 寄存器区域 (0x4280) ddr_init() 第一参数 · 具体用途由 blob 决定 0xC080,0000 SRAM (256KB, Main CPU + Real CPU 共享) 0xC080,1000 SPL 代码 (.text, 204KB max) 0xC082,D000 DDR FW 执行区 0xC083,7000 BSS (8KB) 0xC083,9000 Stack / gd 0xC083,B000 heap (20KB) 0xC084,0000 SPL_STACK (初始 SP) ↑ 分配方向: heap → gd → stack ↑ DDR FW 在代码区尾部, memcpy 到此执行 0xD400,0000+ 外设寄存器 UART, I2C, Clock, GPIO, PMIC... ... 0x1,0000,0000 DRAM 高段 (4 ~ 18GB) 对应 DRAM 物理的 2 ~ 16GB BPI-F3 仅 2GB DDR,此段未使用 K1 最大支持 16GB DDR 0x4,8000,0000 DRAM 被 Device IO 劈成两段: 低 2GB (0x0) + 高 14GB (0x1,0000,0000) 不同总线 master 寻址能力不同 (USB 2GB / GPU 16GB / PCIe 16GB / DMA 16GB) 数据来源: K1x DDR 内存空间映射文档 (SpacemiT) + defconfig + DTS