如果有问题,请加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.

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

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

瑞芯微RK33XX平台的启动流程探究相关推荐

  1. 瑞芯微RV1109平台交叉编译踩坑

    背景 最近的一个工作任务是将之前在联咏平台上做的一个人脸识别的项目移植过去.之前这个项目主要是做的,移植的事情自然落到我身上了.组里也没人搞过瑞芯微的,开始踩坑淌水. 交叉编译工具 问了公司一圈人也没 ...

  2. 【ROCKCHIP瑞芯微芯片平台方案介绍】

    瑞芯微芯片平台方案介绍 RK312X RK356X RK3288 RK3308 RK3326 RK3358 RK3399 RK3588 RV1126和RV1109 欢迎加入我们 这里是对本团队做了多年 ...

  3. 瑞芯微RK1126平台 通过http接口设置 ISP 饱和度 亮度 对比度

    通过HTTP的方式设置相机的亮度 饱和度 对比度 本来是想通过直接rk的提供的uapi那些接口直接设置isp的 但是 尝试在程序中直接调用 rkaiq那些功能程序会直接挂掉 后来 就看了下 自带的程序 ...

  4. 瑞芯微RV1126平台----yolov5输出后处理C++实现

    目录 1.前言 2.代码 2.1 padding resize 代码 2.2 瑞芯微yolov5后处理 2.3 坐标框的后处理 3.完整代码

  5. 在瑞芯微ok3568平台利用python实现Can通讯

    python版本:3.8 linux系统 项目需求:需要在ok3568平台上面接收振动传感器传来的数据,通讯方式为Can. 1.Can传感器配置 在控制台输入以下命令: ifconfig can0 d ...

  6. 瑞芯微RK3399Pro平台YOLOv4 pytorch模型转RKNN模型失败

    报错:The following operators are not implemented: ['aten::detach', 'aten::to', 'aten::floor', 'aten::s ...

  7. Camera | 4.瑞芯微平台MIPI摄像头应用程序编写

    前面3篇我们讲解了camera的基础概念,MIPI协议,CSI2,常用命令等,本文带领大家入门,如何用c语言编写应用程序来操作摄像头. Linux下摄像头驱动都是基于v4l2架构,要基于该架构编写摄像 ...

  8. 【yolov5系列】将模型部署到瑞芯微RK3566上面

    [yolov5系列]yolov5 v6.0 环境配置.图片视频测试.模型可视化.v6.0的更新内容 [yolov5系列]yolov5的原理与核心代码解析 [yolov5系列]yolov5-onnxru ...

  9. 瑞芯微rk356x板子快速上手

    文章目录 rk3568 CPU GPU NPU VPU 一.编译环境要求 二.编译前准备 0)开发板型号 1)安装第三方编译工具 2)设置adb路径 3)安装USB驱动DriverAssitant_v ...

最新文章

  1. .net 2.0 BackgroundWorker类详细用法
  2. Python代码块批量添加Tab缩进
  3. 微信公众平台两种消息处理流程对比
  4. glibc、uclibc的区别
  5. mysql 杀掉连接_批量杀死MySQL连接的几种方法
  6. ad中那个快捷键是重复上一部_Excel中的F4快捷键用的好,告别加班没烦恼!
  7. 电力系统服务器故障预案,电网预案推演系统及电网预案推演方法
  8. 【机房重构】关于App.config配置文件
  9. 前端后台学习笔记汇杂
  10. [jquery]高级篇--获取div子元素
  11. html canvas 简单体验
  12. 论文查重率【降重】从65%-25%的心路历程!超硬核!霸道降重!
  13. Python中文分词库jieba用法代码示例
  14. 小米开发版安装magisk_MIUI10开发版/安卓P完美xposed与magisk框架教程
  15. (金融入门知识点)Double类型丢失精度
  16. win10安装TeamView 提示rollback framework could not be initialized
  17. 【前端】elementUI分页场景下对表格进行排序
  18. 短信平台源码专业版功能介绍(可接入任何线路的短信接口)|移讯云短信系统
  19. blackjack算法java_[CareerCup] 8.1 Implement Blackjack 实现21点纸牌
  20. 京东商品搜索架构设计

热门文章

  1. python个人项目进度管理系统源码_漳州城投集团 | 城投地产集团开展管理体系优化咨询和计划进度管理系统项目建设...
  2. 【游戏建模全流程】使用Maya制作赛车模型
  3. Word clock抖音屏保工具(官方地址)
  4. html点线面制作,利用HTML5绘制点线面组成的3D图形的示例
  5. 怎样在android平台中签名需要系统权限的apk
  6. 基于Kibana的可视化监控报警插件 KAAE 的配置
  7. C#-MVC的Swagger对重复的架构ID(类型名重复)报错问题
  8. 爱迪生如何看待手机-程序员怎么用移动互联网
  9. 新版标准日本语初级_第十五课
  10. cmd命令行模式转义““符号