☰
RK3568 Android11 parameter.txt分区配置详解与实操
2026/10/3 1:07:49 网站建设 项目流程

在做RK3568方案的Android11系统适配时,我最常被问到的一个文件就是parameter.txt。很多朋友拿到开发板或公版固件后,想改一下userdata分区大小,或者在系统里多腾一个分区出来存数据,结果一打开这个文件就懵了:里面既不是设备树DTS,也不是内核config,而是一串十六进制数值加分区名,改错了烧录工具直接报错,板子变砖还得重新进入Loader模式擦除。

这篇内容就把瑞芯微RK3568开发板在Android11系统下,parameter.txt的完整配置逻辑讲清楚。我会从文件结构、分区项的计算方式、与U-Boot和内核cmdline的联动关系讲起,再给出一份可参考的分区表模板和一套安全修改分区的实操流程,最后把烧录失败、启动卡死、分区挂载异常这些高频问题整理成排查清单。无论你是刚接触瑞芯微平台的新手,还是正在量产阶段被分区布局困扰的工程师,这篇都值得收藏。

1. 先搞明白:parameter.txt 到底在管什么事

1.1 它不是配置文件,是固件烧录的“契约”

先说一个很多新手容易误解的地方:parameter.txt看起来像是一个纯文本配置文件,实际上它是瑞芯微平台在烧录阶段用来定义存储设备(eMMC、U-Boot读到的存储介质)上分区布局的“契约文件”。

这句话怎么理解?你在Windows上用RKDevTool烧录固件时,工具会先读取parameter.txt,根据里面的分区描述在eMMC上写入GPT(GUID Partition Table)分区表,然后才能把uboot.img、boot.img、super.img这些镜像文件分别烧写到对应分区。换句话说,parameter.txt决定了你的系统烧录完之后,存储空间是怎么划分的、每个分区从哪里开始、有多大、能不能格式化、能不能被用户访问。

在Linux下的upgrade_tool烧录流程也一样,工具解析的是同一个文件。它不是设备树DTS那种运行期被内核读取的配置,而是构建期和烧录期使用的关键描述文件。正因为它不进入根文件系统,很多人容易忽略它的重要性,直到分区不对、空间不足、启动失败时才回头找它。

1.2 它与U-Boot、内核、Rootfs的联动关系

有人会问:分区表写好了,系统启动时是怎么知道这些分区存在的?

这里要分两条线说清楚:

  • 存储介质上的GPT分区表:烧录时由parameter.txt生成,U-Boot在启动阶段会读取GPT,找到boot、super、misc这些分区的位置。
  • 内核看到的block设备节点:Linux内核启动后,会根据U-Boot传递的cmdline(命令行参数)和自身的分区解析逻辑,生成/dev/block/by-name/下的分区符号链接。

RK3568平台比较特殊的一点是,U-Boot在启动内核时会把parameter.txt中CMDLINE行的mtdparts参数与DTS设备树里chosen节点的bootargs结合。如果parameter里的分区名、大小与DTS中定义的mmc设备不匹配,内核起来之后就会找不到对应的block节点,Android系统自然无法挂载super分区、userdata分区,最终卡在开机动画或者反复重启。

这就是为什么修改parameter.txt不能“想当然”地只改一个数字,而是要同步考虑烧录工具、U-Boot、内核设备树三方的预期。很多人改了分区后出现“烧录成功但进不了系统”“进系统后internal storage显示0B”这类问题,根源就在这个联动关系上。

既然搞清楚了这个文件的分量,下面进入正题,把它的每一行、每个字段都拆开看。

2. 核心细节解析与实操要点

2.1 文件结构与关键命令块详解

一份典型的RK3568 Android11的parameter.txt,看起来大概是这个样子:

FIRMWARE_VER: 11.0.0 MACHINE_MODEL: RK3568 MACHINE_ID: 007 MANUFACTURER: RK MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 0xffffffff CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00020000@0x0000a000(boot),0x00020000@0x0002a000(recovery),0x00010000@0x0004a000(backup),0x00040000@0x0005a000(cache),0x00038000@0x0009a000(metadata),0x00020000@0x000d2000(kernel),0x00010000@0x000f2000(ramdisk),0x00020000@0x00102000(resource),0x00c00000@0x00122000(super),0x00040000@0x00d22000(vbmeta),0x00010000@0x00d62000(odm),0x00010000@0x00d72000(vendor_boot),0x00010000@0x00d82000(uboot_config),0x00010000@0x00d92000(devinfo),0x00010000@0x00da2000(baseparameter),-@0x00db2000(userdata)

