花屏情况
起因
修改了uboot 的bootargs里的rmem导致花屏,
mem=254M@0x0 rmem=258M@0xFE00000就会绿屏ddr大小不匹配,512MB与256MB芯片的编译选项选择错误。remap_array的值不对
uboot的时候,开机画面是正常的,跑完内核后出现花屏现象
解决
改为
mem=254M@0x0 rmem=258M@0x2FE00000make isvp_a1_x_sfc0nor ,确保生成的ddr_reg_values.h一样
原因
地址映射的问题: console=ttyS1,115200n8 mem=254M@0x0 rmem=258M@0x2FE00000 A1 mips上物理地址的0x10000000~0x20000000(256M)通常给I/O控制器使用 A1 mips架构上地址空间前256M是DDR,0x10000000-0x20000000是寄存器地址空间,需要跳过。0x20000000之后相当于跟0x10000000接上了。
0x0-0x10000000第一段mem,0x10000000-0x20000000 io空间,0x20000000-0x30000000也是映射的第一段mem,0x30000000-0x40000000第二段mem
MIPS 地址空间布局

MIPS 的硬件设计
在芯片出厂时就硬性规定了地址空间的用途。正如图所示:
- 用户空间 (kuseg): 只有 2GB (
0x00000000到0x7FFFFFFF)。- 硬件强制要求最高位(Bit 31)为
0时才是用户模式,导致用户空间被物理地限制在了低 2GB 空间内。
- 硬件强制要求最高位(Bit 31)为
- 内核空间: 占据了剩下的 2GB (
0x80000000到0xFFFFFFFF)。
kseg0/kseg1 的物理地址换算:
物理地址 = 虚拟地址 & 0x1FFFFFFF(去掉最高 3 位)
例:
U-Boot 地址 0x80600000(kseg0)→ 物理 0x00600000 ✅ Flash logo 地址
U-Boot 地址 0xBFC00000(kseg1)→ 物理 0x1FC00000 ✅ vobuf 落在物理 RAM 内
0x00000000 ~ 0x10000000 第一段 mem(256M DDR)
0x10000000 ~ 0x20000000 IO空间(寄存器地址,需跳过)-> 0x90000000 0xF0000000
0x20000000 ~ 0x30000000 映射回第一段 mem
0x30000000 ~ 0x40000000 第二段 mem
vobuf 必须同时满足:
- 物理地址落在真实 DDR(非 IO 空间)
- 落在 rmem 区(Linux 不会动这块内存)
- 距离 rmem 末尾有足够空间存放 NV12 数据
vobuf = 0x80000000 + rmem起始物理地址 + rmem内的偏移
rmem 起始 = 0x2FE00000
rmem 大小 = 258MB = 0x10200000
rmem 末尾 = 0x2FE00000 + 0x10200000 = 0x40000000
vobuf = 0x80000000 + rmem起始 + (rmem大小 - 预留空间)
= 0x80000000 + 0x2FE00000 + (0x10200000 - 0x400000)
= 0x80000000 + 0x2FE00000 + 0xFE00000
= 0x80000000 + 0x3FE00000
= 0xBFC00000