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时不会动它
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大版本升级)。
4.2 分区表配置(partition_table_MTxxxx)
分区表是MTK平台的核心配置文件。它告诉芯片:Flash上每个分区从哪里开始、到哪里结束、叫什么名字。
文件名通常是 partition_table_MTxxxx.xls 或 partition_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 分区表配置实战建议
最后,我分享几个实战中总结的经验:
- 先画图再填表:拿到Flash容量后,先在纸上画出分区布局,再填到Excel里。我吃过亏,直接在Excel里改,结果地址算错了。
- 版本管理:分区表文件一定要纳入Git管理。每次修改都要写清楚变更原因。
- 自动化检查:写个脚本检查分区是否重叠、是否对齐。手动检查太容易漏了。
- 备份NV分区:量产前,把NV分区的初始数据备份到安全位置。万一OTA出问题,还能恢复。
好了,Flash布局和分区表就聊到这儿。下一章咱们讲OTA升级包的生成流程,那个更有意思。