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