前几行是固定参数区,含义如下表:

参数项作用补充说明
FIRMWARE_VER固件版本号会显示在烧录工具和系统设置中,量产时建议同步更新
MACHINE_MODEL机器型号定义产品型号名称
MACHINE_ID机器ID区分不同方案,一般跟随公版默认值即可
MANUFACTURER厂商字段生成设备信息时使用
MAGIC固定魔数必须是0x5041524B,即"PARK"的ASCII码,用于烧录工具识别文件合法性
ATAGATAG参数地址兼容旧版本引导协议使用
MACHINE机器类型掩码0xffffffff表示不限制
CHECK_MASK校验掩码0x80表示对boot分区进行校验的开关,量产最好保持默认
PWR_HLD上电保持逻辑控制GPIO电平保持时序,一般仿照原厂配置
TYPE分区表类型GPT或MBR,RK3568默认使用GPT

这些字段里真正需要你经常关心的主要是FIRMWARE_VER、MACHINE_MODEL,以及下面重点讲的CMDLINE。

2.2 分区项字段:大小、偏移、名称背后的计算方法

CMDLINE里的mtdparts是整个parameter.txt的核心。其语法为:

mtdparts=rk29xxnand:size[@offset](name),size[@offset](name),...

每个分区项由三部分组成:

  • size:分区大小,单位是扇区(sector),1个扇区 = 512字节。
  • offset:分区起始偏移,同样以扇区为单位,必须大于或等于上一个分区的结束位置。
  • name:分区名称,会直接对应到系统里的/dev/block/by-name/name。

举个例子,0x00020000@0x0000a000(boot)表示boot分区从偏移0xa000扇区(即 0xa000 * 512 = 20MB 处)开始,大小为0x00020000扇区(即 0x20000 * 512 = 64MB)。

重点来了,我发现很多人在改分区时犯的第一个错,就是只改size忘记改offset,或者offset计算错误,导致后面所有分区全部错位。这里给你一个简单可靠的计算公式:

当前分区结束扇区 = 当前分区起始扇区 + 当前分区大小扇区 下一个分区起始扇区 = 当前分区结束扇区(建议再对齐到8的整数倍,也就是4KB对齐)

比如你想把boot分区从64MB改为128MB,即0x00020000改为0x00040000,那么它的结束偏移就从0xa000 + 0x20000 = 0x2a000变成了0xa000 + 0x40000 = 0x4a000,后面recovery分区的偏移就必须从0x2a000改成0x4a000,不能继续用原来的0x2a000。

另一个容易踩的坑是分区大小对齐。RK平台的存储设备通常按4KB或8KB对齐性能最佳,尤其eMMC本身内部就是按块管理的。计算出来的分区起始偏移最好是8扇区(4KB)的整数倍,这样能避免跨物理块带来的读写性能损耗。

分区项中还支持一种特殊写法:-@offset(name),即size位置写“-”,表示从该偏移开始一直到存储介质末尾,全部归属于这个分区。典型的就是userdata分区,它总是排在有具体大小的分区列表之后,占据剩余全部空间。所以你会发现几乎所有parameter文件的最后一个分区都是userdata,并且size为“-”。

2.3 动态分区与Android11的super分区

RK3568的Android11和旧款平台有一个很大的不同:system、vendor、product这些分区不再直接出现在parameter.txt的固定列表里,而是被统一放进了一个叫super的大分区中。

这是一个典型的Android动态分区(Dynamic Partition)设计。绕开了传统固定分区方式中“system满了vendor还有很多空余”的浪费问题,system、vendor、product、odm等分区都在super内部由系统动态管理,实际的逻辑分区大小可以在构建时通过动态分区配置灵活调整。

