本文主要参考彭东林大神的博客:https://www.cnblogs.com/pengdonglin137/p/5080309.html
最近打算将最新的u-boot-2019.01移植到tiny4412开发板上。
要移植u-boot到tiny4412上,首先就要对着块板子的启动方式、地址空间分配有清楚的认识。看芯片手册Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf可以了解到。Exynos4412的地址空间分布如下:
上面主要需要关注三个:
iROM:这段地址空间对应exynos4412内部固化的一段程序,exynos启动的第一条指令就存放在这里。
iRAM:这段地址空间对应的是exynos4412内部的一个存储器,这段存储器特点是一上电就可以使用,不用初始化。
DMC0:这段地址空间就是核心板上的DDR3对应的存储空间(tiny4412上有1GB的DDR3,因此地址空间为0x40000000-0x80000000),上电后需要初始化DRAM控制器才能使用。
exynos4412的启动:
上面意思就是:iROM首先运行,然后根据OM的值判断从哪个存储设备加载BL1到iRAM,然后BL1再根据OM的值判断从哪个存储设备加载OS到DRAM中。
OM pin Setting 如下:
以tiny4412从sdcard启动为例,iROM固化在SOC内部,BL1是Samsung提供的镜像文件E4412_N.bl1.bin,os这里可以认为是BL2,这部分是u-boot中编译生成的SPL,BL2是BL1加载到iRAM中运行的。最后一,BL2再根据OM值,从SDCARD中将u-boot代码拷贝到DRAM中。
上图显示了,iROM、BL1和BL2的运行地址空间,iRAM的地址空间是0x02020000-0x02060000。由于iROM是只读存储器,所以把iRAM的0x0202000-0x02021400的5kB地址空间分配给iROM用,用于存放iROM的全局变量(ZI/RW,分别存放全局未初始化变量、全局已初始化变量)、局部变量等等。从0x02021400-0x02023400的8KB地址空间属于BL1,可以认为BL1的第一条指令就存放在0x02021400地址单元,紧接着的0x02023400-0x02027400的16KB地址空间属于BL2,即:BL2的第一条指令存放的地址就是0x02023400,这个值很重要,如果我们的SPL中有“非位置无关码”,那么就必须将SPL加载到其运行地址处,否则在执行那些非位置无关码的时候会出错,我们知道,SPL这段程序是由BL1负责加载到iRAM0x02023400地址处运行的,但是BL1是samsung提供的并没有源码,只有二进制镜像,所以在SPL有“非位置无关码 的时候”必须将SPL的链接地址设置为0x02023400.
上图是从sdcard启动时,程序在sdcard中的布局,其中sdcard的扇区大小是512B,第0个扇区是保留扇区,从第1到16扇区是共8kB空间存放BL1(也就是E4412_N.bl1.bin),从第17到48扇区的16KB空间用于存放BL2(也就是u-boot-spl.bin)之后的扇区可以根据实际需求自己安排。