i.MX8MP 的地址表需要先选定观察者:A53、M7、SDMA 和调试端口看到的地址并不总相同。同一块存储器可以有多个入口;一个地址窗口也可能只解码少量寄存器。查到地址之后,还要确认所有权、访问权限、时钟、电源、缓存属性和软件映射。
本文以 NXP RM Rev.3 第 2 章为地址表基础,结合 MCUXpresso SDK MCUX_2.16.000 与 Linux 6.8 的实际驱动说明使用方法。保留原文的 A53、M7、SDMA、AIPS1~5、DAP、Audio DSP 和 HDMI 表项。表中的大小按闭区间 end-start+1 计算,统一使用 KiB/MiB/GiB;这只是区间长度,不代表整个窗口都可读写。
1. 先区分四种地址
跳转到“1. 先区分四种地址”| 地址种类 | 含义 | 常见误用 |
|---|---|---|
| CPU 本地地址 | 当前处理器发出的地址,包括 M7 TCM 和别名入口 | 把 M7 的 0x20000000 直接当作 A53 的 DTCM 地址 |
| 系统物理地址 | SoC 总线视角下的资源位置 | 在 Linux 用户态把物理地址强转为普通指针 |
| DMA 地址 | 某 DMA 主控可使用的设备地址,经驱动映射/转换获得 | 将 CPU 虚拟指针或 SDMA 内部外设窗口当作 DMA 地址 |
| 软件虚拟地址 | MMU/操作系统提供给 CPU 的映射 | 认为数值和物理地址相同就具有相同访问属性 |
Linux 驱动应取得资源并使用 devm_platform_ioremap_resource() 等接口映射 MMIO,按寄存器语义使用 readl()/writel();DMA 缓冲则通过 DMA API 管理。M7 裸机通常直接使用设备头定义,但仍需检查权限、时钟和跨核所有权。volatile 只约束特定编译器访问,不能完成地址转换、互斥或缓存一致性。
VPU 表项的手册冲突
跳转到“VPU 表项的手册冲突”RM Rev.3 的第 2 章本身存在几条 VPU 区间重叠与容量不一致,原笔记继承了这些问题。下面的表保留所列起止地址,并给出区间算术长度,将这些行标记为“VPU 待核定”;不能据此认定完整区间都由该 IP 解码。
| 表项 | 手册所列起止地址 | 算术长度 | 可交叉确认的内容 |
|---|---|---|---|
| VPU G1 | 0x38300000…0x3830ffff | 64 KiB | Linux 6.8 设备树也使用该 64 KiB 资源 |
| VPU G2 | 0x38310000…0x3841ffff | 1088 KiB | Linux 6.8 只声明基址 0x38310000、长度 64 KiB |
| VC8000E encoder | 0x38320000…0x3842ffff | 1088 KiB | VPU 章节确认基址,不能从这里推导合法末地址 |
| VPU BLK_CTRL | 0x38330000…0x383fffff | 832 KiB | Linux 6.8 声明基址 0x38330000、长度 0x100 |
| VPU | 0x38340000…0x384fffff | 1792 KiB | 与上述多行重叠,不能当作额外独立 2 MiB RAM |
驱动声明的资源长度也不一定等于完整硬件解码范围。因此这里不猜测新的终点;实现驱动时采用所选 BSP 的匹配驱动与该模块寄存器定义。
2. Cortex-A53 / 系统地址图
跳转到“2. Cortex-A53 / 系统地址图”| 起始地址 | 结束地址 | 区域大小 | 描述 |
|---|---|---|---|
| DDR内存区域 | |||
0x100000000 | 0x23fffffff | 5 GiB | DDR Memory (除M7外的所有模块) |
0x40000000 | 0xffffffff | 3 GiB | DDR 系统窗口(M7 主窗口上限见 M7 表) |
| 保留区域 | |||
0x3f000000 | 0x3fffffff | 16 MiB | Reserved |
0x3e000000 | 0x3effffff | 16 MiB | Reserved |
| DDR控制器(DDRC) | |||
0x3dc00000 | 0x3dffffff | 4 MiB | DDR PHY (Broadcast) |
0x3d800000 | 0x3dbfffff | 4 MiB | DDR PERF_MON |
0x3d400000 | 0x3d7fffff | 4 MiB | DDR CTL |
0x3d100000 | 0x3d3fffff | 3 MiB | Reserved |
0x3d000000 | 0x3d0fffff | 1 MiB | DDR BLK_CTRL |
0x3c000000 | 0x3cffffff | 16 MiB | DDR PHY |
| 专用处理器 | |||
0x3b000000 | 0x3bffffff | 16 MiB | Audio DSP |
0x3a000000 | 0x3affffff | 16 MiB | Reserved |
| 中断控制器和加速器 | |||
0x38900000 | 0x39ffffff | 23 MiB | Reserved |
0x38800000 | 0x388fffff | 1 MiB | GIC REG (中断控制器) |
0x38700000 | 0x387fffff | 1 MiB | Reserved |
0x38500000 | 0x386fffff | 2 MiB | NPU (神经网络处理器) |
| 视频处理单元(VPU) | |||
0x38340000 | 0x384fffff | 1792 KiB | VPU(VPU 待核定:见本节前说明) |
0x38330000 | 0x383fffff | 832 KiB | VPU BLK_CTRL(VPU 待核定:见本节前说明) |
0x38320000 | 0x3842ffff | 1088 KiB | VPU VC8000E Encoder(VPU 待核定:见本节前说明) |
0x38310000 | 0x3841ffff | 1088 KiB | VPU G2 Decoder(VPU 待核定:见本节前说明) |
0x38300000 | 0x3830ffff | 64 KiB | VPU G1 Decoder(VPU 待核定:见本节前说明) |
| USB控制器 | |||
0x38200000 | 0x382fffff | 1 MiB | USB2 REG |
0x38100000 | 0x381fffff | 1 MiB | USB1 REG |
| 图形处理器(GPU) | |||
0x38010000 | 0x380fffff | 960 KiB | Reserved |
0x38008000 | 0x3800ffff | 32 KiB | GPU2D REG |
0x38000000 | 0x38007fff | 32 KiB | GPU3D REG |
| QSPI Flash接口 | |||
0x36000000 | 0x37ffffff | 32 MiB | QSPI RX Buffers Reserved |
0x34000000 | 0x35ffffff | 32 MiB | QSPI1 RX Buffer |
| PCIe控制器 | |||
0x33c00000 | 0x33ffffff | 4 MiB | PCIe REG Reserved |
0x33800000 | 0x33bfffff | 4 MiB | PCIe1 REG |
| QSPI和DMA | |||
0x33100000 | 0x337fffff | 7 MiB | Reserved |
0x33010000 | 0x330fffff | 960 KiB | Reserved |
0x33008000 | 0x3300ffff | 32 KiB | QSPI1 TX Buffer |
0x33000000 | 0x33007fff | 32 KiB | APBH DMA |
| 外设总线(AIPS) | |||
0x32c00000 | 0x32ffffff | 4 MiB | AIPS-4 |
0x32900000 | 0x32bfffff | 3 MiB | Reserved |
0x32800000 | 0x328fffff | 1 MiB | Reserved |
0x32700000 | 0x327fffff | 1 MiB | Reserved |
0x32600000 | 0x326fffff | 1 MiB | Reserved |
0x32500000 | 0x325fffff | 1 MiB | Reserved |
0x32400000 | 0x324fffff | 1 MiB | Reserved |
0x32300000 | 0x323fffff | 1 MiB | Reserved |
0x32200000 | 0x322fffff | 1 MiB | Reserved |
0x32100000 | 0x321fffff | 1 MiB | Reserved |
0x32000000 | 0x320fffff | 1 MiB | Reserved |
0x31000000 | 0x31ffffff | 16 MiB | Reserved |
0x30c00000 | 0x30ffffff | 4 MiB | AIPS-5 |
0x30800000 | 0x30bfffff | 4 MiB | AIPS-3 |
0x30400000 | 0x307fffff | 4 MiB | AIPS-2 |
0x30000000 | 0x303fffff | 4 MiB | AIPS-1 |
| 其他外设和存储 | |||
0x29000000 | 0x2fffffff | 112 MiB | Reserved |
0x28000000 | 0x28ffffff | 16 MiB | A53 / DAP (调试接口) |
0x20000000 | 0x27ffffff | 128 MiB | Reserved |
0x18000000 | 0x1fffffff | 128 MiB | PCIe-1 |
0x08000000 | 0x17ffffff | 256 MiB | QSPI |
0x04000000 | 0x07ffffff | 64 MiB | Reserved |
0x01000000 | 0x03ffffff | 48 MiB | Reserved |
| 片上RAM(OCRAM) | |||
0x00c00000 | 0x00ffffff | 4 MiB | Reserved |
0x00b00000 | 0x00bfffff | 1 MiB | Reserved |
0x00a00000 | 0x00afffff | 1 MiB | OCRAM Reserved |
0x00990000 | 0x009fffff | 448 KiB | Reserved |
0x00900000 | 0x0098ffff | 576 KiB | OCRAM (片上RAM) |
| 紧耦合存储器(TCM) | |||
0x00840000 | 0x008fffff | 768 KiB | Reserved |
0x00820000 | 0x0083ffff | 128 KiB | TCM Reserved |
0x00800000 | 0x0081ffff | 128 KiB | DTCM (数据TCM) |
0x007e0000 | 0x007fffff | 128 KiB | ITCM (指令TCM) |
0x007c0000 | 0x007dffff | 128 KiB | Reserved |
| 安全存储 | |||
0x00700000 | 0x007bffff | 768 KiB | Reserved |
0x00600000 | 0x006fffff | 1 MiB | Reserved |
0x00500000 | 0x005fffff | 1 MiB | Reserved |
0x00400000 | 0x004fffff | 1 MiB | Reserved |
0x00200000 | 0x003fffff | 2 MiB | Reserved |
0x00190000 | 0x001fffff | 448 KiB | Reserved |
0x00189000 | 0x0018ffff | 28 KiB | OCRAM_S Reserved |
0x00180000 | 0x00188fff | 36 KiB | OCRAM_S(状态保持 RAM) |
0x00110000 | 0x0017ffff | 448 KiB | Reserved |
0x00108000 | 0x0010ffff | 32 KiB | CAAM Reserved |
0x00100000 | 0x00107fff | 32 KiB | CAAM (加密加速器安全RAM) |
| Boot ROM | |||
0x00040000 | 0x000fffff | 768 KiB | Reserved |
0x0003f000 | 0x0003ffff | 4 KiB | Boot ROM - Protected 4KB |
0x00000000 | 0x0003efff | 252 KiB | Boot ROM (启动ROM) |
两个 DDR 窗口合计提供最大 8 GiB 地址空间:低段 0x40000000…0xffffffff 为 3 GiB,高段 0x100000000…0x23fffffff 为 5 GiB。板上实装容量、启动固件内存训练结果及 Linux 保留区决定实际可用内存;低段表中的“所有模块”概述也不能覆盖 M7 的具体访问限制。
0x3c000000 一带是 DDR PHY、控制器和监测寄存器,不是 DDR 数据存储。GPU/VPU/NPU 的寄存器窗口同样不等于可放帧缓冲或模型的内存。Reserved 区域应保持不访问;是否返回总线错误、超时或其他结果依具体路径而定。
OCRAM 为 576 KiB,OCRAM_S 为 36 KiB 状态保持 RAM;TCM 的系统入口是 0x007e0000 的 ITCM 和 0x00800000 的 DTCM。它们虽紧耦合到 M7,也有系统侧入口,不能写成“A53 永远无法访问”。
3. Cortex-M7 地址图与别名
跳转到“3. Cortex-M7 地址图与别名”| 起始地址 | 结束地址 | 区域大小 | 描述 |
|---|---|---|---|
| 高地址保留区 | |||
0xe0100000 | 0xffffffff | 511 MiB | Reserved |
0xe0000000 | 0xe00fffff | 1 MiB | CM7 PPB (Private Peripheral Bus) |
0xd8000000 | 0xdfffffff | 128 MiB | Reserved |
| 外部接口 | |||
0xd0000000 | 0xd7ffffff | 128 MiB | PCIe-1 |
0xc0000000 | 0xcfffffff | 256 MiB | QSPI Flash |
| DDR主内存 | |||
0x40000000 | 0xbfffffff | 2 GiB | DDR Memory (M7可访问2GB) |
| DDR控制器 | |||
0x3f000000 | 0x3fffffff | 16 MiB | Reserved |
0x3e000000 | 0x3effffff | 16 MiB | Reserved |
0x3dc00000 | 0x3dffffff | 4 MiB | DDR PHY (Broadcast) |
0x3d800000 | 0x3dbfffff | 4 MiB | DDR PERF_MON |
0x3d400000 | 0x3d7fffff | 4 MiB | DDR CTL |
0x3d100000 | 0x3d3fffff | 3 MiB | Reserved |
0x3d000000 | 0x3d0fffff | 1 MiB | DDR BLK_CTRL |
0x3c000000 | 0x3cffffff | 16 MiB | DDR PHY |
| 专用处理器 | |||
0x3b000000 | 0x3bffffff | 16 MiB | Audio DSP |
0x3a000000 | 0x3affffff | 16 MiB | Reserved |
| 中断控制器和加速器 | |||
0x38900000 | 0x39ffffff | 23 MiB | Reserved |
0x38800000 | 0x388fffff | 1 MiB | GIC REG(M7 自身中断使用 NVIC) |
0x38700000 | 0x387fffff | 1 MiB | Reserved |
0x38500000 | 0x386fffff | 2 MiB | NPU |
| 视频处理单元(VPU) | |||
0x38340000 | 0x384fffff | 1792 KiB | VPU(VPU 待核定:见本节前说明) |
0x38330000 | 0x383fffff | 832 KiB | VPU BLK_CTRL(VPU 待核定:见本节前说明) |
0x38320000 | 0x3842ffff | 1088 KiB | VPU VC8000E Encoder(VPU 待核定:见本节前说明) |
0x38310000 | 0x3841ffff | 1088 KiB | VPU G2 Decoder(VPU 待核定:见本节前说明) |
0x38300000 | 0x3830ffff | 64 KiB | VPU G1 Decoder(VPU 待核定:见本节前说明) |
| USB和GPU | |||
0x38200000 | 0x382fffff | 1 MiB | USB2 REG |
0x38100000 | 0x381fffff | 1 MiB | USB1 REG |
0x38010000 | 0x380fffff | 960 KiB | Reserved |
0x38008000 | 0x3800ffff | 32 KiB | GPU2D REG |
0x38000000 | 0x38007fff | 32 KiB | GPU3D REG |
| QSPI和PCIe寄存器 | |||
0x36000000 | 0x37ffffff | 32 MiB | QSPI RX Buffers Reserved |
0x34000000 | 0x35ffffff | 32 MiB | QSPI1 RX Buffer |
0x33c00000 | 0x33ffffff | 4 MiB | PCIe REG Reserved |
0x33800000 | 0x33bfffff | 4 MiB | PCIe1 REG |
| QSPI和DMA | |||
0x33100000 | 0x337fffff | 7 MiB | Reserved |
0x33010000 | 0x330fffff | 960 KiB | Reserved |
0x33008000 | 0x3300ffff | 32 KiB | QSPI1 TX Buffer |
0x33000000 | 0x33007fff | 32 KiB | APBH DMA |
| 外设总线(AIPS) | |||
0x32c00000 | 0x32ffffff | 4 MiB | AIPS-4 |
0x32900000 | 0x32bfffff | 3 MiB | Reserved |
0x32800000 | 0x328fffff | 1 MiB | Reserved |
0x32700000 | 0x327fffff | 1 MiB | Reserved |
0x32600000 | 0x326fffff | 1 MiB | Reserved |
0x32500000 | 0x325fffff | 1 MiB | Reserved |
0x32400000 | 0x324fffff | 1 MiB | Reserved |
0x32300000 | 0x323fffff | 1 MiB | Reserved |
0x32200000 | 0x322fffff | 1 MiB | Reserved |
0x32100000 | 0x321fffff | 1 MiB | Reserved |
0x32000000 | 0x320fffff | 1 MiB | Reserved |
0x31000000 | 0x31ffffff | 16 MiB | Reserved |
0x30c00000 | 0x30ffffff | 4 MiB | AIPS-5 |
0x30800000 | 0x30bfffff | 4 MiB | AIPS-3 |
0x30400000 | 0x307fffff | 4 MiB | AIPS-2 |
0x30000000 | 0x303fffff | 4 MiB | AIPS-1 |
| 调试和保留区 | |||
0x29000000 | 0x2fffffff | 112 MiB | Reserved |
0x28000000 | 0x28ffffff | 16 MiB | A53/ DAP |
0x24000000 | 0x27ffffff | 64 MiB | Reserved |
0x22000000 | 0x23ffffff | 32 MiB | Reserved |
0x21000000 | 0x21ffffff | 16 MiB | Reserved |
0x20400000 | 0x20ffffff | 12 MiB | Reserved |
| M7别名区域(SYSTEM) | |||
0x20300000 | 0x203fffff | 1 MiB | CM7 ALIAS SYSTEM Reserved |
0x20290000 | 0x202fffff | 448 KiB | Reserved |
0x20200000 | 0x2028ffff | 576 KiB | OCRAM |
0x20190000 | 0x201fffff | 448 KiB | Reserved |
0x20189000 | 0x2018ffff | 28 KiB | Reserved |
0x20180000 | 0x20188fff | 36 KiB | OCRAM_S |
0x20110000 | 0x2017ffff | 448 KiB | Reserved |
0x20108000 | 0x2010ffff | 32 KiB | Reserved |
0x20100000 | 0x20107fff | 32 KiB | CAAM (32K secure RAM) |
0x20060000 | 0x200fffff | 640 KiB | Reserved |
0x20020000 | 0x2005ffff | 256 KiB | Reserved |
0x20000000 | 0x2001ffff | 128 KiB | DTCM (数据TCM) |
0x1ffe0000 | 0x1fffffff | 128 KiB | Reserved(RM 第 2 章标注;加载器别名差异见正文) |
| M7别名区域(CODE) | |||
0x10000000 | 0x1ffdffff | 262016 KiB | CM7 ALIAS CODE(具体转换依实现,见正文) |
0x08000000 | 0x0fffffff | 128 MiB | QSPI Code alias |
| 低地址保留 | |||
0x04000000 | 0x07ffffff | 64 MiB | Reserved |
0x01000000 | 0x03ffffff | 48 MiB | Reserved |
0x00c00000 | 0x00ffffff | 4 MiB | Reserved |
0x00b00000 | 0x00bfffff | 1 MiB | Reserved |
| 片上RAM(OCRAM) | |||
0x00a00000 | 0x00afffff | 1 MiB | OCRAM Reserved |
0x00990000 | 0x009fffff | 448 KiB | Reserved |
0x00900000 | 0x0098ffff | 576 KiB | OCRAM |
| TCM保留区 | |||
0x00828000 | 0x008fffff | 864 KiB | Reserved |
0x00820000 | 0x00827fff | 32 KiB | Reserved |
0x00800000 | 0x0081ffff | 128 KiB | Reserved |
0x007e0000 | 0x007fffff | 128 KiB | Reserved |
0x007d8000 | 0x007dffff | 32 KiB | Reserved |
0x00700000 | 0x007d7fff | 864 KiB | Reserved |
| 更多保留区 | |||
0x00600000 | 0x006fffff | 1 MiB | Reserved |
0x00500000 | 0x005fffff | 1 MiB | Reserved |
0x00400000 | 0x004fffff | 1 MiB | Reserved |
0x00200000 | 0x003fffff | 2 MiB | Reserved |
0x00190000 | 0x001fffff | 448 KiB | Reserved |
| 安全RAM | |||
0x00189000 | 0x0018ffff | 28 KiB | OCRAM_S Reserved |
0x00180000 | 0x00188fff | 36 KiB | OCRAM_S |
0x00110000 | 0x0017ffff | 448 KiB | Reserved |
0x00108000 | 0x0010ffff | 32 KiB | CAAM Reserved |
0x00100000 | 0x00107fff | 32 KiB | CAAM (32K secure RAM) |
0x00020000 | 0x000fffff | 896 KiB | Reserved |
| 指令TCM | |||
0x00000000 | 0x0001ffff | 128 KiB | ITCM (指令TCM) |
M7 的 DDR 主窗口为 0x40000000…0xbfffffff,共 2 GiB。M7 的 32 位地址空间还要容纳设备、PPB、QSPI、PCIe 和别名入口,所以不能把“32 位可表达 4 GiB”直接当成“能访问 4 GiB DDR”。
M7 在本地通过 0x00000000…0x0001ffff 访问 128 KiB ITCM,通过 0x20000000…0x2001ffff 访问 128 KiB DTCM。适合把关键代码、栈或热点数据放入 TCM,但“紧耦合、可预测”不是“任何访问都零周期”。容量、链接布局、启动搬运、DMA 可达性和并发访问都需要确认。
PPB 包含 NVIC、SysTick、SCB、MPU 等本核系统资源。M7 中断由 NVIC 处理;表中出现 GIC 窗口不表示 M7 应通过 GIC 收取自己的外设中断。
已确认的转换与实现范围
跳转到“已确认的转换与实现范围”| M7 本地窗口 | 系统窗口起点 | 转换 | MCUX_2.16.000 helper 覆盖范围 |
|---|---|---|---|
ITCM 0x00000000 | 0x007e0000 | 加 0x007e0000 | 128 KiB |
DTCM 0x20000000 | 0x00800000 | 减 0x1f800000 | 128 KiB |
OCRAM alias 0x20200000 | 0x00900000 | 减 0x1f900000 | 仅前 128 KiB;硬件表为 576 KiB |
OCRAM_S alias 0x20180000 | 0x00180000 | 减 0x20000000 | 仅前 32 KiB;硬件表为 36 KiB |
这里特意区分 helper 的实现范围和硬件容量。该 SDK 的 MEMORY_ConvertMemoryMapAddress() 对范围外地址直接原样返回;“返回了一个值”不表示已验证这个地址是合法 DMA 目标。
DDR CODE alias 更要看启动软件:Linux 6.8 的 imx_rproc 为 i.MX8MP 复用的地址转换表,把 0x10000000 入口映射到系统 0x40000000。某些 NXP U-Boot 版本的 bootaux 转换表采用不同假设。不能把其中一个实现的偏移写成所有固件通用公式。
RM 第 2 章把 0x1ffe0000…0x1fffffff 标为 Reserved,而部分 U-Boot 的主机侧加载表包含相关 TCM 别名处理;加载器接受一个地址不等于已经证明 M7 可以直接按该地址访问。此处保留手册行并标注差异,实际固件采用对应版本已验证的链接地址和加载路径。
下面示例只接受上表中 SDK helper 明确处理的四个窗口,而且检查整个非空范围没有跨出窗口。它只做数值转换,不证明 DMA 主控有访问权,也不处理 Linux 虚拟地址或 DDR CODE alias。
#include <stdbool.h>#include <stddef.h>#include <stdint.h>
bool m7_known_local_span_to_system(uint32_t local, size_t bytes, uint32_t *system){ static const struct { uint32_t local_base; uint32_t system_base; uint32_t size; } windows[] = { { 0x00000000U, 0x007e0000U, 0x00020000U }, { 0x20000000U, 0x00800000U, 0x00020000U }, { 0x20200000U, 0x00900000U, 0x00020000U }, { 0x20180000U, 0x00180000U, 0x00008000U } }; if (system == NULL || bytes == 0U || bytes > UINT32_MAX) { return false; } for (size_t i = 0; i < sizeof(windows) / sizeof(windows[0]); ++i) { if (local < windows[i].local_base) { continue; } uint32_t offset = local - windows[i].local_base; if (offset < windows[i].size && bytes <= windows[i].size - offset) { *system = windows[i].system_base + offset; return true; } } return false;}跨核共享时,还应从双方都能访问且已保留的 RAM 分配缓冲区,为控制字段与数据制定所有权协议;写完、完成 cache clean 和发布顺序后再通知对端,接收方取得所有权后再按映射需要 invalidate。MU 事件、SEMA4 锁与 cache 操作分别解决通知、互斥和可见性,不能互相替代。
4. SDMA 的外设视图
跳转到“4. SDMA 的外设视图”以下两表是 SDMA 外设端口视图,不是 CPU 可以直接解引用的 AIPS 系统地址,也不是 DMA 通道编号。表中的 0x6000 只说明 UART1 位于相应视图的入口,不能直接把它填入任意 SDK/API 的源地址字段。
SDMA1
跳转到“SDMA1”| 地址 | 外设 | 用途 |
|---|---|---|
| 0xF000 | SPBA | 智能外设总线仲裁器 |
| 0xE000 | Reserved | 保留 |
| 0xD000 | CAN_FD2 | CAN FD总线2 |
| 0xC000 | CAN_FD1 | CAN FD总线1 |
| 0xB000 | Reserved | 保留 |
| 0xA000 | Reserved | 保留 |
| 0x9000 | UART2 | 串口2 |
| 0x8000 | UART3 | 串口3 |
| 0x7000 | Reserved | 保留 |
| 0x6000 | UART1 | 串口1 |
| 0x5000 | Reserved | 保留 |
| 0x4000 | eCSPI3 | 增强型SPI总线3 |
| 0x3000 | eCSPI2 | 增强型SPI总线2 |
| 0x2000 | eCSPI1 | 增强型SPI总线1 |
| 0x1000 | Reserved | 保留 |
| 0x0000 | Reserved | 保留 |
SDMA2 / SDMA3
跳转到“SDMA2 / SDMA3”| 地址 | 外设 | 用途 |
|---|---|---|
| 0xF000 | SPBA | 智能外设总线仲裁器 |
| 0xE000 | Reserved | 保留 |
| 0xD000 | Reserved | 保留 |
| 0xC000 | AUDIO XCVR RX (eARC) | 音频收发器接收(增强音频回传通道) |
| 0xB000 | HDMI TX AUDLNK MST | HDMI发送音频链路主控 |
| 0xA000 | PDM (MICFIL) | 脉冲密度调制(麦克风滤波器) |
| 0x9000 | ASRC | 异步采样率转换器 |
| 0x8000 | SAI7 | 同步音频接口7 |
| 0x7000 | Reserved | 保留 |
| 0x6000 | SAI6 | 同步音频接口6 |
| 0x5000 | SAI5 | 同步音频接口5 |
| 0x4000 | Reserved | 保留 |
| 0x3000 | SAI3 | 同步音频接口3 |
| 0x2000 | SAI2 | 同步音频接口2 |
| 0x1000 | SAI1 | 同步音频接口1 |
| 0x0000 | Reserved | 保留 |
CPU 系统地址中的 UART1 基址为 0x30860000;真正搬运的是其数据寄存器,地址、传输宽度、水位和握手请求应由匹配驱动处理。外设出现在地址表中,也不自动意味着已有对应请求源、脚本和驱动支持。例如表中的 CAN-FD 可见性不能单独证明可以照搬 UART 的 SDMA 接收方案。
SDMA 是带脚本处理能力的控制器,具有 32 个虚拟通道和 48 个请求输入。脚本、事件到通道映射、buffer descriptor 和优先级共同决定传输。通道 0 通常负责脚本装载和内部上下文操作;原文把 UART 接收固定放到 channel 0,并给每个通道虚构一个 SDMA1_CH0_IRQHandler(),不是可直接使用的 i.MX8MP 驱动接口。
UART 接收与循环音频的正确工作流
跳转到“UART 接收与循环音频的正确工作流”Linux 外设驱动先按设备树连接请求 DMA 通道,再配置从设备参数,映射缓冲区,准备描述符,提交并 issue pending,最后在完成通知中归还/重用缓冲。连续音频常用 cyclic DMA;停止时必须等待 DMA 与回调结束后再释放内存。dmaengine_submit() 只是提交,不能替代 dma_async_issue_pending()。
M7 项目应采用该 SDK 的真实 SDMA/外设驱动和示例,确认脚本固件、请求源、通道分配、系统地址转换和 cache 维护。原文 sdma_channel_config_t、SDMA_ConfigChannel() 等未绑定到实际版本的代码只表达了流程,不能当作完整 SDK 示例。
双缓冲时,一个缓冲由 DMA 使用,另一个才由 CPU 填充。需要在对应 period 完成后切换所有权;不能仅把 current_buffer 翻转就假定 DMA 已切到另一地址。计算采样帧、通道数、样本位宽、period 字节数时要使用同一套单位。
传输速率与 CPU 开销分别计算
跳转到“传输速率与 CPU 开销分别计算”115200 bit/s、8N1 下传输 1 MiB 的理想最短时间为:
1 MB(十进制)也约需 86.81 s,原来的“100 ms”相差数百倍。DMA 不改变线速;CPU 占用百分比必须实测,不能预填“轮询 100%、中断 50~80%、DMA 小于 1%”。800 MHz×100 ms 为 8000 万周期,也不能直接称为 8 亿条指令。
SDMA2/3 可以服务录音、播放、ASRC 等不同通路,但共享音频时钟和内存仍可能相互影响。智能音箱、网关等应用应按持续带宽、period 截止时间、溢出/欠载恢复及功耗测量来评估收益。
5. AIPS 外设窗口
跳转到“5. AIPS 外设窗口”AIPS 把系统互连连接到较低带宽的外设寄存器空间;SPBA 对相关外设访问进行仲裁。分组有利于组织访问和电源/时钟控制,但 AIPS 组号并不是“此组永远属于某一个核”的安全策略。
多数表项以 64 KiB 槽位安排,不代表每个外设实现了 64 KiB 寄存器。CAAM 等还有更大的窗口,HDMI 子系统又细分成 4 KiB、2 KiB 等范围。表中保留的省略号表示原概览合并显示的保留槽,不能把省略处当作可分配资源。
AIPS1:系统控制、GPIO、GPT、WDOG
跳转到“AIPS1:系统控制、GPIO、GPT、WDOG”| 起始地址 | 结束地址 | 外设 | 大小 | 功能说明 |
|---|---|---|---|---|
| 系统控制和安全 | ||||
0x303f0000 | 0x303fffff | Reserved | 64 KiB | 保留 |
0x303e0000 | 0x303effff | CSU | 64 KiB | 中央安全单元 |
0x303d0000 | 0x303dffff | RDC | 64 KiB | 资源域控制器 |
0x303c0000 | 0x303cffff | SEMAPHORE2 | 64 KiB | RDC 信号量块(区别于通用 SEMA4) |
0x303b0000 | 0x303bffff | SEMAPHORE1 | 64 KiB | RDC 信号量块(区别于通用 SEMA4) |
| 电源和时钟管理 | ||||
0x303a0000 | 0x303affff | GPC | 64 KiB | 通用电源控制器 |
0x30390000 | 0x3039ffff | SRC | 64 KiB | 系统复位控制器 |
0x30380000 | 0x3038ffff | CCM | 64 KiB | 时钟控制模块 |
0x30370000 | 0x3037ffff | SNVS_HP | 64 KiB | 安全非易失性存储(高功率) |
0x30360000 | 0x3036ffff | ANA_PLL | 64 KiB | 模拟PLL(锁相环) |
0x30350000 | 0x3035ffff | OCOTP_CTRL | 64 KiB | 一次性可编程熔丝控制 |
| 引脚和配置 | ||||
0x30340000 | 0x3034ffff | IOMUXC_GPR | 64 KiB | IO复用通用寄存器 |
0x30330000 | 0x3033ffff | IOMUXC | 64 KiB | IO复用控制 |
0x30320000 | 0x3032ffff | Reserved | 64 KiB | 保留 |
0x30310000 | 0x3031ffff | Reserved | 64 KiB | 保留 |
0x30300000 | 0x3030ffff | Reserved | 64 KiB | 保留 |
| 定时器 | ||||
0x302f0000 | 0x302fffff | GPT3 | 64 KiB | 通用定时器3 |
0x302e0000 | 0x302effff | GPT2 | 64 KiB | 通用定时器2 |
0x302d0000 | 0x302dffff | GPT1 | 64 KiB | 通用定时器1 |
0x302c0000 | 0x302cffff | Reserved | 64 KiB | 保留 |
0x302b0000 | 0x302bffff | Reserved | 64 KiB | 保留 |
| 看门狗和传感器 | ||||
0x302a0000 | 0x302affff | WDOG3 | 64 KiB | 看门狗3 |
0x30290000 | 0x3029ffff | WDOG2 | 64 KiB | 看门狗2 |
0x30280000 | 0x3028ffff | WDOG1 | 64 KiB | 看门狗1 |
0x30270000 | 0x3027ffff | ANA_OSC | 64 KiB | 模拟振荡器 |
0x30260000 | 0x3026ffff | TMU (ANA_TSENSOR) | 64 KiB | 温度监控单元 |
0x30250000 | 0x3025ffff | Reserved | 64 KiB | 保留 |
| GPIO | ||||
0x30240000 | 0x3024ffff | GPIO5 | 64 KiB | 通用IO端口5 |
0x30230000 | 0x3023ffff | GPIO4 | 64 KiB | 通用IO端口4 |
0x30220000 | 0x3022ffff | GPIO3 | 64 KiB | 通用IO端口3 |
0x30210000 | 0x3021ffff | GPIO2 | 64 KiB | 通用IO端口2 |
0x30200000 | 0x3020ffff | GPIO1 | 64 KiB | 通用IO端口1 |
| 总线配置 | ||||
0x301f0000 | 0x301fffff | AIPS1_Configuration | 64 KiB | AIPS1配置寄存器 |
0x30100000 | 0x301effff | Global Module Enable | 960 KiB | 全局模块使能保留 |
0x30000000 | 0x300fffff | Reserved | 1 MiB | 保留 |
AIPS2:PWM、GPT、计数器与监测
跳转到“AIPS2:PWM、GPT、计数器与监测”| 起始地址 | 结束地址 | 外设 | 大小 | 功能说明 |
|---|---|---|---|---|
| 性能监控和QoS | ||||
0x307f0000 | 0x307fffff | QoSC | 64 KiB | 服务质量控制 |
0x307e0000 | 0x307effff | Reserved | 64 KiB | 保留 |
0x307d0000 | 0x307dffff | PERFMON2 | 64 KiB | 性能监控器2 |
0x307c0000 | 0x307cffff | PERFMON1 | 64 KiB | 性能监控器1 |
0x307b0000 | 0x307bffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 定时器扩展 | ||||
0x30700000 | 0x3070ffff | GPT4 | 64 KiB | 通用定时器4 |
0x306f0000 | 0x306fffff | GPT5 | 64 KiB | 通用定时器5 |
0x306e0000 | 0x306effff | GPT6 | 64 KiB | 通用定时器6 |
0x306d0000 | 0x306dffff | Reserved | 64 KiB | 保留 |
| 系统计数器 | ||||
0x306c0000 | 0x306cffff | System_Counter_CTRL | 64 KiB | 系统计数器控制 |
0x306b0000 | 0x306bffff | System_Counter_CMP | 64 KiB | 系统计数器比较 |
0x306a0000 | 0x306affff | System_Counter_RD | 64 KiB | 系统计数器读取 |
| PWM | ||||
0x30690000 | 0x3069ffff | PWM4 | 64 KiB | 脉宽调制4 |
0x30680000 | 0x3068ffff | PWM3 | 64 KiB | 脉宽调制3 |
0x30670000 | 0x3067ffff | PWM2 | 64 KiB | 脉宽调制2 |
0x30660000 | 0x3066ffff | PWM1 | 64 KiB | 脉宽调制1 |
0x30650000 | 0x3065ffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 总线配置 | ||||
0x305f0000 | 0x305fffff | AIPS2_configuration | 64 KiB | AIPS2配置寄存器 |
0x30500000 | 0x305effff | Global Module Enable | 960 KiB | 全局模块使能保留 |
0x30400000 | 0x304fffff | Reserved | 1 MiB | 保留 |
AIPS3:通用通信、存储、网络及 A53–M7 MU
跳转到“AIPS3:通用通信、存储、网络及 A53–M7 MU”| 起始地址 | 结束地址 | 外设 | 大小 | 功能说明 |
|---|---|---|---|---|
| 网络和存储 | ||||
0x30bf0000 | 0x30bfffff | ENET2_TSN | 64 KiB | 以太网2(时间敏感网络) |
0x30be0000 | 0x30beffff | ENET1 | 64 KiB | 以太网1 |
0x30bd0000 | 0x30bdffff | SDMA1 | 64 KiB | 智能DMA1 |
0x30bc0000 | 0x30bcffff | Reserved | 64 KiB | 保留 |
0x30bb0000 | 0x30bbffff | QSPI | 64 KiB | 四线SPI Flash控制器 |
0x30ba0000 | 0x30baffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| SD/MMC | ||||
0x30b60000 | 0x30b6ffff | uSDHC3 | 64 KiB | SD/MMC主机控制器3 |
0x30b50000 | 0x30b5ffff | uSDHC2 | 64 KiB | SD/MMC主机控制器2 |
0x30b40000 | 0x30b4ffff | uSDHC1 | 64 KiB | SD/MMC主机控制器1 |
0x30b30000 | 0x30b3ffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| I2C总线 | ||||
0x30ae0000 | 0x30aeffff | I2C6 | 64 KiB | I2C总线6 |
0x30ad0000 | 0x30adffff | I2C5 | 64 KiB | I2C总线5 |
| 多核通信 | ||||
0x30ac0000 | 0x30acffff | SEMAPHORE_HS | 64 KiB | 通用硬件信号量 SEMA4 |
0x30ab0000 | 0x30abffff | MU_1_B (A53, M7) | 64 KiB | 消息单元1B(A53-M7) |
0x30aa0000 | 0x30aaffff | MU_1_A (A53, M7) | 64 KiB | 消息单元1A(A53-M7) |
0x30a90000 | 0x30a9ffff | Reserved | 64 KiB | 保留 |
0x30a80000 | 0x30a8ffff | IRQ_STEER | 64 KiB | 中断路由(音频处理器) |
0x30a70000 | 0x30a7ffff | Reserved | 64 KiB | 保留 |
| 串口和I2C | ||||
0x30a60000 | 0x30a6ffff | UART4 | 64 KiB | 串口4 |
0x30a50000 | 0x30a5ffff | I2C4 | 64 KiB | I2C总线4 |
0x30a40000 | 0x30a4ffff | I2C3 | 64 KiB | I2C总线3 |
0x30a30000 | 0x30a3ffff | I2C2 | 64 KiB | I2C总线2 |
0x30a20000 | 0x30a2ffff | I2C1 | 64 KiB | I2C总线1 |
0x30a10000 | 0x30a1ffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 总线配置 | ||||
0x309f0000 | 0x309fffff | AIPS3_Configuration | 64 KiB | AIPS3配置寄存器 |
0x30940000 | 0x309effff | Global Module Enable 1 | 704 KiB | 全局模块使能保留 |
| 安全加密 | ||||
0x30900000 | 0x3093ffff | CAAM | 256 KiB | 加密加速和保证模块 |
| SPBA总线外设 | ||||
0x308f0000 | 0x308fffff | SPBA1 | 64 KiB | 智能外设总线仲裁器1 |
0x308e0000 | 0x308effff | Reserved | 64 KiB | 保留 |
| CAN总线 | ||||
0x308d0000 | 0x308dffff | FlexCAN2 | 64 KiB | CAN FD总线2 |
0x308c0000 | 0x308cffff | FlexCAN1 | 64 KiB | CAN FD总线1 |
0x308b0000 | 0x308bffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 串口 | ||||
0x30890000 | 0x3089ffff | UART2 | 64 KiB | 串口2 |
0x30880000 | 0x3088ffff | UART3 | 64 KiB | 串口3 |
0x30870000 | 0x3087ffff | Reserved | 64 KiB | 保留 |
0x30860000 | 0x3086ffff | UART1 | 64 KiB | 串口1 |
0x30850000 | 0x3085ffff | Reserved | 64 KiB | 保留 |
| SPI | ||||
0x30840000 | 0x3084ffff | eCSPI3 | 64 KiB | 增强SPI3 |
0x30830000 | 0x3083ffff | eCSPI2 | 64 KiB | 增强SPI2 |
0x30820000 | 0x3082ffff | eCSPI1 | 64 KiB | 增强SPI1 |
0x30810000 | 0x3081ffff | Reserved | 64 KiB | 保留(多个) |
0x30800000 | 0x3080ffff | Reserved | 64 KiB | 保留 |
AIPS4:媒体、显示与高速接口控制
跳转到“AIPS4:媒体、显示与高速接口控制”| 起始地址 | 结束地址 | 外设 | 大小 | 功能说明 |
|---|---|---|---|---|
| 显示和多媒体 | ||||
0x32ff0000 | 0x32ffffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
0x32fd0000 | 0x32fdffff | HDMI_TX | 64 KiB | HDMI发送器 |
0x32fc0000 | 0x32fcffff | (HDMI_TX子系统) | 64 KiB | HDMI TX子系统详细映射 |
0x32fb0000 | 0x32fbffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 安全和高速IO | ||||
0x32f80000 | 0x32f8ffff | TZASC | 64 KiB | TrustZone地址空间控制器 |
0x32f70000 | 0x32f7ffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
0x32f10000 | 0x32f1ffff | HSIO BLK_CTL | 64 KiB | 高速IO块控制 |
0x32f00000 | 0x32f0ffff | PCIE_PHY1 | 64 KiB | PCIe PHY1 |
0x32ef0000 | 0x32efffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 媒体处理 | ||||
0x32ec0000 | 0x32ecffff | MEDIA BLK_CTL | 64 KiB | 媒体块控制 |
0x32eb0000 | 0x32ebffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
| 显示接口 | ||||
0x32e90000 | 0x32e9ffff | LCDIF2 | 64 KiB | LCD接口2 |
0x32e80000 | 0x32e8ffff | LCDIF1 | 64 KiB | LCD接口1 |
0x32e70000 | 0x32e7ffff | Reserved | 64 KiB | 保留 |
| MIPI接口 | ||||
0x32e60000 | 0x32e6ffff | MIPI_DSI1 | 64 KiB | MIPI显示串行接口1 |
0x32e50000 | 0x32e5ffff | MIPI_CSI2 | 64 KiB | MIPI摄像头串行接口2 |
0x32e40000 | 0x32e4ffff | MIPI_CSI1 | 64 KiB | MIPI摄像头串行接口1 |
| 图像处理 | ||||
0x32e30000 | 0x32e3ffff | IPS Dewarp | 64 KiB | 图像去畸变处理 |
0x32e20000 | 0x32e2ffff | ISP2 | 64 KiB | 图像信号处理器2 |
0x32e10000 | 0x32e1ffff | ISP1 | 64 KiB | 图像信号处理器1 |
0x32e00000 | 0x32e0ffff | ISI | 64 KiB | 图像传感器接口 |
| 总线配置 | ||||
0x32df0000 | 0x32dfffff | AIPS4_configuration | 64 KiB | AIPS4配置寄存器 |
0x32d00000 | 0x32deffff | Global Module Enable | 960 KiB | 全局模块使能保留 |
0x32c00000 | 0x32cfffff | Reserved | 1 MiB | 保留 |
AIPS5:音频、DMA 与 DSP 通信
跳转到“AIPS5:音频、DMA 与 DSP 通信”| 起始地址 | 结束地址 | 外设 | 大小 | 功能说明 |
|---|---|---|---|---|
0x30ff0000 | 0x30ffffff | Reserved | 64 KiB | 保留(大量) |
| … | … | … | … | … |
| 多核通信(音频DSP) | ||||
0x30e90000 | 0x30e9ffff | MU_3_B (M7, Audio) | 64 KiB | 消息单元3B(M7-音频DSP) |
0x30e80000 | 0x30e8ffff | MU_3_A (M7, Audio) | 64 KiB | 消息单元3A(M7-音频DSP) |
0x30e70000 | 0x30e7ffff | MU_2_B (A53, Audio) | 64 KiB | 消息单元2B(A53-音频DSP) |
0x30e60000 | 0x30e6ffff | MU_2_A (A53, Audio) | 64 KiB | 消息单元2A(A53-音频DSP) |
| 增强DMA(eDMA) | ||||
0x30e50000 | 0x30e5ffff | eDMA Channels[31:16] | 64 KiB | eDMA通道16-31(4KB/通道) |
0x30e40000 | 0x30e4ffff | eDMA Channels[15:0] | 64 KiB | eDMA通道0-15(4KB/通道) |
0x30e30000 | 0x30e3ffff | eDMA Management | 64 KiB | eDMA管理页 |
| 音频子系统 | ||||
0x30e20000 | 0x30e2ffff | AUDIO BLK_CTRL | 64 KiB | 音频块控制 |
0x30e10000 | 0x30e1ffff | SDMA2 | 64 KiB | 智能DMA2 |
0x30e00000 | 0x30e0ffff | SDMA3 | 64 KiB | 智能DMA3 |
| 总线配置 | ||||
0x30df0000 | 0x30dfffff | AIPS5_Configuration | 64 KiB | AIPS5配置寄存器 |
0x30d00000 | 0x30deffff | Global Module Enable 1 | 960 KiB | 全局模块使能保留 |
| SPBA音频外设 | ||||
0x30cf0000 | 0x30cfffff | SPBA2 | 64 KiB | 智能外设总线仲裁器2 |
0x30ce0000 | 0x30ceffff | Reserved | 64 KiB | 保留(多个) |
| … | … | … | … | … |
0x30cc0000 | 0x30ccffff | AUDIO XCVR RX (eARC) | 64 KiB | 音频收发器RX(增强ARC) |
0x30cb0000 | 0x30cbffff | HDMI TX AUDLNK MSTR | 64 KiB | HDMI发送音频链路主控 |
0x30ca0000 | 0x30caffff | PDM (MICFIL) | 64 KiB | 脉冲密度调制(麦克风) |
0x30c90000 | 0x30c9ffff | ASRC | 64 KiB | 异步采样率转换器 |
| 数字音频接口(SAI) | ||||
0x30c80000 | 0x30c8ffff | SAI7 | 64 KiB | 同步音频接口7 |
0x30c70000 | 0x30c7ffff | Reserved | 64 KiB | 保留 |
0x30c60000 | 0x30c6ffff | SAI6 | 64 KiB | 同步音频接口6 |
0x30c50000 | 0x30c5ffff | SAI5 | 64 KiB | 同步音频接口5 |
0x30c40000 | 0x30c4ffff | Reserved | 64 KiB | 保留 |
0x30c30000 | 0x30c3ffff | SAI3 | 64 KiB | 同步音频接口3 |
0x30c20000 | 0x30c2ffff | SAI2 | 64 KiB | 同步音频接口2 |
0x30c10000 | 0x30c1ffff | SAI1 | 64 KiB | 同步音频接口1 |
0x30c00000 | 0x30c0ffff | Reserved | 64 KiB | 保留 |
从地址表走到实际驱动
跳转到“从地址表走到实际驱动”GPIO 点灯需要先确认板上连接、pad ALT 与电气属性,再设置方向和输出值;GPIO1 的基址并不能告诉你某个 LED 接在哪一位。UART 同样需要 pinmux、时钟、波特率、FIFO、中断/DMA 和错误处理。Linux 下应使用 GPIO/UART 子系统接口;不要让 M7 同时改动 Linux 已使用的实例。
CCM 的 root/CCGR 布局应采用 MIMX8ML8 的 fsl_clock 定义;原文使用类似其他 i.MX 系列的 CCGR0 通用结构,不能仅换基址就适配。IOMUXC 的 ALT 编号取决于具体 pad;GPC 请求和握手也需要电源域所有权与超时处理。
MU1 连接 A53/M7,MU2 连接 A53/Audio DSP,MU3 连接 M7/Audio DSP。普通 MU 每侧有四个 32 bit TX/RX 寄存器,发送前检查可写状态,接收按协议读取并确认。大数据保存在共享内存,MU 传递事件或元信息,不能用 A53 GIC 的核间 SGI 代替发往 M7 的 MU 通知。
通用 SEMA4(0x30ac0000)有 16 个 gate。正确的尝试加锁包含写入锁请求并读回确认;SEMA4_GetLockProc() 或读取 gate 为 0 只是在观察状态。原“等待空闲→直接进入临界区”的代码有竞争窗口。释放必须由持有者执行,异常恢复也要避免强制解锁仍在使用的资源。AIPS1 的 RDC 信号量块与通用 SEMA4 不应混为一谈。
RDC 配置主控域与外设/内存策略,CSU 和安全属性进一步参与安全访问判断。将 M7 改到某个域号,不会自动为它开放所有 UART,也不会自动阻止 A53;要核对两边实际权限与锁定状态。
6. DAP 与 CoreSight 调试地址图
跳转到“6. DAP 与 CoreSight 调试地址图”| 起始地址 | 结束地址 | 大小 | 分配 |
|---|---|---|---|
| CoreSight调试基础设施 | |||
0x28c0a000 | 0x28ffffff | 4056 KiB | Reserved |
0x28c09000 | 0x28c09fff | 4 KiB | HUGO_CXCTI1 (交叉触发接口1) |
0x28c08000 | 0x28c08fff | 4 KiB | HUGO_CXCTI0 (交叉触发接口0) |
0x28c07000 | 0x28c07fff | 4 KiB | CXTPIU (跟踪端口接口单元) |
0x28c06000 | 0x28c06fff | 4 KiB | CXTMC_ETR (嵌入式跟踪路由器) |
0x28c05000 | 0x28c05fff | 4 KiB | ATB_REPLICATOR (跟踪总线复制器) |
0x28c04000 | 0x28c04fff | 4 KiB | CXTMC_ETB (嵌入式跟踪缓冲) |
0x28c03000 | 0x28c03fff | 4 KiB | HUGO_ATB_FUNNEL (跟踪漏斗) |
0x28c02000 | 0x28c02fff | 4 KiB | CXTSGEN_READ (时间戳读取) |
0x28c01000 | 0x28c01fff | 4 KiB | CXTSGEN_CTRL (时间戳控制) |
0x28c00000 | 0x28c00fff | 4 KiB | HUGO ROM Table (根ROM表) |
| 保留区域 | |||
0x28b50000 | 0x28bfffff | 704 KiB | Reserved |
0x28b40000 | 0x28b4ffff | 64 KiB | Reserved |
0x28b30000 | 0x28b3ffff | 64 KiB | Reserved |
0x28b20000 | 0x28b2ffff | 64 KiB | Reserved |
0x28b10000 | 0x28b1ffff | 64 KiB | Reserved |
0x28a50000 | 0x28b0ffff | 768 KiB | Reserved |
0x28a40000 | 0x28a4ffff | 64 KiB | Reserved |
0x28a30000 | 0x28a3ffff | 64 KiB | Reserved |
0x28a20000 | 0x28a2ffff | 64 KiB | Reserved |
0x28a10000 | 0x28a1ffff | 64 KiB | Reserved |
0x28950000 | 0x28a0ffff | 768 KiB | Reserved |
0x28940000 | 0x2894ffff | 64 KiB | Reserved |
0x28930000 | 0x2893ffff | 64 KiB | Reserved |
0x28920000 | 0x2892ffff | 64 KiB | Reserved |
0x28910000 | 0x2891ffff | 64 KiB | Reserved |
0x28850000 | 0x2890ffff | 768 KiB | Reserved |
0x28840000 | 0x2884ffff | 64 KiB | Reserved |
0x28830000 | 0x2883ffff | 64 KiB | Reserved |
0x28820000 | 0x2882ffff | 64 KiB | Reserved |
0x28810000 | 0x2881ffff | 64 KiB | Reserved |
| 音频处理器调试 | |||
0x28800000 | 0x2880ffff | 64 KiB | Audio Processor Debug |
0x28750000 | 0x287fffff | 704 KiB | Reserved |
| Cortex-A53 CPU3 调试接口 | |||
0x28740000 | 0x2874ffff | 64 KiB | MP4-CPU3 Trace (跟踪) |
0x28730000 | 0x2873ffff | 64 KiB | MP4-CPU3 PMU (性能监控单元) |
0x28720000 | 0x2872ffff | 64 KiB | MP4-CPU3 CTI (交叉触发接口) |
0x28710000 | 0x2871ffff | 64 KiB | MP4-CPU3 Debug (调试单元) |
0x28650000 | 0x2870ffff | 768 KiB | Reserved |
| Cortex-A53 CPU2 调试接口 | |||
0x28640000 | 0x2864ffff | 64 KiB | MP4-CPU2 Trace |
0x28630000 | 0x2863ffff | 64 KiB | MP4-CPU2 PMU |
0x28620000 | 0x2862ffff | 64 KiB | MP4-CPU2 CTI |
0x28610000 | 0x2861ffff | 64 KiB | MP4-CPU2 Debug |
0x28550000 | 0x2860ffff | 768 KiB | Reserved |
| Cortex-A53 CPU1 调试接口 | |||
0x28540000 | 0x2854ffff | 64 KiB | MP4-CPU1 Trace |
0x28530000 | 0x2853ffff | 64 KiB | MP4-CPU1 PMU |
0x28520000 | 0x2852ffff | 64 KiB | MP4-CPU1 CTI |
0x28510000 | 0x2851ffff | 64 KiB | MP4-CPU1 Debug |
0x28450000 | 0x2850ffff | 768 KiB | Reserved |
| Cortex-A53 CPU0 调试接口 | |||
0x28440000 | 0x2844ffff | 64 KiB | MP4-CPU0 Trace |
0x28430000 | 0x2843ffff | 64 KiB | MP4-CPU0 PMU |
0x28420000 | 0x2842ffff | 64 KiB | MP4-CPU0 CTI |
0x28410000 | 0x2841ffff | 64 KiB | MP4-CPU0 Debug |
| 多核ROM表 | |||
0x28400000 | 0x2840ffff | 64 KiB | MP4 ROM Table (A53多核ROM表) |
0x28010000 | 0x283fffff | 4032 KiB | Reserved |
| 根调试接口 | |||
0x28000000 | 0x2800ffff | 64 KiB | DAP ROM Table (调试访问端口根表) |
这里的 MP4 表示四核处理器集群,不是视频文件格式。每个 A53 核的 Debug、CTI、PMU、Trace 具有独立入口,ROM Table 用于组件发现。调试器还要识别 AP、认证、电源和组件状态,不能仅以地址规则推导寄存器协议。
| 组件 | 作用 | 使用边界 |
|---|---|---|
| Debug | 断点、观察点和外部调试控制 | 通用寄存器不是 Debug_base + reg_num*4 的线性数组 |
| CTI | 把选定触发信号在组件间关联 | 需配置输入/输出通道与握手;向基址写 0xf 不会自动让四核同步暂停 |
| PMU | 周期及微架构事件计数 | 事件定义、可用计数器、溢出和内核权限均需确认 |
| Trace 源 | 产生执行跟踪信息 | 输出通常是压缩协议数据,不是直接可读的每条指令文本 |
| ATB funnel | 汇合多路 trace | 不会自动扩展下游带宽 |
| Replicator | 将 trace 分发到不同路径 | 需要可用 sink 和正确通路 |
| TMC/ETB/ETF、ETR | 片上缓冲或路由到系统内存 | 4 KiB 寄存器窗口长度不是 DDR trace 缓冲大小;概述给出的 ETF 内部存储为 4 KiB |
| TPIU | 向外部跟踪接口输出 | 依赖板上引出和探针能力,不保证任意开发板可用 |
原示例中的硬件断点寄存器偏移、OpenOCD target/imx8mp.cfg、GDB 多核输出以及 ETR 的 mem_addr/mem_size/enable 路径没有绑定可验证配置,不应作为照抄命令。应采用实际调试器支持的 SoC/板级脚本,AArch64 目标使用相匹配的 ELF 与调试架构;arm-none-eabi-gdb 不能仅凭名称就保证支持该 A53 调试配置。
性能计数与 trace 分开使用
跳转到“性能计数与 trace 分开使用”Linux 上先检查可用事件,再测量已有程序。例如在权限和事件支持均满足时:
perf listperf stat -e cycles,instructions -- ./myapp这两行是目标 Linux 的使用示例;程序名按实际替换。IPC 为 instructions/cycles。cache miss rate 需要相应缓存层级的 miss 数除以 access 数,不能用 cache-misses/cycles 算百分比,也不能假定通用别名在当前 PMU 上可用或代表同一层级。
CoreSight 的 Linux 框架按 source/link/sink 管理通路,实际 sysfs 接口使用具体设备的 enable_source、enable_sink 等定义。若 perf list 中存在 cs_etm,可按该内核文档选择已枚举的 sink,用 perf 的 AUX trace 路径采集并结合匹配 ELF/解码支持分析。任意从 ETR 导出的原始 trace.bin 并不是 perf.data,不能直接用 perf script -i trace.bin 获得原文那种调用轨迹。
调试时还要考虑暂停对实时外设、看门狗和多核锁的影响;追踪本身也有带宽和存储开销。性能数字应记录测试输入、频率、cache 状态、编译选项与重复次数。
7. Audio DSP 地址图与内存安排
跳转到“7. Audio DSP 地址图与内存安排”| 起始地址 | 结束地址 | 大小 | 分配 |
|---|---|---|---|
0x3b770000 | 0x3bffffff | 8768 KiB | Reserved (保留) |
0x3b740000 | 0x3b76ffff | 192 KiB | Reserved (保留) |
| 系统RAM | |||
0x3b700000 | 0x3b73ffff | 256 KiB | Audio Processor System RAM (OCRAM_A) |
0x3b6f8800 | 0x3b6fffff | 30 KiB | Reserved (保留) |
| 本地紧耦合存储器 | |||
0x3b6f8000 | 0x3b6f87ff | 2 KiB | Audio Processor Local Memory (Instr Ram0) |
0x3b6f0000 | 0x3b6f7fff | 32 KiB | Audio Processor Local Memory (Data Ram1) |
0x3b6e8000 | 0x3b6effff | 32 KiB | Audio Processor Local Memory (Data Ram0) |
0x3b000000 | 0x3b6e7fff | 7072 KiB | Reserved (保留) |
RM 明确该音频处理器为 Cadence HiFi4,不需要写“推测”。其配置包含 32 KiB I-cache、48 KiB D-cache、2 KiB 指令 TCM、64 KiB 数据 TCM(两个 32 KiB bank)和 256 KiB OCRAM_A。上表是系统侧窗口;DSP 固件的本地地址与链接脚本要使用对应 Xtensa 工具链定义,不能让 A53 的 C section 名称直接决定 DSP 放置位置。
RM 列出 nominal 600 MHz、overdrive 800 MHz,并具有每周期四个 32 bit MAC 或八个 16 bit MAC 的能力。在 800 MHz、适用的 16 bit 运算与理想流水条件下,算术峰值可写为 6.4 GMAC/s;32 bit 对应 3.2 GMAC/s。这不是实测编解码性能,也不能推出任意八通道算法都在 1 ms 内完成。
指令和数据分开、多个数据 bank 及 SIMD/VLIW 可以增加并行度,但仍受 bank 冲突、访存、指令安排、数据类型和库实现限制。原文所列“FFT 2 μs、MP3 十路、A53 慢 25~33 倍、DSP 只耗 0.2 W”等缺少可复现测试条件,不作为设备指标。
音频工作流与容量预算
跳转到“音频工作流与容量预算”智能音箱可采用 PDM/SAI 采集→DMA 环形缓冲→波束形成/回声消除/降噪→播放或编码;车载音响可包含多通道混音、均衡、分频与输出;会议终端还需要同步采集、远端参考和编解码。模块顺序、状态保存和延迟预算取决于算法,不能用几个未定义函数拼出已可运行的固件。
例如 48 kHz、八通道、16 bit、每块 128 帧的数据量为 128×8×2=2048 byte,双缓冲为 4096 byte;仅收齐一块就需约 2.667 ms。端到端时延还要加处理、排队与输出,不能同时宣称这个块长实现小于 1 ms 总延迟。
| 存储区 | 可考虑放置 | 必须核对 |
|---|---|---|
| 2 KiB Instr RAM | 经测量选出的短热点代码 | 链接后的实际大小和启动复制,不能保证整个主循环都放得下 |
| Data RAM0 | 当前采样块或工作区 | bank/对齐、容量、DMA 可达性、缓存属性 |
| Data RAM1 | 系数、历史状态或另一工作区 | 同一 bank 内实际总占用;4096 个 float 系数加同量状态已恰好 32 KiB |
| OCRAM_A | 较大的代码、缓冲或状态 | AUDIOMIX 电源、权限及与其他使用者的分配 |
| DDR | 大文件、模型、较大缓冲 | 延迟和带宽、cache、保留区及所有权 |
原例的 .dram1 属性只写在系数声明前,后一个状态数组不会自动继承;section 名称还必须被链接脚本接收,并通过 map 文件确认。SDK、DSP 固件和 Linux 中随意使用相同字符串也不会自动指向同一物理 RAM。
A53 可承担网络、文件和 UI,DSP/M7 承担合适的实时处理;通过 MU 通知共享缓冲时,应传递可校验的长度/偏移/序号,约定双方字节序、内存布局和重启恢复。直接把本核指针塞进消息,或只靠一个 ready 变量,不构成完整跨核协议。
8. HDMI_TX 子系统地址图
跳转到“8. HDMI_TX 子系统地址图”| 起始地址 | 结束地址 | 区域 | 大小 | 描述 |
|---|---|---|---|---|
| HDMI核心控制器 | ||||
0x32fd8000 | 0x32fdffff | HDMI TX Controller & PHY | 32 KiB | 0xFF00-0xFFFF: HDMI TX PHY 0x8000-0xFE31: HDMI TX Controller |
| 安全和保留区 | ||||
0x32fd4000 | 0x32fd7fff | Reserved | 16 KiB | 保留 |
0x32fd3000 | 0x32fd3fff | HDMI TX TRNG | 4 KiB | 真随机数发生器(加密用) |
0x32fd2000 | 0x32fd2fff | Reserved | 4 KiB | 保留 |
0x32fd1000 | 0x32fd1fff | Reserved | 4 KiB | 保留 |
0x32fd0000 | 0x32fd0fff | Reserved | 4 KiB | 保留 |
| 更多保留区 | ||||
0x32fcf000 | 0x32fcffff | Reserved | 4 KiB | 保留 |
0x32fce000 | 0x32fcefff | Reserved | 4 KiB | 保留 |
0x32fcd000 | 0x32fcdfff | Reserved | 4 KiB | 保留 |
0x32fcc000 | 0x32fccfff | Reserved | 4 KiB | 保留 |
0x32fc7000 | 0x32fcbfff | Reserved | 20 KiB | 保留 |
| 显示接口 | ||||
0x32fc6000 | 0x32fc6fff | LCDIF3 | 4 KiB | LCD接口3(连接到HDMI) |
0x32fc5000 | 0x32fc5fff | Reserved | 4 KiB | 保留 |
| 音视频并行接口 | ||||
0x32fc4800 | 0x32fc4fff | HTX_PAI (BLK_CTRL) | 2 KiB | HDMI TX并行音频接口 |
0x32fc4000 | 0x32fc47ff | HTX_PVI (BLK_CTRL) | 2 KiB | HDMI TX并行视频接口 |
| 中断和控制 | ||||
0x32fc3000 | 0x32fc3fff | Reserved | 4 KiB | 保留 |
0x32fc2000 | 0x32fc2fff | IRQ_STEER | 4 KiB | 中断路由控制器 |
0x32fc1000 | 0x32fc1fff | Reserved | 4 KiB | 保留 |
| 块控制 | ||||
0x32fc0000 | 0x32fc0fff | HDMI TX BLK_CTRL | 4 KiB | HDMI TX块控制器 |
HTX_PVI 与 HTX_PAI 的地址区间均为 2 KiB,原表与 RM 对应容量栏写成 4 KiB;这里按明确起止地址更正。HDMI 控制器/PHY 行中的偏移是相对 0x32fd0000 子窗口描述,不能一律相对每个子模块基址再加一遍。
| 组件 | 在显示通路中的作用 |
|---|---|
| LCDIF3 | 从内存读取配置好的帧数据,产生视频时序 |
| HTX_PVI | 并行视频接口及相关控制 |
| HTX_PAI | 并行音频接口及相关控制 |
| HDMI TX controller | 视频/音频打包、链路和协议控制 |
| HDMI PHY | 电气发送、串行化与时钟相关物理层功能 |
| TRNG | 安全功能使用的随机源,不能单独完成 HDCP |
| BLK_CTRL | 子系统时钟/复位等局部控制 |
| IRQ_STEER | 汇集/路由子系统中断,具体掩码和输出需按实例配置 |
实际启动要按驱动的依赖关系完成电源、时钟、复位、显示时序、帧缓冲、PHY 和链路状态设置,并读取接收端 EDID/连接状态选择模式。原文混用较早 LCDIF 的寄存器结构、假定的 HDMI_CTRL/PHY_CTRL 偏移与固定写值,不能直接用于 i.MX8MP。
分辨率、链路带宽和帧缓冲
跳转到“分辨率、链路带宽和帧缓冲”i.MX8MP 数据手册给出的 HDMI 上限为 3840×2160p30、297 MHz 像素时钟;不能因接口称为 HDMI 2.0a 就宣称 4Kp60。VPU 的硬件编码/解码上限也要独立核对,ISP 处理分辨率和 HDMI 输出分辨率不是解码能力。
在 RGB/YCbCr 4:4:4、每色 8 bit 的 TMDS 情况下,每条数据 lane 每像素发送 10 bit:297 MHz 像素时钟对应每 lane 2.97 Gbit/s,三 lane 合计 8.91 Gbit/s。像素时钟、串行数据速率和时钟 lane 不能混写;色深和采样方式改变时应按实际模式重新计算。
帧缓冲先按 stride×height 分配,再考虑多缓冲和对齐:
| 示例格式 | 单帧字节数(无额外 stride padding) | 两帧最低字节数 |
|---|---|---|
| 1920×1080 RGB888 | 6,220,800 | 12,441,600 |
| 1920×1080 XRGB8888 | 8,294,400 | 16,588,800 |
| 3840×2160 XRGB8888 | 33,177,600 | 66,355,200 |
原文以 2 MiB 偏移放置下一张 1080p RGB888 帧,会与前一帧重叠。翻页还要遵守 vblank/提交完成同步,CPU 或解码器写入与显示读取应使用驱动支持的 buffer/fence/DMA 同步;不能写个地址就保证无撕裂。
4K XRGB8888 在 30 fps 时仅一次连续读帧就约 995.3 MB/s,尚未计算 GPU 写入、合成、解码和其他主控流量。这是数据量估算,不能当作实测总带宽。
数据手册列出 32 通道 HDMI 音频输出支持;实际 channel layout、采样率、位宽、压缩格式与 eARC 能力取决于整个链路及驱动。HDCP 还涉及专用协议、密钥和软件配置,不能通过打开 TRNG 和一个 enable 位完成认证;原示例也不能代表已经获得内容保护功能。这里只说明模块边界,不提供未经验证的密钥加载步骤。
9. 使用这份图谱时的核对顺序
跳转到“9. 使用这份图谱时的核对顺序”- 确定发起访问的核/主控和地址类型,再查对应视图。
- 确认芯片料号、板上连接、实际 RAM 容量和 Linux/固件保留区。
- 用当前驱动/BSP 的资源、寄存器结构和地址转换规则核对基址及范围。
- 确认域权限、时钟、电源、复位和所有权,避免两个驱动控制同一资源。
- 为 DMA/共享内存明确缓存、屏障、通知、缓冲生命周期与错误恢复。
- 对频率、吞吐、时延、功耗等结论记录实际测量条件;地址表本身不提供这些保证。
参考资料
跳转到“参考资料”- NXP《i.MX 8M Plus Applications Processor Reference Manual》,Rev.3,第 2 章地址映射、第 4 章 MU/SEMA4/调试、第 7 章 SDMA、音频 DSP 与 HDMI 相关章节。
- NXP 工业级数据手册 IMX8MPIEC,Rev.2.2。
- NXP M7 本地/系统地址转换 helper
- Linux 6.8 i.MX8MP 设备树资源
- Linux 6.8 i.MX remoteproc 地址表
- Linux 6.8 DMAengine 使用文档
- Linux 6.8 CoreSight 文档