Rockchip系列之RK3568 Android设备固件和分区信息

目录

固件信息

分区信息

分区作用

增加新分区计算规则

分区信息单位解析

Sector

字节

为什么使用Sector?

单位转换


新版本增加分区方式
 

Android 11+增加了可以自动生成parameter.txt的工具,并支持编译parameter.txt

根据配置参数。如果没有配置模板文件,工具会发现并添加修改后的parameter.txt文件。(如果想了解计算规则 请看下面的内容)
参考文档《Rockchip_Android13_SDK_Developer_Guide_EN.pdf》


FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3568_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: rk3568_r CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(security),0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtbo),0x00000800@0x0000c000(vbmeta),0x00014000@0x0000c800(boot),0x00030000@0x00020800(recovery),0x000c0000@0x00050800(backup),0x000c0000@0x00110800(cache),0x00008000@0x001d0800(metadata),0x00000800@0x001d8800(baseparameter),0x00614000@0x001d9000(super),-@0x007ed000(userdata:grow)
 

固件信息

以下是Rockchip RK3568设备的固件信息,包括设备的型号、制造商、固件版本等:

  • FIRMWARE_VER: 固件的版本号,这里的版本号是11.0。
  • MACHINE_MODEL: 设备的型号,这里的型号是rk3568_r。
  • MACHINE_ID: 设备的ID,这里的ID是007。
  • MANUFACTURER: 设备的制造商,这里的制造商是rockchip。
  • MAGIC: 用于标识设备的特殊值,这里的值是0x5041524B。
  • ATAG: 用于标识设备的特殊值,这里的值是0x00200800。
  • MACHINE: 设备的型号,这里的型号是rk3568_r。
  • CHECK_MASK: 用于检查设备的特殊值,这里的值是0x80。
  • PWR_HLD: 用于控制设备电源的特殊值,这里的值是0,0,A,0,1。
  • TYPE: 设备的类型,这里的类型是GPT。
  • CMDLINE: 设备的命令行参数,包括了设备的各种分区信息。

分区信息

以下是设备的分区信息,包括分区的名称、起始地址、偏移量、大小和用途:

分区名称

分区起始地址(sector)

分区偏移量(sector)

分区大小(sector)

分区大小(MB)

分区用途

security

0x00002000

0x00002000

0x00002000

4MB

用于存储安全相关的信息

uboot

0x00004000

0x00002000

0x00002000

4MB

用于存储U-Boot引导加载器

trust

0x00006000

0x00002000

0x00002000

4MB

用于存储TrustZone相关的信息

misc

0x00008000

0x00002000

0x00002000

4MB

用于存储各种杂项信息

dtbo

0x0000a000

0x00002000

0x00002000

4MB

用于存储设备树覆盖信息

vbmeta

0x0000c000

0x00002000

0x00000800

1MB

用于存储AVB元数据

boot

0x0000c800

0x00000800

0x00014000

10MB

用于存储引导分区

recovery

0x00020800

0x00014000

0x00030000

24MB

用于存储恢复分区

backup

0x00050800

0x00030000

0x000c0000

96MB

用于存储备份分区

cache

0x00110800

0x000c0000

0x000c0000

96MB

用于存储缓存分区

metadata

0x001d0800

0x000c0000

0x00008000

16MB

用于存储元数据分区

baseparameter

0x001d8800

0x00008000

0x00000800

1MB

用于存储基本参数

super

0x001d9000

0x00000800

0x00614000

394MB

用于存储超级分区

userdata

0x007ed000

0x00614000

-

-

用于存储用户数据分区

注意:这个表格是基于提供的CMDLINE参数生成的,实际的分区信息可能会因设备的具体配置而有所不同。另外,"userdata"分区的大小是"-",表示它会占用剩余的所有空间。

分区作用