因此修改system分区的“容量大小”时,你动的不再是parameter.txt里的某个system分区,而是修改super分区的大小。比如你的产品需要很大的系统空间,可以把CMDLINE中super的size从0x00c00000(约384MB)调到更大,同时压缩后面的userdata空间,因为userdata是“-”自动占满剩余区域,所以super变大,userdata自然就变小了。

这里特别提醒一句:super分区不是想改多大就改多大。动态分区除了super本身,还需要一个metadata分区来保存super内部各逻辑分区的布局信息,metadata大小建议保持在16MB及以上,不要为了给super腾空间把它压得太小,否则首次启动时动态分区加载会失败。

理解了这些分区项的含义,接下来就可以上真家伙了。

3. 实操过程与核心环节实现

3.1 一份可参考的RK3568 Android11分区表模板

下面这份是我基于公版SDK整理的一份相对通用、适合大部分RK3568 Android11项目的parameter.txt模板。它包含了一些实际量产时比较常用的分区,例如baseparameter、uboot_config、devinfo等,不同SDK版本可能有细微差异,但整体思路一致:

FIRMWARE_VER: 11.0.0 MACHINE_MODEL: RK3568 MACHINE_ID: 007 MANUFACTURER: RK MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 0xffffffff CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00040000@0x0000a000(boot),0x00020000@0x0004a000(recovery),0x00010000@0x0006a000(backup),0x00040000@0x0007a000(cache),0x00004000@0x000ba000(metadata),0x00020000@0x000be000(kernel),0x00010000@0x000de000(ramdisk),0x00020000@0x000ee000(resource),0x00c00000@0x0010e000(super),0x00020000@0x00d0e000(vbmeta),0x00010000@0x00d2e000(odm),0x00010000@0x00d3e000(vendor_boot),0x00010000@0x00d4e000(uboot_config),0x00010000@0x00d5e000(devinfo),0x00010000@0x00d6e000(baseparameter),-@0x00d7e000(userdata)

几个值得注意的细节:

  • uboot分区的起始偏移是0x4000扇区(8MB),前面留出的0~8MB空间一般用于存放分区表、GPT备份等底层数据,不要随意占用。
  • trust分区紧跟在uboot后面,用于存放ATF(ARM Trusted Firmware),同样不可省略。
  • metadata分区我特意给了16MB(0x4000扇区),这是Android动态分区读取metadata信息的安全大小。
  • super分区给了384MB,如果你不需要太多系统空间,可以适当缩小,把空间留给userdata。

需要说明的是,这份模板里的kernel、ramdisk、resource、backup等分区在不同SDK版本中并不一定都会被使用。新版Android11的启动镜像已经拆成了boot和vendor_boot,kernel和ramdisk可能直接打包进boot或vendor_boot里,这些分区名是否保留取决于SDK的构建脚本。最稳妥的方式是下载一份和你SDK版本完全匹配的原始parameter.txt,在此基础上根据需求修改,而不是直接套用网上的模板。

3.2 从零修改分区大小的完整流程

知道了文件含义,下面是一套我经过多次量产验证的安全修改流程,每一步都对应一个目的。

第一步,备份原始文件。拿到SDK或固件包后,先把原始parameter.txt另存一份。不管是官方原版、客户提供的BSP包,还是上一任工程师留下的修改版,都备份好,方便出问题时做差异对比。

第二步,明确需求,计算新分区大小。比如客户需求是“userdata可用空间达到8GB”。首先要看开发板存储介质的容量,以64GB eMMC为例,其总扇区数约64 * 1024 * 1024 * 1024 / 512 = 134217728扇区。用总扇区数减去所有固定分区的总大小,就能估算出userdata的最大可用空间。如果不够8GB,需要压缩其他分区,通常优先压缩cache、backup这些非关键分区。

第三步,计算偏移并修改CMDLINE。按2.2节提到的方法,从第一个分区开始逐个计算。我自己的习惯是在Excel或纯文本里先把每一列的size和offset算好,做成下面这种分区规划表:

分区名大小(扇区)起始偏移(扇区)结束偏移(扇区)大小(MB)
uboot0x20000x40000x60004
trust0x20000x60000x80004
misc0x20000x80000xa0004
boot0x400000xa0000x4a000128
...............
userdata-0xd7e000end剩余

确认没有重叠、没有空洞、对齐到8扇区后,再回填到parameter.txt中。

