ARM(特别是移动)外设寻址和总线架构的解释?

Explaination of ARM (especifically mobile) Peripherals Addressing and Bus architecture?

首先声明我不是该领域的专家,我的问题可能存在误解,在这种情况下,如果您能纠正我并附上资源,我将很高兴,以便我了解更多细节。

我正在尝试找出系统总线的方式以及移动设备中出现的各种设备(例如传感器芯片、wifi/BT SoC、触摸屏等)的寻址方式CPU(以及其他 MCU)。

在 PC 世界中,我们有总线仲裁器将 commands/data 路由到设备,而且,据我所知,地址是硬连线在板上的(如果我错了请纠正我)。但是,在移动世界中,我没有发现任何这种寻址方式的证据;我确实发现 ARM 已经标准化了 Advanced Microcontroller Bus Architecture,但我不知道该标准是否适用于位于同一 SoC(即 Exynos、OMAP)内的组件(cpu-核心) , Snapdragon 等) 或者也影响外围接口。具体来说,我想问的是哪个组件负责为外围设备和 MMIO 地址分配地址?

一个更基本的问题是移动设备架构中是否存在总线管理,或者可能存在某种 "star" 拓扑(其中 CPU 是中心)。

来自 this question I get the impression that these devices are considered as platform devices, i.e., devices that are connected directly to the CPU, and not through a bus. Still, my question is how does the OS knows how to address them? Then other threads, this and this 关于平台 devices/drivers 让我很困惑..

1) ARM不做芯片,他们做的IP卖给做芯片的芯片厂商。 2) 是的,amba/axi 总线是 ARM 到世界的接口。但那是在芯片上,所以由芯片供应商决定连接什么。在芯片供应商中,您可能会发现标准或习惯,这些标准或习惯可能是对于一系列零件,相同的外围设备可能位于相同的地址(相同的 uart 外围设备、相同的 spi 外围设备、时钟树等)。当然,有时同一外设在系列中的不同地址有时不一致。在英特尔 x86 世界中,英特尔制造处理器,他们在历史上制造了许多外围设备,它们是单独的部件,超级 I/O 部件,南北桥,在同一个封装中。 Intel 处理器的成功主要在于反向兼容性,因此您仍然可以在与原始 ibm pc 上访问它相同的地址访问克隆 uart。当你有不同的芯片供应商时,你根本无法做到这一点,arm 大部分情况下不包含外围设备,所以让供应商就事情达成一致根本不会发生。是的,这让人们发疯了,并且 linux 一直处于 arm 的紧急状态,因为它很少在任何平台上工作。添加往往特定于一个芯片或供应商或细微差别,不关心检查添加是否在错误的位置或解决方法或任何不适用于所有地方且不应在所有地方应用的东西。 cortex-ms 已经迈出了一小步,在 arm7tdmi 之前你可以自由地使用你想要的任何地址 space 来做任何事情。 cortex-m 已将 space 划分为一些主要块以及一些内部地址(不仅仅是 cortex-ms,这在许多内核上都是如此)。但除了系统定时器和中断控制器之外,它仍然取决于芯片供应商。 x86 反向兼容性习惯扩展到英特尔之外,因此 pc 在主板供应商之间具有很大的一致性(部分由他们希望在其系统上 运行 即 windows 的软件驱动)。通常是嵌入式的,无论是 arm 还是 mips 或者任何人把东西放在任何地方,软件只是简单地适应,所以 embedded/phone 软件的工作是在开发人员身上 select 正确的驱动程序和调整物理地址等

AMBA/AXI 只是总线标准,如 wishbone 或 isa 或 pci、usb 等。它定义了如何将来自 arm 的处理器连接到 arm 内核,这基本上是在芯片上,然后是芯片供应商添加或从某人那里购买 IP 以将 amba/axi 总线桥接到 pci 或 usb 或 dram 或闪存等,芯片上或芯片外是他们的选择,这是他们的产品。除了一些大块之外,芯片供应商可以自由定义地址 space,当然也可以自由定义外围设备和位置。他们不必使用与其他人相同的 USB IP 或 DRAM IP。

手臂在中间吗?好吧,对于智能 phone 处理器,您往往有一个图形协处理器,所以您必须问问世界上谁拥有 arm、gpu 或其他人? raspberry pi 在某种程度上是这些处理器中的一种,虽然现在更老更慢了,GPU 似乎是世界的中心,而手臂是一个必须分时的侧面固定装置gpu 的总线,谁知道那个总线的 protocol/architecture 是什么,arm 当然是 axi 但整个芯片还是从 arm 到 gpu 端的桥也切换到其他总线协议?关键是你问题的答案是不,没有规则,没有标准,有时手臂在中心,有时不是。取决于芯片和电路板供应商。

