3、SP_Flash_Tool高级技巧:分区表定制、Preloader与Bootloader单独烧录、NVRAM分区备份与恢复、EMMC与UFS烧录差异

好,咱们继续往下聊。SP_Flash_Tool 这个工具,很多人拿它来刷个整包就完事了。但说实话,那只是它的基本功。真正值钱的,是那些平时不怎么用、但关键时刻能救命的「高级功能」。这一章,我就把压箱底的东西翻出来,跟你好好聊聊。

3.1 分区表定制:别让「分区不够」卡住你的项目

做 MTK 项目,最头疼的事之一就是分区规划。尤其是现在客户需求五花八门,今天要加个 OTA,明天要扩个 vendor 分区。如果每次都去改 scatter 文件,那效率太低了。

我个人习惯,是在项目初期就留好「弹性空间」。怎么留?靠的就是分区表定制。

SP_Flash_Tool 烧录时,依赖的是 scatter 文件里的分区布局。你想想看,这个文件其实就是一张地图。告诉工具:哪块是 bootloader,哪块是 system,哪块是 userdata。

要定制分区,核心就是改 scatter 文件里的 partition_sizelinear_start_addr。举个例子:

// 原始分区
- partition_index: SYS1
  partition_name: system
  partition_size: 0x20000000  // 512MB
  linear_start_addr: 0x10000000

// 修改后,把 system 缩小,腾出空间给 vendor
- partition_index: SYS1
  partition_name: system
  partition_size: 0x18000000  // 384MB
  linear_start_addr: 0x10000000

- partition_index: SYS2
  partition_name: vendor
  partition_size: 0x8000000   // 128MB
  linear_start_addr: 0x28000000
⚠️ 注意: 改分区大小不是随便改的。每个分区的起始地址必须连续,不能有空洞。我曾经见过一个同事,改完分区后地址没对齐,结果刷完机直接变砖。嗯,那滋味可不好受。

另外,还有一个更高级的玩法:动态分区。MTK 从 Android 10 开始支持了。说白了,就是分区大小不写死,由系统在第一次启动时自动分配。这样你就不用每次改 scatter 了。但前提是,你的 preloader 和 bootloader 得支持。

3.2 Preloader 与 Bootloader 单独烧录:别动不动就刷全包

做底层调试时,最忌讳的就是「一有问题就刷全包」。全包烧录一次少说 5 分钟,要是加上校验,10 分钟就没了。你想想看,一天能调试几次?

我通常的做法是:只烧录 Preloader 或 Bootloader。

Preloader 是芯片上电后第一个执行的代码。它负责初始化 DRAM,然后加载 Bootloader。如果 Preloader 坏了,手机就是一块砖。Bootloader 则负责加载 kernel。

在 SP_Flash_Tool 里,单独烧录很简单:

  1. 加载 scatter 文件
  2. 在分区列表里,只勾选 preloaderbootloader
  3. 其他分区全部取消勾选
  4. 点击 Download 即可
💡 小技巧: 我习惯把 preloader 和 bootloader 的镜像单独备份一份。万一调试时搞坏了,直接烧这两个文件就能救回来,比刷全包快多了。

这里有个坑,我得提醒你。Preloader 烧录时,必须确保电压稳定。我曾经在一次现场调试中,电池电量不足,结果 Preloader 烧到一半断电了。嗯,那台设备直接变砖,最后只能拆机用 EMMC 编程器救。所以,烧 Preloader 时,一定用稳压电源或者充满电的电池。

3.3 NVRAM 分区备份与恢复:IMEI 丢了?别慌

做手机开发,最怕客户问:「为什么我的 IMEI 没了?」

IMEI、WiFi MAC 地址、蓝牙地址,这些关键信息都存在 NVRAM 分区里。这个分区很小,一般就几 MB,但丢了它,设备就废了一半。

SP_Flash_Tool 提供了 NVRAM 分区的读写功能。具体操作:

  1. 在工具里选择 Read Back 标签
  2. 添加一个读取任务,起始地址填 NVRAM 分区的 linear_start_addr
  3. 长度填 NVRAM 分区的 partition_size
  4. 点击 Read Back,工具就会把 NVRAM 分区读出来,保存成一个 bin 文件

恢复时更简单:用 Write Memory 功能,把备份的 bin 文件写回去就行。

🔑 关键点: 我建议你在项目量产前,先备份一份「干净的」NVRAM 分区。这样万一量产过程中有设备 IMEI 丢失,直接恢复就行,不用重新写号。

另外,NVRAM 分区里还存了校准数据。比如射频的 TX power 校准值。如果你换了主板或者换了 PA,最好重新校准,不要直接恢复旧的 NVRAM。否则信号可能变差。这个坑我踩过,说出来都是泪。

3.4 EMMC 与 UFS 烧录差异:别用老方法处理新硬件

现在很多中高端平台都开始用 UFS 了。UFS 和 EMMC 虽然都是存储,但烧录方式差别很大。

对比项 EMMC UFS
接口协议 MMC 协议,8 位并行 UNIPRO/M-PHY,串行差分
烧录速度 较慢,约 20-30 MB/s 较快,约 100-200 MB/s
分区方式 MBR/GPT,支持 boot 分区 LUN 逻辑单元,支持 RPMB
SP_Flash_Tool 支持 完全支持,稳定 需要特定版本,且依赖驱动

用 SP_Flash_Tool 烧 UFS 时,有几点要注意:

  • 驱动问题: UFS 的烧录驱动和 EMMC 不一样。如果电脑没装对驱动,工具会报错 STATUS_UNSUPPORTED_CTRL。我建议用 MTK 官方提供的驱动包,不要用第三方修改版。
  • 烧录速度: UFS 虽然快,但如果你用 USB 2.0 接口,速度会被限制在 30 MB/s 左右。想体验 UFS 的满速,必须用 USB 3.0 接口。
  • 分区表差异: UFS 的分区表是 LUN 级别的。在 scatter 文件里,你会看到 lun: 0lun: 1 这样的字段。每个 LUN 相当于一个独立的磁盘。烧录时,要确保每个 LUN 的地址正确。
⚠️ 重要提醒: 不要尝试用 EMMC 的 scatter 文件去烧 UFS 设备。两者的地址映射完全不同。我见过有人这么干,结果把 UFS 的 RPMB 分区写坏了,那个分区是一次性可编程的,坏了就再也修不好了。

好了,这一章的内容就这些。分区表定制、Preloader 单独烧录、NVRAM 备份、EMMC 与 UFS 差异,这些都是实战中高频用到的技巧。你把这些吃透了,SP_Flash_Tool 在你手里就不再是简单的刷机工具,而是真正的调试利器。

下一章,咱们聊聊更刺激的:如何用 SP_Flash_Tool 做量产烧录优化。到时候我会分享一些工厂量产时踩过的坑,保证让你少走弯路。