瑞芯微RK33XX平台的启动流程探究

如果有问题,请加QQ群 891339868 进行交流

    刚开始学习瑞芯微平台时,搞得我一脸懵逼,以前玩过儿imx283,也玩儿过nuc972,觉得应该都差不多,但是发现瑞芯微的底层和前面的两种还是有些不同,现在在这里记录一下。

    我现在使用的是RK3308,64位A35内核,主要应用场景是智能音频处理,比如智能音响,百度最初的黑金刚智能音响用的就是RK3308的方案,不过这是应用层的东西,今天主要分析RK3308的启动流程。说起系统引导,uboot肯定会马上浮现在脑子中,确实,我的第一感觉就是下面这张图:

1、CPU上电,启动片内bootrom里面的引导程序,根据硬件外设的设置模式,跳转到不同的介质;

2、读取引导程序,首先是读取spl到内存,对cpu、ddr等基础设备进行初始化,其实这个spl是从uboot里面挑出来了一点儿;

3、读取uboot到内存,进行详细的初始化,并且读取环境变量,根据环境变量里面的分区地址,寻找内核,和设备树文件(如果使用设备树的话),找到后将内核载入到内存,并将设备树文件传递给内核;

4、内核启动,并根据内核配置对设备进行初始化,并挂在根文件系统。

在这里只是对系统启动过程大致描述一下,详细的启动流程网上的高手总结了很详细,也很多。

可是打开RK3308的sdk,和默认的分区描述,纠结了,感觉好不一样啊,开始怀疑自己到底学没学过启动引导?首先来看一下默认的系统固件,如下图所示:

分别是:MiniLoaderAll.bin、boot.img、misc.img、oem.img、parameter.txt、recovery.img、rootfs.img、trust.img、uboot.img、userdata.img。这里面的大部分看上去都还挺面熟,只有两个比较扎眼:MiniLoaderAll.bin和trust.img,我和这两个东西(暂且就先叫“东西”吧)素昧平生啊,不过从字面的意思来猜,第一个应该是和启动有关,而且还是最小启动和最全启动;第二个呢,貌似和信任有关。可是这玩意儿靠猜不行啊,得有理论依据啊,只能是遍寻网络(没办法,有事儿没事儿问度娘早已经成为习惯),可是很不幸,度娘也是一脸懵逼,告诉我,不知道,只能用最笨的方法去研究----一部分一部分烧写固件,对控制台输出信息进行分析和提炼,具体的流程如下:

第一:清空flash,烧写MiniLoaderAll.bin。

我使用的ubuntu系统,使用RK提供的命令行烧写工具upgreade_tool,在这里给瑞芯微点个赞,还提供命令行的烧写工具,很不错,但是同时也要吐槽一下,太他么难用了!

首先使用EF命令擦除flash,重新启动板卡,控制台已经什么东西都不打印了,自动进入Maskrom模式,使用UL命令,烧写MiniLoaderAll.bin,烧写完成后,板卡自动重启,控制台打印了一些这么个玩意儿:

这样看上去是不是就有点儿熟悉的感觉了?其实看到DDR这三个字母就应该基本上了解了,这个东西就是类似于spl.bin的作用,但是RK不用spl,非得用这个东西呢?下面再说。

但是从上面的信息里面发现了两个问题:首先是“GPT 0x330c1f0 signature is wrong”;其次是“Addr:0x4000 No find trust.img!”;

先看第一个问题,其实看到GPT这三个字母,就应该想到和分区有关,而分区信息一般保存在什么地方呢?在parameter.txt文件里,找到这个文件,打开看一下:

前面几行看的不知所以然,只有CMDLINE看上去还挺熟悉,这里面分区写的很清楚,先不管那么多了,先烧进去再说,使用DI命令,烧写parameter.txt文件,板卡自动重启,控制台重新打印:

很明显,控制台输出多了分区信息的打印,接着烧写trust.img镜像,依然使用DI命令,板卡重启,控制台重新打印信息:

从打印信息可以很明显的看出来,trust.img已经找到了,已经开始加载uboot了。

