1. A64芯片概览:全志A64芯片特性、应用场景、与A系列其他芯片对比

各位同学,咱们今天聊聊A64这颗芯片。说实话,我第一次拿到A64的datasheet时,第一反应是——全志终于把Cortex-A53塞进自家芯片了。这玩意儿在当年可是个分水岭。

先说说A64的基本定位。它是一颗64位四核处理器,基于ARM Cortex-A53架构。你可能会问,为什么不是A72或者A75?嗯,这里有个成本与功耗的平衡问题。A53虽然性能不如大核,但胜在省电、发热低,非常适合做消费电子产品的SoC。

1.1 核心特性

我个人习惯把A64的特性分成三块来看:计算能力、多媒体处理、接口扩展。

特性类别 具体参数 我的评价
CPU 4×Cortex-A53 @ 1.152GHz 够用,别指望跑服务器负载
GPU Mali-400 MP2 @ 600MHz 老将了,但2D加速还行
视频解码 H.265 4K@30fps, H.264 4K@30fps 当年这个规格很能打
显示输出 HDMI 2.0, LVDS, eDP, MIPI DSI 接口丰富,做平板很合适
内存支持 DDR3/DDR3L/LPDDR3, 最大4GB 注意LPDDR3的布线要求
存储接口 eMMC 5.0, SD 3.0, NAND Flash eMMC启动速度比NAND快很多

我在项目中遇到过一件事:有客户用A64做广告机,结果发现4K视频播放时偶尔卡顿。排查了半天,发现是DDR频率没配好。A64的内存控制器对时序很敏感,你如果偷懒用自动训练,有时候会翻车。

1.2 应用场景

A64这颗芯片,说白了就是为「大屏交互」设计的。我见过它出现在这些地方:

  • 平板电脑:10寸左右,Android系统,这是A64的主战场
  • 智能音箱:带屏幕那种,比如带屏智能音箱
  • 广告机/数字标牌:1080P或4K内容循环播放
  • 车载后装:中控娱乐系统,注意温度范围
  • POS机/收银机:双屏异显场景很常见

我的小建议:如果你做的是电池供电的产品,记得把CPU频率调到1GHz以下。A64在1.152GHz满载时,功耗大概能到2.5W左右。散热没做好,外壳会烫手。

1.3 与A系列其他芯片对比

全志的A系列芯片,从A10、A13、A20、A31、A33一直到A64,我基本都摸过。你想想看,A10是单核Cortex-A8,发热大得能煎鸡蛋。A64算是A系列里比较成熟的一代。

我整理了一个对比表,方便你理解定位差异:

芯片型号 CPU架构 制程 最大分辨率 我的评价
A33 4×Cortex-A7 28nm 1080P 省电,但性能偏弱
A64 4×Cortex-A53 40nm 4K@30fps 均衡,性价比之选
A83T 8×Cortex-A7 28nm 2K 核心多但单核弱
H6 4×Cortex-A53 28nm 4K@60fps A64的升级版,支持HDMI 2.0a

为什么A64在2024年还有人用?说白了,就是便宜、稳定、资料多。你如果去翻全志的论坛,A64的BSP和补丁是最全的。我曾经帮一个客户从A33迁移到A64,改bootloader花了三天,但后续开发顺畅很多。

注意:A64的40nm制程是个双刃剑。静态功耗比28nm芯片高,待机时电流偏大。如果你做电池产品,记得加深度休眠策略。我曾经有个项目,待机电流多了20mA,查了两天才发现是DRAM没进自刷新模式。

1.4 启动流程初探

既然咱们是Bootloader课程,得提前聊聊A64的启动方式。A64上电后,首先执行的是BROM(Boot ROM)里的代码。这段代码固化在芯片内部,你改不了。

BROM会按顺序尝试启动介质:

  1. SD卡(优先检测)
  2. eMMC(Boot分区)
  3. NAND Flash
  4. SPI NOR Flash(部分版本支持)

BROM加载的第一段代码叫SPL(Secondary Program Loader),大小限制在32KB以内。嗯,你没看错,就32KB。你要在这32KB里完成时钟初始化、DRAM初始化、加载U-Boot到内存。空间非常紧张,我习惯用汇编写SPL,C语言编译出来体积太大。

// A64 BROM启动流程伪代码
void boot_rom_main() {
    // 1. 初始化最基本的硬件(PLL、时钟、GPIO)
    low_level_init();
    
    // 2. 尝试从SD卡读取SPL
    if (sd_card_detect()) {
        spl = load_from_sd(0x0000, 32 * 1024);
        if (spl_valid(spl)) {
            jump_to_spl(spl);
        }
    }
    
    // 3. 如果SD卡失败,尝试eMMC
    if (emmc_detect()) {
        spl = load_from_emmc_boot_partition();
        if (spl_valid(spl)) {
            jump_to_spl(spl);
        }
    }
    
    // 4. 最后尝试NAND
    // ...
    
    // 5. 所有介质都失败,进入FEL模式(USB下载)
    enter_fel_mode();
}

关键点:A64的BROM支持FEL模式。如果你把启动介质搞坏了,按住板子上的FEL键再上电,芯片就会进入USB下载模式。这时候你可以用sunxi-fel工具直接往DRAM里写程序。我调试bootloader时经常用这招,比反复烧写eMMC快多了。

好了,这一章先给你搭个框架。A64的整体轮廓你应该心里有数了。下一章咱们深入BROM,看看那32KB的SPL到底该怎么写。到时候我会拿一个实际项目里的SPL代码来拆解,保证干货满满。