2. Sitara启动硬件基础

在讨论 U-Boot 与 BSP 之前,必须先理解一个更底层的问题:SoC 从“断电”到“能执行第一条指令”之间,硬件究竟做了什么。Sitara(如 AM335x、AM437x、AM57x 等)的启动并不是软件单方面决定的,而是由复位序列、电源时序、时钟建立、启动模式引脚采样共同“投票”决定的。任何一环不满足,ROM Code 都不会进入你预期的启动介质。

一、上电复位序列:从电源稳定到 ROM Code 接管

Sitara 的上电过程可以理解为一条严格的时间链。以 AM335x 为例,典型顺序是:外部电源输入 → PMIC 上电 → 各电源轨按序建立(Core、MPU、DDR、IO、RTC 等)→ 复位信号释放 → 系统时钟(如 24MHz 晶振)稳定 → PLL 锁定 → ROM Code 开始执行。这里的关键是“顺序”和“稳定”:如果 1.8V IO 轨先于 1.1V Core 轨建立,或复位释放时晶振尚未起振,SoC 可能停在未定义状态,表现为“上电无反应”或“反复重启”。

复位源也需要区分。Sitara 通常有上电复位(POR)、外部复位(nRESET)、看门狗复位和软件复位。POR 会复位整个芯片,包括 RTC 域以外的所有逻辑;而看门狗复位可能只复位部分域。调试时若发现“每次跑几秒就重启”,应优先检查看门狗是否被 ROM Code 或早期 SPL 使能,而不是怀疑 DDR 初始化。

二、与 PMIC 的交互:电源轨、时序与 I2C 控制

Sitara 常搭配 TPS65217、TPS65910、TPS65218 等 PMIC。PMIC 与 SoC 的交互主要有三条路径:一是电源轨输出,二是使能/复位信号,三是 I2C 控制接口。上电时,PMIC 依据自身 OTP 或引脚配置输出各轨;SoC 的 POR 引脚通常由 PMIC 的 PGOOD 信号驱动,只有所有关键轨都在容差内,PGOOD 才释放复位。

在 U-Boot 阶段,PMIC 还承担动态调压任务。例如 DVFS 需要根据 MPU 频率调整 VDD_MPU:低频时 0.95V,高频时 1.1V。这通过 I2C 写 PMIC 寄存器完成。若 I2C 地址或寄存器偏移写错,表现为“频率切换后死机”或“电压读回不对”。因此 BSP 中 PMIC 的 I2C 地址、电压档位表、上电时序参数必须与原理图一致。

Sitara 上电复位与 PMIC 交互时序示意 外部电源输入 PMIC TPS65217 / TPS65910 VDD_CORE 1.1V VDD_MPU 0.95~1.1V VDD_DDR 1.35V VDD_IO 1.8V/3.3V PGOOD 复位释放 Sitara SoC ROM Code PLL / 时钟 I2C 动态调压 / 状态读取 SYSBOOT[15:0] 启动模式采样引脚 启动介质选择 NAND/eMMC/SD/QSPI/UART 注:电源轨建立顺序与 PGOOD 释放时机由 PMIC OTP 和原理图共同决定

三、启动介质硬件接口与引脚配置要点

Sitara 支持多种启动介质,ROM Code 在复位释放后会读取 SYSBOOT 引脚电平,决定从哪个接口加载第一段代码。不同介质的硬件接口和引脚配置差异很大,下面分别说明。

NAND(GPMC 接口)。NAND 通过 GPMC 总线连接,关键引脚包括 GPMC_AD[15:0] 数据/地址复用、GPMC_CSn、GPMC_WEn、GPMC_REn、GPMC_WAIT 以及 CLE/ALE 控制。硬件设计要点:数据线需等长,WAIT 引脚必须上拉或下拉到确定电平,否则 ROM Code 可能等待超时。BSP 中需要配置 GPMC 时序参数(如 CS 建立/保持时间、WE/RE 脉冲宽度),这些参数与 NAND 芯片的 tCLS、tWP、tRP 直接相关。

eMMC/SD(MMC 接口)。eMMC 和 SD 共用 MMC 控制器,但引脚配置不同。SD 卡需要 CD(卡检测)和 WP(写保护)引脚,eMMC 则通常固定焊接,不需要 CD。关键信号包括 MMC_CLK、MMC_CMD、MMC_DAT[7:0](eMMC 8 位)或 DAT[3:0](SD 4 位)。硬件要点:CLK 走线要短且远离干扰源,DAT 线需上拉(SD 规范要求 10k~50k),eMMC 的 RST_n 引脚若未使用需妥善处理。ROM Code 会以低速模式(如 400kHz)初始化,再切换到高速模式。

QSPI(SPI 接口)。QSPI 使用 SPI0 或 SPI1 控制器,关键引脚为 SPI_CLK、SPI_D0、SPI_D1、SPI_CSn,四线模式还需 SPI_D2、SPI_D3。硬件要点:QSPI Flash 的 WP# 和 HOLD# 引脚需上拉到 VCC,否则可能无法写入或读取。ROM Code 默认以单线模式读取前几个字节,再根据 Flash 的 QE 位切换到四线模式。BSP 中需要配置 SPI 模式(CPOL/CPHA)和时钟分频。

UART(串口启动)。UART 启动是“最后手段”,用于量产或救砖。关键引脚为 UART0_RXD 和 UART0_TXD,波特率通常为 115200。ROM Code 会通过 UART 发送握手字符(如 'C'),等待主机发送 SPL 镜像。硬件要点:UART 电平需匹配(3.3V 或 1.8V),若使用 USB 转串口,需确认 TX/RX 交叉连接。UART 启动速度慢,但无需外部存储介质,适合调试。

引脚配置检查清单(示例):
  • 确认 SYSBOOT 引脚在复位释放时电平正确,且不被其他外设拉偏。
  • NAND:检查 GPMC_WAIT 上拉/下拉,确认 CLE/ALE 连接正确。
  • eMMC/SD:确认 DAT 线上拉电阻已焊接,CLK 走线长度匹配。
  • QSPI:确认 WP# 和 HOLD# 上拉到 VCC,QE 位已置位。
  • UART:确认 TX/RX 交叉,波特率与 ROM Code 一致。

四、从硬件到软件:BSP 中需要关注的配置点

在 BSP 的 board 目录中,通常会有一个 board_init() 或 spl_board_init() 函数,负责早期硬件初始化。这里需要关注:PMIC 的 I2C 初始化、DDR 控制器配置、引脚复用(pinmux)设置、时钟树配置。以 AM335x 为例,mux.c 中会定义每个引脚的复用模式,例如将 GPMC_AD0 配置为 GPMC 数据线而非 GPIO。若 pinmux 写错,表现为“启动介质识别不到”或“DDR 初始化失败”。

另一个关键点是启动介质的“优先级”。ROM Code 会按照 SYSBOOT 引脚定义的顺序依次尝试,若第一个介质失败,会尝试下一个。因此,如果 eMMC 启动失败但 SD 卡能启动,说明 SYSBOOT 配置可能把 SD 放在了 eMMC 之前,或者 eMMC 的硬件连接有问题。调试时可以用示波器观察 MMC_CLK 是否有波形,判断 ROM Code 是否尝试了该接口。

最后,电源管理 IC 的交互不仅影响启动,还影响低功耗模式。在 U-Boot 中,可以通过 pmic 命令读取 PMIC 寄存器,确认电压档位。例如 pmic read 0x24 0x0 可以读取 TPS65217 的 STATUS 寄存器。若读回值异常,应检查 I2C 总线上是否有其他设备冲突,或 PMIC 的 I2C 地址是否被误改。