看到这里,其实RK3308的启动流程的第一部分已经比较清楚了,这里总结一下:
1、板卡上电,片内bootrom启动,将flash里面(具体的存放位置没有深究,应该是RK规定的固定的位置)的MiniLoaderAll.bin复制到内存里面,对关键部分进行初始化;

2、MiniLoaderAll从flash里面(具体的存放位置没有深究,应该是RK规定的固定的位置)读取parameter.txt,并进行解析,解析出来分区信息;

3、根据分区信息在flash的制定位置寻找trust.img镜像,如果该镜像文件匹配(怎么匹配下面在详细说),就开始第二部分的启动。

可是到目前为止,所有的这些都是根据实际的启动流程的推测,有理论依据吗?在我没有对这些东西进行深入研究之前,我没有发现有相关的文档来介绍这些东西,对这些东西折腾了好多天以后,突然发现RK提供的SDK 里面其实提供了相关的技术文档,只是没有仔细去研究而已(唉,也是欲哭无泪,就像拿一大串钥匙开门儿一样,试来试去,最后一把能把门儿打开)。首先看一下这个图:

看到这一段文字,一切都通了,MiniLoaderAll.bin就是RK自己开发的spl,而且还是不开源,搞不懂为什么不开源,这个足以证明上面关于MiniLoaderAll.bin这个文件的分析和假设是正确的。再来看一下parameter.txt文件的内容和格式:

FIRMWARE_VER:8.1
MACHINE_MODEL:RK3308
MACHINE_ID:007
MANUFACTURER: RK3308
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3308
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE:mtdparts=rk29xxnand:0x00001000@0x00002000(uboot),0x00001000@0x00003000(trust),0x00000800@0x00004000(misc),0x00006000@0x00004800(recovery),0x00004800@0x0000A800(boot),0x00080000@0x0000F000(rootfs),0x00020000@0x0008F000(oem),-@0x00AF000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

这里详细分析一下每一行内容的意思:

1、FIRMWARE_VER:8.1

固件版本,打包updata.img时会使用,升级工具会根据这个识别固件版本

2、MACHINE_MODEL:RK3308

机器型号,打包updata.img使用,不同的项目,可以自己修改,用于升级工具显示。在recovery里面升级固件时可以用于判断固件是否匹配

3、MACHINE_ID:007

产品开发ID,可以位字符和数字组合,打包updata.img使用,不同的项目使用不同的ID,可以用于识别机器机型。在recovery里面升级固件时可以用于判断固件是否匹配

4、MANUFACTURER: rk3308

厂商信息,打包updata.img使用,可以自己修改,用于升级工具显示

5、MAGIC: 0x5041524B

魔数MAGIC,不能修改,一些新的AP使用DTS,这一项没有用,为了兼容,不要删除或修改

6、ATAG: 0x00200800

ATAG,不能修改,一些新的AP使用DTS,这一项没有用,为了兼容,不要删除或修改

7、MACHINE: 3308

内核识别用,不能修改,这个定义和内核匹配

8、CHECK_MASK: 0x80

保留,不能修改

9、TYPE: GPT

指定该文件CMDLINE里面定义的分区用于创建GPT使用,不会烧录到NVM(NAND,EMMC等)存储器里面。

这么多东西,不管认识不认识,都不要迷茫,其实他们有一个很明显的共同点,那就是和RK的私有协议或者是说规定有很强烈的匹配度,也就是说,这些东西都是RK自己的东西,不是通用的,是和他那个不开源的miniloader相对应的,所以上面对parameter.txt文件需要MiniLoaderAll.bin去解析假下面在说一下这个trust.img这个镜像文件。上面提到了,根据名字来推测,这个玩意儿应该是和认证有关系,联系到RK的做事风格,估计又是保密的东西,果不其然:

既然他不开源,咱们一般用户也没有深究的必要,概念性的东西了解一下算了:

总体来说就是A类处理器所有的,这就是为啥原来使用imx283和nuc972时没有碰到过呢,是因为用的处理器太低端了,那两个都是ARM9.

说到这里,前面关于启动流程的第一部分的假设应该都已经成立了,接下来就是通用的启动流程了,加载内核,初始化,挂载文件系统的各个分区。

好了,今天就记录到这里!

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值