每个分区在Android系统中都有特定的作用,以下是每个分区的简单解释:

  1. boot.img:包含ramdisk、kernel、dtb,用于启动设备并加载操作系统的核心组件。
  2. boot-debug.img:与boot.img的差别是用户固件可以烧写这个boot.img进行root权限操作。
  3. dtbo.img:Device Tree Overlays (设备树覆盖),用于描述硬件配置的数据结构。
  4. config.cfg:烧写工具的配置文件,可以直接导入烧写工具显示需要烧写的选项。
  5. MiniLoaderAll.bin:包含一级loader,用于引导加载器的启动过程。
  6. misc.img:包含recovery-wipe开机标识信息,烧写后会进行恢复操作。
  7. parameter.txt:包含分区信息,记录了设备的分区布局。
  8. pcba_small_misc.img:包含pcba开机标识信息,烧写后会进入简易版pcba模式。
  9. pcba_whole_misc.img:包含pcba开机标识信息,烧写后会进入完整版pcba模式。
  10. recovery.img:包含recovery-ramdisk、kernel、dtb,用于设备出现问题时进行修复操作。
  11. super.img:包含odm、product、vendor、system、system_ext分区内容,是一个包含多个子分区的超级分区。
  12. trust.img:包含BL31、BL32,用于存储TrustZone相关的信息,创建安全环境来运行敏感代码和处理敏感数据。
  13. uboot.img:包含uboot固件,是一个在设备启动时运行的程序,负责加载内核和其他重要的系统组件。
  14. vbmeta.img:包含avb校验信息,用于Android Verified Boot (AVB)的验证机制。
  15. update.img:包含以上需要烧写的img文件,可用于直接烧写整个固件包。
  16. security:用于存储安全相关的信息,如设备的加密密钥等。
  17. cache:存储缓存分区,用于存储临时数据。
  18. userdata:存储用户数据分区,包括用户的应用数据、下载的文件等。
  19. metadata:存储元数据分区,用于存储系统的元数据,如设备的IMEI号等。
  20. backup:存储备份分区,用于在系统更新或恢复时备份重要的数据。

增加新分区计算规则

如果想要添加一个新的分区,例如名为"odm"的分区,大小为15MB,需要首先确定这个分区的起始地址。这个地址应该是上一个分区的起始地址加上上一个分区的大小。例如,如果上一个分区是"super"分区,那么"odm"分区的起始地址应该是0x007ed000 + 0x00614000 = 0x00df1000。

需要将这个分区的大小转换为sector。由于1个sector等于512Bytes,所以15MB等于15 * 1024 * 1024 / 512 = 0x0000f000 sector。

可以将这个分区添加到CMDLINE参数中,像这样:0x0000f000@0x00df1000(odm)。

所以,添加"odm"分区后的CMDLINE参数应该是这样的:

mtdparts=rk29xxnand:0x00002000@0x00002000(security),0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtbo),0x00000800@0x0000c000(vbmeta),0x00014000@0x0000c800(boot),0x00030000@0x00020800(recovery),0x000c0000@0x00050800(backup),0x000c0000@0x00110800(cache),0x00008000@0x001d0800(metadata),0x00000800@0x001d8800(baseparameter),0x00614000@0x001d9000(super),0x0000f000@0x00df1000(odm),-@0x00e01000(userdata:grow)

这个CMDLINE参数包含了新的"odm"分区,它的起始地址是0x00df1000,大小是0x0000f000 sector(15MB)。"userdata"分区的起始地址也相应地向后移动了0x0000f000 sector,以留出空间给"odm"分区。

分区信息单位解析

在处理设备分区信息时,通常会遇到两种单位:sector和字节。

Sector

Sector是设备上的最小存储单元,通常是512字节。在分区信息中,分区大小和分区偏移量都是以sector为单位的。

字节

字节是计算机中的基本存储单元,通常用B表示。一个sector等于512个字节,也就是说,一个sector可以存储512个B的数据。

为什么使用Sector?

使用sector为单位可以更好地对齐设备上的存储空间,提高存储效率和性能。如果使用字节为单位,可能会造成设备上的空间浪费或者读写错误。

例如,如果一个分区的大小是8192字节,那么它占用了16个sector(8192 / 512 = 16)。如果一个分区的大小是8193字节,那么它占用了17个sector(8193 / 512 = 16.00195),但是实际上只用了第17个sector的一个字节,剩下的511个字节就浪费了。如果一个分区的大小是8191字节,那么它占用了16个sector(8191 / 512 = 15.99805),但是实际上少用了第16个sector的一个字节,可能会导致读写错误。

单位转换

如果想看以字节为单位的分区信息,可以把sector乘以512来转换成字节。同样地,如果想看以MB(兆字节)为单位的分区信息,可以把sector乘以512 / 1024 / 1024来转换成MB。

例如,如果一个分区的大小是0x00002000 sector,那么它的大小是0x00002000 * 512字节,或者0x00002000 * 512 / 1024 / 1024 MB。

猜你喜欢

转载自blog.csdn.net/SHH_1064994894/article/details/131488471