2. AM64x硬件基础

AM64x 是 TI Sitara 系列中面向工业控制、电机驱动、边缘网关与实时通信的异构多核处理器。做 BSP 开发时,不能只把它当成一颗“跑 Linux 的 ARM 芯片”,而要把它理解为一个由多个计算域、外设域、存储域和电源域组成的片上系统。只有先建立硬件资源地图,后续的 U-Boot 移植、设备树配置、驱动适配和低功耗调试才有依据。

一、处理器子系统:异构多核的分工

AM64x 内部并非单一 CPU,而是由多个处理单元协同工作。典型配置包括双核 Cortex-A53、双核 Cortex-R5F、一个 Cortex-M4F,以及用于实时控制和安全启动的辅助模块。A53 运行 Linux,负责应用、网络、文件系统和人机界面;R5F 通常运行 RTOS 或裸机程序,承担电机控制、EtherCAT、Profinet 等硬实时任务;M4F 则常用于低功耗管理、传感器预处理或安全监控。

这些核心之间通过片上互连和 Mailbox、RPMSG、共享内存进行通信。BSP 开发中,最关键的是明确“哪个核心负责什么”,并在设备树和资源分区中把外设、内存、中断分别划给不同核心,避免 Linux 与 RTOS 争抢同一外设。

AM64x 异构多核与外设资源关系 Cortex-A53 ×2 Linux / 应用 / 网络 DDR、MMC、USB、以太网 Cortex-R5F ×2 RTOS / 实时控制 ICSSG、PWM、ADC Cortex-M4F 低功耗 / 安全监控 传感器预处理 片上互连 / Mailbox / RPMSG / 共享内存 核间通信与资源隔离通道 外设域 UART / I2C / SPI CAN-FD / GPIO 存储域 DDR4 / OSPI eMMC / SD 时钟域 PLL / 分频器 外设时钟门控 电源域 PMIC / 电压域 低功耗状态

二、外设资源与典型接口

AM64x 的外设资源非常丰富,BSP 中经常打交道的包括:多路 UART、I2C、SPI、CAN-FD、GPIO、ADC、PWM、eQEP,以及用于工业以太网的 ICSSG 子系统。ICSSG 可配置为双千兆以太网口,并支持 EtherCAT、Profinet、EtherNet/IP 等工业协议,是 AM64x 区别于普通应用处理器的重要特征。

此外,AM64x 还集成了 USB 2.0、PCIe、MMC/SD、OSPI、GPMC 等接口。做板级支持时,需要根据原理图确认每个外设的引脚复用、时钟来源、复位控制和中断号,再写入设备树。下面列出常见外设与 BSP 关注点:

外设/模块 典型用途 BSP 关注点
UART 调试串口、RS485 引脚复用、波特率时钟、DMA 通道
I2C PMIC、EEPROM、传感器 上拉电阻、总线速率、设备地址
CAN-FD 工业总线通信 收发器使能、终端电阻、时钟精度
ICSSG EtherCAT、Profinet 固件加载、PRU 配置、PHY 连接
ADC/PWM 电机控制、采样 触发源、通道映射、实时核归属
OSPI 启动 Flash 启动模式、时序参数、分区布局

三、内存映射:地址空间就是资源边界

AM64x 采用统一内存映射,不同核心看到的外设地址基本一致,但访问权限和缓存属性不同。A53 运行 Linux 时使用 MMU 建立虚拟地址到物理地址的映射;R5F 和 M4F 通常直接使用物理地址或 MPU 配置。BSP 中必须清楚几个关键区域:DDR 起始地址、各外设寄存器基地址、共享内存区域、以及保留给 RTOS 或安全固件的内存块。

例如,在设备树中经常看到 reg = <0x00 0x8000000 0x00 0x8000000>; 这样的描述,表示某外设寄存器位于物理地址 0x08000000,长度为 128MB。若把 Linux 可管理内存与 R5F 使用的共享内存重叠,系统运行后会出现随机崩溃或数据错乱。因此,内存映射不是“查表填地址”,而是资源划分和隔离设计。

/* 典型内存保留示例 */
reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;

    r5f_shared: r5f-shared@a0000000 {
        reg = <0x00 0xa0000000 0x00 0x00100000>;
        no-map;
    };
};

四、时钟与电源管理:让系统跑得稳、耗得低

AM64x 的时钟树由外部晶振、PLL、分频器和门控组成。BSP 启动早期就要完成时钟初始化,否则 UART 无法输出、DDR 无法训练、MMC 无法识别。Linux 侧通过 Common Clock Framework 管理时钟,设备树中用 clocks 和 clock-names 描述外设时钟来源。若某个外设时钟频率配错,表现为通信误码、采样偏差或设备超时。

电源管理方面,AM64x 支持多种低功耗状态,并通过 PMIC 控制电压域。Linux 的 CPUFreq、CPUIdle 和 Runtime PM 会动态调整频率与电源状态。做工业产品时,要特别注意:实时核所在电源域不能被 Linux 随意关闭;某些外设在低功耗下会丢失上下文,需要在驱动中实现保存与恢复。

调试建议:遇到外设不工作时,按“时钟 → 复位 → 引脚复用 → 电源域 → 中断”的顺序排查,比直接改驱动更高效。
常见误区:只关注 Linux 设备树,忽略 R5F/M4F 的资源配置;或把共享内存放在 Linux 可分配区域,导致核间通信偶发失败。AM64x 是多核系统,任何外设和内存都要先明确归属。

五、案例复盘:一个 CAN-FD 不通的排查过程

某项目在 AM64x 上调试 CAN-FD,Linux 下 ip link set can0 up 成功,但发送无波形。排查发现:设备树中 CAN 控制器时钟引用错误,实际时钟被配成 80MHz,而收发器要求 20MHz;同时引脚复用只配了 TX,未配 RX。修正时钟分频和 pinmux 后,CAN 通信恢复正常。这个案例说明,AM64x 硬件基础中的时钟、引脚、外设三者必须联动检查。

掌握处理器子系统、外设资源、内存映射、时钟与电源管理这四块内容后,再看 U-Boot、Linux 内核和设备树,就能把“软件配置”与“硬件事实”对应起来。BSP 开发的质量,很大程度上取决于对这颗芯片资源边界的理解是否准确。