对术语不感兴趣也许其他人会回答,但我会说在基本 sim 之外你不会只有一个外围设备(好吧我将使用该术语来表示处理器访问的通用内容)绑定到 amba/axi 公共汽车。您需要一个第一级 amba/axi 接口,然后根据您的设计划分地址 space,然后使用 amba/axi 或您想要的任何总线协议(通常您会适应购买的接口或设计的 IP)。您,芯片供应商决定地址space。作为程序员,您必须阅读芯片供应商或电路板供应商的文档,以找到您想要与之交谈的每件东西的物理地址 space,然后根据以下规则将这些知识编译到您的操作系统或应用程序中该软件或构建系统。

这不是基于 arm 的系统所独有的,您与 mips 和 powerpc 以及您可以以 ip 形式购买的其他内核有同样的问题,无论出于何种原因 arm 已经统治了世界(您的内部或外部有许多 arm 处理器您拥有的每台 x86 计算机,与基于 arm 的处理器相比,x86 处理器的体积极小)。就像盖茨在每个家庭都有台式机一样,很久以前 ARM 有一个 "touch an ARM once a day" 类型的东西来推动他们的产品,现在大多数带有电源开关的东西,特别是带有电池的东西在某个地方都有一个手臂。这对开发人员来说是一场噩梦,因为现在有如此多的 arm 内核,每个芯片供应商和每个家庭,有时甚至家庭中的成员都是不同的,因此作为开发人员,您只需要适应,以模块化形式编写您的东西,混合并匹配模块、更改地址等。制作一个像 windows 这样的二进制文件,例如 运行 无处不在,这对于基于 arm 的产品来说绝不是一个明智的目标。使模块可移植并为每个目标构建模块。

每个 SoC 都将设计为具有自己的(可能是可配置的)内存映射。您需要阅读相关的技术参考手册以获取确切的详细信息。

例如:

Raspeberry pi datasheet (pdf)

OMAP 5 TRM

ARM 和 x86 之间的区别是 PIO。 ARM 上没有特殊指令来访问 I/O 设备。一切都是通过内存映射完成的 I/O.

第二个区别是 ARM(和一般的 RISC)有一个独立的 load/store 单元,与普通逻辑分开。

第三个区别是 ARM 对 architecture and logic core. The first is used by companies like Apple, Samsung, etc who make a clean room version of the cores. For the second set, who actually buy the logic, the ARM CPU will include something from the AMBA 系列均有许可。

ARM 的其他外围设备,如 GIC(Cortex-A 中断控制器)、NVIC(Cortex-M 中断控制器)、L2 控制器、UART 等都将带有 AMBA 类型接口。第 3 方公司(ChipIdea USB 等)也可以为特定的 ARM 总线设置逻辑。

注意维基百科上的 AMBA 记录了几种总线类型。

  1. APB - 低速外设总线;有点像南桥.
  2. AHB - 几个版本(较旧的北桥)。
  3. AXI - 较新的 multi-CPU(主)高速总线。示例 NIC301.
  4. ACE - AXI 扩展。

单个 CPU/core 可能有一个、两个或更多主连接到 AXI 总线。可能有多个内核连接到 AXI 总线。内核的load/store指令获取单元可以使用多个端口将请求分派给单独的从属单元。 SOC 供应商将平衡端口数量与预期的内存带宽需求。 GPU 也经常连同 DDR 从设备一起连接到 AXI 总线。

确实没有100%的标准拓扑;特别是如果您考虑所有可能的未来 ARM 设计。然而,典型的拓扑结构将包括顶层 AXI 和一些 AHB 外围设备。一个或多个第 2 级 APB(总线)将提供对低速外围设备的访问。并非每个 SOC 供应商都愿意花时间重新设计外围设备,而较旧的 AHB 接口速度对于设备来说可能相当不错。

您的问题被标记为 embedded-linux。大多数情况下 Linux 只需要知道物理地址。有时,外围总线控制器可能需要配置。例如,APB 可以配置为允许或禁止用户模式。此配置可以在启动时锁定。一般情况下,Linux并不会太在意总线结构直接。程序员可能已经编写了具有结构知识的驱动程序(如 IRAM 更快等)。

Still, my question is how does the OS knows how to address them?

较早的 Linux 内核将这些定义放入 机器文件 并传递 platform 资源结构,包括中断号,以及寄存器组的物理地址。在较新的 Linux 版本中,此信息包含在 Open Firmwaredevice tree 文件中。

Specifically I'm asking what component is responsible on allocating addresses to peripheral devices and MMIO addresses?

物理地址由SOC厂商设置。 Linux 平台支持 将使用 MMU 将它们映射为 non-cacheable 到某个 un-used 范围。通常物理地址可能非常稀疏所以虚拟重映射包更密集。每个都会产生一次 TLB 命中(MMU 缓存)。


这是一个使用 AXI 并连接 Cortex-M 和 Cortex-A 的示例 SOC 总线结构。

PBRIDGE 组件是 APB 网桥,它以星形拓扑连接。正如其他人所建议的那样,您需要查看特定的 SOC 文档以了解具体信息。但是,如果您没有 SOC 并且正在尝试从总体上了解 ARM,那么无论您拥有什么 SOC,上面的一些信息都会对您有所帮助。