第四步,修改对应的构建配置和烧录脚本。很多SDK在编译时会把parameter.txt复制到rockdev目录,或者会有一个parameter-*.txt被Makefile引用。修改后务必确认最终打进固件包、烧录工具实际读到的是你修改后的版本。我曾经遇到过一次改了文件但烧录时工具加载的还是旧文件,就是因为SDK构建时把parameter从别的位置覆盖了。

第五步,执行一次完整烧录并做功能验证。不要只做单分区烧写,要对整机做一次完整擦除和全量烧录,然后检查分区表是否正常:进入系统后执行cat /proc/partitions查看分区节点,或用df -h查看userdata实际大小是否符合预期。

3.3 与设备树DTS和内核cmdline的联动修改

前面提到过,parameter.txt里的CMDLINE最终会传递给内核。但RK的Android11设备在运行时,内核的cmdline还有另一个来源:U-Boot的bootargs和DTS中chosen节点。这三者之间的优先级和覆盖关系在调试时非常关键。

通常情况下,U-Boot会把存储介质的分区信息通过mtdparts参数传给内核。内核启动后会解析mtdparts,生成对应的分区设备。如果你的DTS中没有定义bootargs、stdout-path等必要字段,或者DTS里定义的内存大小和实际eMMC布局有冲突,内核就有可能无法正确识别分区节点。

我踩过的一个典型例子是:为了禁用某个调试串口,在DTS中修改了chosen节点的stdout-path,结果重启后系统无法挂载userdata,卡在init进程。原因就是U-Boot在拼接cmdline时,发现DTS中的chosen和parameter中的CMDLINE格式不匹配,索性丢弃了一部分参数,导致内核没有拿到完整的分区信息。

所以当你修改了parameter.txt之后,一定要回到SDK源码里检查对应板级的DTS设备树,确认:

  • 存储节点(如&emmc、&sdmmc)的status是否为okay。
  • chosen节点的bootargs是否为空或格式正确。
  • DTS中是否有hardcoded的固定分区表,如果有,需要和parameter.txt保持同步修改。

DTS里的固定分区表通常以partitions { ... };的形式出现在存储节点下,虽然Android11启动时优先使用GPT,但U-Boot早期阶段和某些内部工具可能会读取DTS里的分区定义,两者不一致时会出现烧录完成后第一次启动正常、重启后分区“消失”的奇怪现象。

4. 常见问题与排查技巧实录

4.1 烧录阶段问题:工具解析失败、错位、擦除失败

RKDevTool/upgrade_tool在烧录环节对parameter的校验其实很严格,遇到报错先对照这张表。

现象常见原因排查与解决
工具提示“Parse parameter failed”文件编码不是UTF-8无BOM格式,或文件末尾缺换行用Notepad++或VS Code另存为UTF-8无BOM,确保最后一行以换行符结尾
烧录进度走到中途报错,提示找不到某个镜像CMDLINE中分区名与镜像文件名不对应检查分区名和烧录配置中的镜像名是否一致,比如resource.img对resource分区
整机烧录完成,但重启无法进入系统分区偏移重叠或size计算错误按3.2节的分区规划表逐项核对偏移
烧录到userdata时异常缓慢或卡住userdata所在剩余空间过大且分区未对齐检查userdata起始偏移是否对齐8扇区,如果没问题可考虑更换数据线或USB口

另外,很多人反复烧录失败后习惯使用“擦除Flash”或“低级格式化”功能,这个操作会把GPT分区表和loader全部清掉,板子会进入MaskROM模式。在MaskROM模式下重新烧录,要先烧写MiniLoader(U-Boot),再烧parameter,之后才能继续烧其他分区。如果你手头没有MiniLoader,不要随便点擦除,否则需要短接板子上的recovery键或特定测试点才能恢复,很麻烦。

4.2 启动与挂载问题:卡logo、userdata 0B、super加载失败

烧录成功只是第一步,真正折磨人的往往是启动阶段的异常。这里列三个我实际处理过的故障。

故障一:开机卡在logo界面,log显示super分区加载失败

这种问题大概率是super分区太小,而打包生成的system/vendor/product逻辑分区总大小超过了super容量。Android动态分区机制在首次启动时会读取metadata分区,逐个挂载super内部的逻辑分区,一旦容量不足,挂载就会失败。排查方法:

