作者:彭东林
邮箱: pengdonglin137@163.com
QQ: 405728433
开发环境:win7 64位 + VM ware11 + Ubuntu14.04 64位
开发板:tiny4412ADK + S700 + 4GB eMMC + 1G DDR3
工具链:友善之臂提供的 arm-linux- (gcc version 4.5.1)
要移植的u-boot版本:u-boot-2015-10
参考u-boot版本:友善之臂提供的 u-boot-2010-12
本博文简要分析了移植u-boot-2015-12到tiny4412,采用的是spl的启动方式,目前可以做到的是进入u-boot的命令终端,如下图:
而且仅仅支持从SD卡启动,以后会慢慢完善。
要移植u-boot到tiny4412,首先我们需要对这块板子的 启动方式 、 地址空间 分配有清楚的认识。此外,由于刚开始只需要做到进入u-boot的命令行(如上图),其中至少涉及到了 系统时钟初始化 、 内存初始化 以及 串口初始化 ,做到这三点,就为以后的各种工作铺平了道路。
下面是一些参考资料:
下面我简要说明。
我们需要关注的主要是上面三个。
iROM:这段地址空间对应exynos4412内部固化的一段程序,exynos4412启动的第一条指令就存放在这里。
iRAM:这段地址空间对应的是exynos4412内部的一个存储器,这段存储器的特点是上电就可以用,不用初始化。
DMC0:这段地址空间就是核心板上的DDR3对应的存储空间(我的tiny4412有1GB的DDR3,所以地址空间是0x40000000-0x80000000),上电后需要初始化DRAM控制器才能使用。
可以有几张图:
图一
图一中,iROM首先运行,然后根据OM的值判断从哪个存储设备加载BL1到iRAM,然后BL1再根据OM的值判断从哪个存储设备加载OS到DRAM中。注意:以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的0x02020000-0x02021400的5KB地址空间分配给iROM用,用于存放iROM的全局变量(ZI/RW,分别存放全局未初始化变量、全局已初始化变量)、局部变量(stack)等等。从0x02021400-0x02023400的8KB地址空间属于BL1,可以认为BL1的第一条指令就存放在0x02021400地址单元。紧接着的0x02023400-0x02027400的16KB地址空间属于BL2,即:BL2的第一条指令存放的地址就是0x02023400,这个值很重要,如果我们的SPL中有“非位置无关码”,那么就必须将SPL加载到其运行地址处,否则在执行那些非位置无关码的时候会出错,我们知道,SPL这段程序是由BL1负责加载到iRAM的0x02023400地址处运行的,但是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-dtb.bin),之后的扇区可以根据实际需求自己安排。
关于时钟、DRAM、串口的初始化请参考上面列出的参考资料。
有了上面的基础知识,下面开始移植。