2. 启动流程概述:A64冷启动与热启动、启动介质选择、启动模式(FEL/正常启动)

好,咱们直接进入正题。A64这颗芯片的启动流程,说白了就是芯片上电后,从“啥也没有”到“把操作系统跑起来”的整个过程。我做了这么多年全志平台,每次调试启动问题,都感觉像是在跟芯片“对话”。今天我就把这里面的门道给你捋清楚。

2.1 冷启动 vs 热启动:本质区别在哪?

先说说冷启动和热启动。这两个概念,很多刚入行的朋友容易搞混。

冷启动,就是芯片从完全断电状态开始上电。这时候,芯片内部的寄存器、SRAM、DDR控制器,全都是“一张白纸”。我习惯叫它“硬启动”。

热启动,则是芯片在已经通电的情况下,通过复位引脚(RESET)或者看门狗超时触发的重启。这时候,DDR里的数据可能还在,但CPU核心状态会被重置。

核心区别:

  • 冷启动:BROM会重新扫描启动介质,从头开始加载。
  • 热启动:BROM会检查复位原因寄存器,如果发现是软复位,可能会跳过某些初始化步骤。

我在项目中遇到过一个问题:客户说他们的设备偶尔启动不了,但按一下复位键就好了。查了半天,发现是热启动时DDR没完全复位,导致内存校验失败。嗯,这里要注意,如果你在热启动时需要完全重新初始化DDR,最好在硬件设计上把DDR的复位引脚也连到系统复位上。

2.2 启动介质选择:BROM是怎么“找”程序的?

A64的BROM(Boot ROM)是芯片内部固化的一段只读代码。芯片一上电,CPU首先执行的就是它。BROM的任务很简单:按照优先级顺序,去各个启动介质上找可启动的程序

启动介质的优先级,是通过芯片的BOOT_SEL引脚来配置的。我一般会把这几个引脚拉出来,方便调试时切换启动方式。

BOOT_SEL[2:0] 启动介质 说明
000 NAND Flash 默认启动方式,常用于量产
001 SD Card (MMC0) 开发调试最常用
010 SPI NOR Flash 启动速度快,容量小
011 eMMC (MMC2) 主流存储方案
1xx FEL模式 强制进入USB下载模式

你想想看,BROM在扫描介质时,会先检查介质是否存在,然后读取前若干个扇区,验证是否有合法的启动签名(比如全志的eGON.BT0签名)。如果签名不对,BROM就会跳到下一个介质继续找。

我的调试习惯:开发阶段,我通常把BOOT_SEL设为001,直接从SD卡启动。这样改代码、烧录都很快。等代码稳定了,再切到eMMC或NAND。

2.3 启动模式:FEL vs 正常启动

这里要重点讲一下FEL模式。FEL(Firmware Emergency Load)是全志芯片的一个“救命稻草”模式。说白了,就是芯片进入一个等待USB命令的状态,你可以通过PC端的工具(比如sunxi-fel)直接往芯片内存里写程序、烧录固件。

什么时候会进入FEL模式?

  • BOOT_SEL引脚被拉到了FEL对应的电平(比如1xx)。
  • BROM扫描完所有启动介质,都没找到合法的启动程序。
  • 芯片上电时检测到USB线连接,且D+引脚有特定电平。

我曾经有一次把eMMC里的boot0分区给擦坏了,板子直接变砖。当时心里一凉,但转念一想,A64有FEL模式啊!于是我把BOOT_SEL跳线帽一插,上电,用sunxi-fel命令把U-Boot加载到内存里,然后通过U-Boot重新烧写了eMMC。嗯,这就是FEL模式的价值——只要BROM没坏,芯片就“死”不了

避坑指南:我曾经见过有人把FEL引脚直接接地,导致芯片永远进不了正常启动。记住,FEL模式是调试工具,不是默认启动方式。量产产品里,BOOT_SEL一定要配置成你想要的启动介质。

2.4 正常启动流程:从BROM到U-Boot

正常启动模式下,A64的启动流程大致是这样的:

  1. BROM执行:初始化CPU、时钟、SRAM。然后扫描启动介质,找到合法的启动程序(通常是SPL)。
  2. SPL加载:BROM把SPL(Secondary Program Loader)从介质拷贝到SRAM中,然后跳转执行。SPL负责初始化DDR、时钟、部分外设。
  3. U-Boot加载:SPL从介质中加载完整的U-Boot到DDR中,然后跳转。U-Boot负责加载内核和设备树。
  4. 内核启动:U-Boot把控制权交给Linux内核,启动流程结束。

这里有个细节:BROM本身只有32KB大小,它只能加载不超过32KB的SPL。所以SPL必须写得非常精简。我刚开始做全志Bootloader时,SPL里塞了太多初始化代码,结果编译出来超了32KB,BROM直接不认。后来我学乖了,SPL里只做最必要的事情——初始化DDR和时钟,然后赶紧把U-Boot主体加载进来。

2.5 启动流程中的关键寄存器

调试启动问题时,有几个寄存器我经常看:

  • RST_STA (0x01F00C00):复位状态寄存器。可以读出是冷启动、热启动还是看门狗复位。
  • BOOT_MODE (0x01F00C04):启动模式寄存器。BROM会把检测到的启动介质信息写到这里。
  • FEL_FLAG (0x01F00C08):FEL模式标志。如果这个寄存器被置位,BROM会强制进入FEL模式。

我记得有一次,客户说他们的设备偶尔会进入FEL模式,但明明BOOT_SEL引脚配置的是正常启动。我让他们读了一下FEL_FLAG寄存器,发现是某个外设在上电瞬间产生了干扰,导致这个寄存器被意外置位。后来在硬件上加了滤波电容,问题就解决了。

2.6 小结

好了,这一章的内容就这些。总结一下:

  • 冷启动和热启动,区别在于DDR和寄存器的初始化程度。
  • 启动介质选择,靠BOOT_SEL引脚配置,BROM按优先级扫描。
  • FEL模式是调试利器,正常启动是量产标配。
  • 整个流程就是BROM -> SPL -> U-Boot -> Kernel,环环相扣。

下一章,我会带你深入BROM的代码,看看它到底是怎么扫描介质、验证签名的。到时候咱们再细聊。