# 进入U-Boot命令行 mmc part # 查看GPT分区信息,确认super分区大小

也可以在系统内用superctl或lmkd相关日志确认动态分区加载异常的具体原因。解决办法是增大super分区,或者裁剪system/vendor中不必要的模块和预装应用,缩小不需要的逻辑分区。

故障二:系统正常进入,但“存储空间”显示0B或实际可用容量只有几百MB

这个问题绝大多数情况是userdata分区过小或没生效。先确认用户分区是否真的占了剩余空间:

adb shell df -h /data adb shell cat /proc/partitions

如果df显示/data只有几百MB,说明parameter中的userdata前面还有其他分区占用了大量空间,或者userdata的size没有写为“-”。如果df显示正常但设置界面不对,可能是vold的fstab配置问题,需要检查/vendor/etc/fstab.rk30board或fstab.emmc中的userdata挂载参数。

故障三:fastboot或recovery模式下分区列表为空

这种情况多半是misc分区或vbmeta分区被损坏。Android11的启动完整性校验依赖vbmeta,如果你从旧版系统升级上来,没有同步更新vbmeta,就会导致recovery无法认证。可以用烧录工具单独擦除misc分区后重新烧录vbmeta,再试试进入recovery。

4.3 分区设计缺陷带来的隐藏问题

最后说两个量产阶段才容易暴露的隐藏问题,都是我在实际项目里踩过之后总结出来的。

第一个是cache分区与OTA升级的关系。很多项目为了给userdata腾空间,把cache压到32MB甚至16MB。这个分区在Android系统中承担着OTA升级包缓存和开机优化日志等功能。如果cache过小,OTA升级包较大时会反复提示存储不足,导致升级失败。如果你的产品需要支持OTA,我建议cache不要小于64MB。

第二个是分区名与自定义应用路径绑定的问题。有些产品需要在系统中划分一个独立的data分区用于存放特定业务数据。这时候我强烈建议新增一个有明确含义的分区名,比如appdata,并在parameter中给它分配独立空间,而不要直接复用devinfo、baseparameter这类系统保留分区。瑞芯微平台对某些分区有特殊用途的约定,比如devinfo用于存储设备解锁状态和保险丝信息,随意写入可能导致解锁状态异常,进而影响系统安全启动流程。

新增自定义分区的模板大致是这样,假设我要加一个128MB的appdata分区,放在baseparameter之前:

...,0x00010000@0x00d6e000(baseparameter),0x00040000@0x00e6e000(appdata),-@0x00eae000(userdata)

注意新分区的偏移要接在baseparameter之后,同时把userdata的偏移改成0x00eae000。新增分区后,在内核DTS的partitions节点中也添加对应项,然后重新编译boot.img或resource.img,这样系统起来后才能在/dev/block/by-name/下看到appdata这个节点。

5. 写在最后的经验之谈

搞RK平台时间久了你会发现,parameter.txt这个文件常常是项目里最晚被认真对待、却最早引发连锁故障的地方。它的修改门槛看起来不高,好像就是十六进制数字加加减减,但一旦忽略了偏移对齐、动态分区匹配、DTS联动这些底层约束,轻则浪费一块存储空间,重则导致整批设备无法开机。

我个人的习惯是:每次修改parameter.txt,都会在工程目录下留一个partition_change_log.txt,记录修改日期、原始文件路径、改动原因、新旧offset对照表。这个习惯救过我很多次,尤其是在多人协作的项目里,避免了下一个人拿到上一个版本的参数文件时完全不知道改过什么。

另外建议大家养成一个验证习惯:US B烧录完成后,不要急着交给测试,先在串口终端里抓一遍完整启动日志,确认mtdparts打印出的分区表和你设计的完全一致,再检查一遍/proc/partitions。这两个地方对上了,基本就说明你的parameter配置真正生效了,后面再出问题,至少可以先把分区因素排除掉。

如果你在改分区的过程中遇到了其他奇怪的报错,欢迎随时交流。RK平台的坑不少,但大多数都藏在细节里,多踩几次、多记录、多对日志,很快就会形成一套自己的排查直觉。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询