Toybrick

RK3399Pro入门教程(2)RK3399Pro分区表和固件组成

jefferyzhang

版主

积分
13574
楼主
发表于 2019-2-14 13:18:33    查看: 119979|回复: 35 | [复制链接]    打印 | 只看该作者


很多同学对3399Pro的启动方式和分区表开始感兴趣了,想着如何自己修改烧写固件,如何修改分区表,
今天就教大家识别下分区表文件parameter.txt以及固件的启动方式

1. 分区表


首先大家拿到的开发版默认是双系统启动的,里头包含了Android和Linux固件,我们先打开他的分区表来识别下。
请直接看CMDLINE这行信息:

CMDLINE:mtdparts=rk29xxnand:
0x00002000@0x00002000(uboot),
0x00002000@0x00004000(trust),
0x00002000@0x00006000(misc),
0x00010000@0x00008000(boot),
0x00020000@0x00018000(recovery),
0x00038000@0x00038000(backup),
0x00002000@0x00070000(security),
0x00100000@0x00072000(cache),
0x00500000@0x00172000(system),
0x00008000@0x00672000(metadata),
0x00100000@0x0067a000(vendor),
0x00100000@0x0077a000(oem),
0x00000400@0x0087a000(frp),
0x00375c00@0x0087a400(userdata),
0x00010000@0x00bf0000(boot_linux:bootable),
-@0x00c00000(rootfs:grow)

他所描述的就是整个emmc中分区的排布方式,烧写工具和启动程序会按照该表进行烧录和引导。他的格式是:

             分区大小 @ 所在地址 (分区名)

其中大小和地址都是以为单位(1块=512byte),换算成MByte可以用以下公式:

              MByte = N * 512 / 1024 / 1024

例如我们看uboot这行,
他的分区大小是0x2000, 也就是 8192块 * 512字节每块 / 1024 / 1024 = 4MByte ,所以uboot分区大小就是4M,而他所在的位置也是在emmc 4M的位置。

接下去trust分区紧跟uboot分区,所以他所在的地址就是 uboot的地址+uboot大小 = 0x2000+0x2000 = 0x4000
而最后一个分区可以看到他的分区大小是个减号"-",意思就是emmc剩下的所有大小全部给他。非常方便吧。一般我们会把user分区放在最后一个分区给用户自由使用。

注:EMMC前4M的空间是保留空间,他是用来存放BootLoader和Parameter的,所以请勿挂念。


2. 启动顺序

开机时候,3399Pro总是会从emmc的0地址读取BootLoader,也就是发布固件里的(MiniLoaderAll.bin),
然后:
Loader 引导 trust和uboot,
uboot 引导 boot             (安卓的kernel resource 和boot打包在一个固件里了)
            或 boot_linux     (linux的kernel resource)

boot 挂载 system(Android系统)、metadata、vendor、oem(都是安卓8.1后新加的安卓分区)
boot_linux 挂载 rootfs (Linux系统)

从而进入了各自的系统里。

这里还有个Misc分区没说到,Misc只是一个附加启动命令,如果被烧写,loader(或者uboot)就会读取他的内容并执行(主要是用来进入安卓的recovery模式,还有RK的厂测模式),成功执行完会清空misc分区,这样下次运行时候就不会再次进入。


那么这么解释完同学们是否已经对RK3399PRO的分区表和启动顺序有了大致的了解了呢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

administer

中级会员

积分
311
沙发
发表于 2019-2-22 20:56:56 | 只看该作者
怎么删除安卓仅保留linux呢
回复

使用道具 举报

jefferyzhang

版主

积分
13574
板凳
 楼主| 发表于 2019-2-22 23:33:08 | 只看该作者
administer 发表于 2019-2-22 20:56
怎么删除安卓仅保留linux呢

烧写parameter_linux那个,按他的分区烧写对应固件就可以了。
具体参考下wiki
回复

使用道具 举报

gary.zhang

新手上路

积分
14
地板
发表于 2019-3-12 09:45:41 | 只看该作者
我遇到两个问题:
1. 运行烧录工具加载配置文件以后,烧录工具直接闪退,AndroidTool_Release_v2.64下发现了一个tool_error.dmp的文件,我将它贴在了附件里
2. 连接Micro USB以后打开虚拟串口,发现它不断的打印跟ADC有关的log,影响命令输入和结果查看
[ 3294.351419] ## ADC Chan[0] val: 1, pressed.
[ 3294.654587] ## ADC Chan[0] val: 0, pressed.
[ 3294.856534] ## ADC Chan[0] val: 1, pressed.
[ 3295.361406] ## ADC Chan[0] val: 0, pressed.
[ 3295.563616] ## ADC Chan[0] val: 1, pressed.
[ 3295.966650] ## ADC Chan[0] val: 0, pressed.
[ 3296.067634] ## ADC Chan[0] val: 1, pressed.
[ 3296.168639] ## ADC Chan[0] val: 0, pressed.
[ 3296.370586] ## ADC Chan[0] val: 1, pressed.
[ 3296.774450] ## ADC Chan[0] val: 0, pressed.
[ 3296.875751] ## ADC Chan[0] val: 1, pressed.
[ 3297.178558] ## ADC Chan[0] val: 2, pressed.
[ 3297.380670] ## ADC Chan[0] val: 0, pressed.
[ 3297.582679] ## ADC Chan[0] val: 1, pressed.
[ 3297.683689] ## ADC Chan[0] val: 0, pressed.

麻烦协助解决一下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

allen_toy_brick

新手上路

积分
4
5#
发表于 2019-5-16 16:17:45 | 只看该作者
新手上路试试发帖
回复

使用道具 举报

cling

中级会员

积分
322
6#
发表于 2019-5-20 14:29:25 | 只看该作者
版主你好,目前擦除了linux系统,在烧写andoird分区镜像时,修改了内核部分,分区没有kernel.img和resouce.img,只需烧录boot.img文件就可以了吗?烧完打印log并未启动kernel,请问是烧录的固件不对吗?
回复

使用道具 举报

jefferyzhang

版主

积分
13574
7#
 楼主| 发表于 2019-5-20 14:34:00 | 只看该作者
cling 发表于 2019-5-20 14:29
版主你好,目前擦除了linux系统,在烧写andoird分区镜像时,修改了内核部分,分区没有kernel.img和resouce. ...

请参看wiki教程烧写。。。
目前把kernel和resource打包一起了,避免额外占用空间
回复

使用道具 举报

renton

新手上路

积分
28
8#
发表于 2019-7-31 16:16:27 | 只看该作者
jefferyzhang 发表于 2019-5-20 14:34
请参看wiki教程烧写。。。
目前把kernel和resource打包一起了,避免额外占用空间 ...

所以,还是请问一下
kernel.img究竟怎么烧进去,地址填多少,wiki没有写啊。。。
回复

使用道具 举报

abcehac

注册会员

积分
163
9#
发表于 2019-8-10 02:30:40 | 只看该作者
为啥parameter-dual 中的 -@0x00c00000(rootfs:grow) 和
       parameter-Linux中的 -@0x00016000(rootfs:grow)不一样???
回复

使用道具 举报

jefferyzhang

版主

积分
13574
10#
 楼主| 发表于 2019-8-10 16:29:55 | 只看该作者
abcehac 发表于 2019-8-10 02:30
为啥parameter-dual 中的 -@0x00c00000(rootfs:grow) 和
       parameter-Linux中的 -@0x00016000(rootfs ...

地址是前一个地址+前一个分区大小得出来的,你往后算下不就知道了。
dual里双系统用的空间当然比单系统大多了,为什么会一样?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表