上一篇我们已经弄明白了整个MiniPC的软件组成,但是并不是很清楚系统启动的细节,所以这一篇就仔细说明一下rk3188 从上电开始到启动内核为止的过程。
再说明一点,这篇有一部分是翻译的内容,但针对翻译的内容,我亲自做了一些实际的实验,所以我还是自己坦白,这篇算是“伪原创”吧。
先给大家发原创的链接:https://gist.github.com/sarg/5028505
这个是国外的一个大神做的工作,真是很佩服啊。
那么,有人会问,我们为什么这么费劲的去解析启动部分的内容,第一,我们没有RK3188的datasheet,第二,没有bootloader的源码。而我们的目的是能够自由的开发或移植bootloader到rk3188上,能够启动我们定制的操作系统。如果谁有RK3188的详细datasheet或者bootloader的源码,一定要给我一份啊!
首先,先翻译一下原创的内容吧。绿色的部分是原文没有提及,我自己根据自己的实验猜测的。其中的代码就不拷贝过来了。
如何获取RK3066的BootRom
以下是我的步骤。
首先,我在我的设备的升级包(update.img)中发现了一个RK30xxLoader(L)_V1.18.bin的文件。我用rk29Kitchen把它解包出来。
使用strings 命令(linux下)去查看其中的参考字符串,并没有发现有用的地方,所以我觉得这个文件是经过加密混淆过的。
下一个步骤是使用IDA pro来反汇编RKAndroidTool.exe ---rockchip公司提供的用于烧写升级包的工具。在分解过程中,我发现了loader文件使用了RC4的加密方法。这个文件被分隔成512字节的多个块,每个块都被加密。
所以,我用perl写了unpack_loader.pl 脚本,这样我得到了4个输出文件。
1 14a 321c 30_LPDDR2_300MHz_DD
2 3366 c914 rk30usbplug
4 fc7a 3400 FlashData
4 1307a 1ac00 FlashBoot
幸运的是,这些文件名都是有意义的名字。
30_LPDDR2_300MHz_DD 是一个dram 初始化处理过程。FlashData 是只是30_LPDDR2_300MHz_DD的拷贝,只不过是512字节对齐(flash的块大小)。
rk30usbplug 是负责MaskRom模式下的处理。FlashBoot是从NAND flash启动的第二阶段,里面也包含了DF