5

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

我试图弄清楚系统总线的方式以及移动设备中出现的各种设备(如传感器芯片、wifi/BT SoC、触摸面板等)如何由 CPU(以及其他MCU)。

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

一个更基本的问题是移动设备架构中是否存在总线管理,或者是否存在某种“星形”拓扑(CPU 为中心)。

这个问题我得到的印象是这些设备被视为平台设备,即直接连接到 CPU 的设备,而不是通过总线。不过,我的问题是操作系统如何知道如何解决它们?然后其他线程,关于平台设备/驱动程序的这个这个让我感到困惑..

4

3 回答 3

12

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

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

第三个区别是 ARM 对架构和逻辑内核都进行了许可。第一个被 Apple、Samsung 等公司使用,它们制造了无尘室版本的内核。对于实际购买逻辑的第二组,ARM CPU 将包含来自AMBA家族的东西。

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

注意 Wikipedia 上的 AMBA 记录了几种总线类型。

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

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

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

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

不过,我的问题是操作系统如何知道如何解决它们?

较旧的 Linux 内核将这些定义放在一个机器文件中,并传递一个平台资源结构,包括中断号和寄存器组的物理地址。在较新的 Linux 版本中,此信息包含在Open Firmware设备树文件中。

具体来说,我问的是哪个组件负责为外围设备和 MMIO 地址分配地址?

物理地址由 SOC 制造商设置。Linux平台支持将使用 MMU 将它们映射为不可缓存到某些未使用的范围。通常物理地址可能非常稀疏,因此虚拟重映射包更密集。每一个都会导致 TLB 命中(MMU 缓存)。


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

AN4947 中的 Vybrid BUS - 了解 Vybrid 架构

PBRIDGE 组件是 APB 网桥,并以星形拓扑连接。正如其他人所建议的那样,您需要查看特定的 SOC 文档以了解详细信息。但是,如果您没有 SOC 并试图大致了解 ARM,那么上面的一些信息将对您有所帮助,无论您拥有什么 SOC。

于 2015-01-21T16:41:13.253 回答
1

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

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

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

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

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

于 2015-01-21T14:48:07.883 回答
0

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

例子是:

树莓派数据表(pdf)

OMAP 5 TRM

于 2015-01-21T16:26:57.053 回答