4、Flash布局与分区表:MTK Flash分区概念与配置

好,咱们今天聊聊MTK平台上的Flash布局。说实话,这是做固件开发绕不开的一关。你想想看,Flash就像一块地皮,怎么划分区域、每个区域放什么,直接决定了你的系统能不能跑起来、OTA能不能成功。

我个人习惯把Flash布局比作「房子的户型图」。Bootloader是玄关,NV是保险柜,System是客厅,UserData是储物间。每个房间都有它的用途,乱改户型是要出问题的。

4.1 MTK Flash分区概念

先说说几个核心分区。我当年刚接触MTK时,就被这些分区名字搞晕过。其实没那么复杂,咱们一个一个拆开看。

4.1.1 Bootloader分区

Bootloader,说白了就是上电后第一个跑的程序。它负责初始化硬件、加载系统内核。MTK平台通常有preloader和uboot两级。

关键点:

  • preloader:芯片上电最先执行,初始化DDR、时钟等
  • uboot:负责加载kernel,支持fastboot命令
  • 这个分区一般只读,OTA时不会动它
⚠️ 注意: 我曾经遇到过preloader和uboot版本不匹配,导致设备变砖。升级Bootloader时一定要确认版本兼容性。

4.1.2 NV分区(Non-Volatile)

NV分区存的是设备的校准数据、IMEI、MAC地址等。嗯,这里要注意——NV数据是每个设备独有的,量产时烧录一次,后续OTA不能擦除。

我在项目中遇到过最头疼的事:OTA脚本不小心把NV分区格式化了,结果整批设备的IMEI全丢了。后来我们加了个保护机制,OTA前先校验NV分区是否被误操作。

4.1.3 System分区

System分区放的是Android系统或Linux系统镜像。OTA升级主要就是更新这个分区。MTK平台下,system分区通常用ext4或EROFS文件系统。

分区大小建议:

  • 入门级设备:512MB ~ 1GB
  • 中端设备:2GB ~ 4GB
  • 高端设备:4GB以上

4.1.4 UserData分区

UserData就是用户数据区,存应用、照片、下载文件等。OTA时这个分区一般不动,但有些场景需要格式化(比如Android大版本升级)。

💡 经验之谈: 我建议UserData分区至少留出20%的冗余空间。否则用户装几个大应用,OTA升级包都下载不下来。

4.2 分区表配置(partition_table_MTxxxx)

分区表是MTK平台的核心配置文件。它告诉芯片:Flash上每个分区从哪里开始、到哪里结束、叫什么名字。

文件名通常是 partition_table_MTxxxx.xlspartition_table_MTxxxx.csv。xxxx代表芯片型号,比如MT6765、MT8788等。

4.2.1 分区表结构

咱们看一个典型的分区表示例:

# 分区名        起始地址        大小          类型
PRELOADER       0x0             0x40000       RAW
PGPT            0x40000         0x800         RAW
BOOTLOADER      0x40800         0x80000       RAW
NV              0x100000        0x200000      RAW
PROTECT1        0x300000        0x100000      RAW
PROTECT2        0x400000        0x100000      RAW
SECCFG          0x500000        0x200000      RAW
LOGO            0x700000        0x300000      RAW
BOOT            0xA00000        0x1000000     RAW
RECOVERY        0x1A00000       0x1000000     RAW
SYSTEM          0x2A00000       0x8000000     EXT4
CACHE           0xAA00000       0x2000000     EXT4
USERDATA        0xCA00000       0x20000000    EXT4

看到没?每个分区都有明确的起始地址和大小。我刚开始做时,最怕的就是地址算错——一个字节的偏差,设备就起不来。

4.2.2 分区表配置要点

1. 对齐要求:

  • 所有分区的起始地址必须是Flash擦除块大小的整数倍
  • MTK平台通常要求128KB或256KB对齐
  • 不对齐的话,擦除操作会影响到相邻分区

2. 分区顺序:

  • Bootloader相关分区必须放在最前面
  • NV分区紧跟着Bootloader
  • System和UserData放在后面

3. 预留空间:

  • 建议在Flash末尾预留5%~10%的空闲空间
  • 用于坏块替换或未来功能扩展
🔑 核心原则: 分区表一旦量产烧录,尽量不要修改。改分区表意味着要重新刷机,用户数据全丢。

4.2.3 常见芯片的分区表差异

芯片型号 Flash类型 典型总大小 分区数量
MT6739 eMMC 8GB 12~15个
MT6765 eMMC/UFS 16GB~32GB 15~20个
MT8788 eMMC/UFS 32GB~64GB 20~25个
MT6833 UFS 64GB~128GB 25~30个

你想想看,分区数量越多,管理复杂度就越高。我见过一个项目,分区表里塞了30多个分区,光调试分区对齐问题就花了一周。

4.3 分区表配置实战建议

最后,我分享几个实战中总结的经验:

  1. 先画图再填表:拿到Flash容量后,先在纸上画出分区布局,再填到Excel里。我吃过亏,直接在Excel里改,结果地址算错了。
  2. 版本管理:分区表文件一定要纳入Git管理。每次修改都要写清楚变更原因。
  3. 自动化检查:写个脚本检查分区是否重叠、是否对齐。手动检查太容易漏了。
  4. 备份NV分区:量产前,把NV分区的初始数据备份到安全位置。万一OTA出问题,还能恢复。
⚠️ 避坑指南: 我曾经在MT6765项目上,因为分区表里SYSTEM分区大小写错了(写成了"system"),导致OTA升级包刷不进去。MTK的解析器是区分大小写的,切记!

好了,Flash布局和分区表就聊到这儿。下一章咱们讲OTA升级包的生成流程,那个更有意思。