概览
在 Fuchsia 中,硬件支持可以按架构、板和驱动程序划分,请参阅 RFC-0111:初始 Fuchsia 硬件平台规范。本页未介绍如何添加对新架构的支持。本页介绍了如何添加对新开发的板的支持。 板
请注意,x64 架构本身就被视为开发板(可高度配置),因此本文未对其进行介绍,因为它已受支持(尽管其实现可以改进,并添加对目前不起作用的更多配置的支持)。
如需添加对新开发板的支持,我们首先需要添加对启动 build product 配置的支持。
添加了启动 build 配置支持
如需让启动 build 正常运行,您需要:
支持的架构
如需了解架构支持流程,请参阅 RFC-0111:初始 Fuchsia 硬件平台规范。
引导加载程序和内核支持
新开发的开发板需要能够加载内核,最好是使用支持 Fuchsia 的引导加载程序。此外,内核要求至少支持早期阶段调试机制(例如串行端口)、中断控制器和计时器,并且采用内核驱动程序的形式。
开发板必须包含一种为其编程的机制(例如,在 Flash 中存储内容)。这对于更新引导加载程序至关重要。Fuchsia 映像可以使用此机制或引导加载程序提供的支持进行编程。
引导加载程序
在本文档中,引导加载程序是指最终阶段引导加载程序,它是引导过程的软件组件,用于加载 Fuchsia 内核。
有多个配置可让引导加载程序加载 Fuchsia 内核:
- 引导加载程序支持 Fuchsia:在引导加载程序中添加对 Fuchsia 的支持是最佳方案。在本例中,Zircon 启动映像 (ZBI) 规范由固件 SDK 实现。例如,我们为 VIM3 的 U-Boot 添加了支持。
- 如果引导加载程序不支持 Fuchsia,则必须向内核添加引导 shim 机制,使 Fuchsia build 与引导加载程序引导设施(例如 fastboot)兼容。如需查看 MediaTek 8167 开发板的示例,请点击此处。此启动补丁将在以下各项中指定所有驱动程序。请注意,您还必须在此处列出启动补丁。
注意:
- 分区映射需要提供足够大的分区,以满足 Fuchsia 的要求。
- 需要考虑引导加载程序、Fuchsia 内核和任何安全端软件之间的预留资源,尤其是预留的内存区域和预留的硬件块。例如,某些硬件可能由引导加载程序配置,并且可能受 EL3/EL2 上运行的代码控制。通过驱动程序从 EL1/0 操控此类设备可能会导致行为不稳定。请务必了解安全监控器或 Hypervisor 可能会使用哪些硬件/外围设备。
内核驱动程序
在 Fuchsia 中,大多数驱动程序位于用户空间,但本部分列出的驱动程序必须位于内核中。
新开发的开发板需要一些早期调试机制,例如串行端口或 JTAG。如果串行端口是机制,则必须添加 UART 驱动程序(如果内核中尚不提供),例如此处。我们还通过驱动程序(例如 gicv3 和通用计时器)添加了 ARM 的中断控制器和计时器支持。
所有这些驱动程序都需要配置为供内核使用。如果内核由支持 fuchsia 的引导加载程序启动,驱动程序将在 ZBI 中配置,例如在此处的 U-Boot 中配置。如果内核是使用启动补丁启动的,驱动程序将在补丁本身中进行配置,例如,MediaTek 8167 开发板的配置方式如此处所示。
注意:
- 例如,可以添加其他驱动程序来使用 PSCI 控制电源。
构建汇编
如需添加对新开发板的支持,需要向构建系统 (gn) 添加新的开发板配置。例如,对于 VIM3,board_bootfs_labels
gn 变量(定义于此处)定义了启动时要加载到 bootfs 中的内容(包括下文所述的非内核驱动程序)。
添加开发板配置后,您可以指示构建系统为新开发板创建映像。例如:fx set bringup.vim3
后跟 fx build
(请参阅 fx 工作流)。
完成后,我们就可以将新开发板的启动 build 加载到目标板中,并在串行端口中获取 shell(如果添加了内核串行端口驱动程序)。下一步是添加板级驱动程序及其对应的非内核驱动程序,以实现其他功能。
开发板驱动程序
为开发板添加内核支持并完成构建系统汇编后,您必须创建此处的示例所示的板级驱动程序,以便在运行时添加和配置要使用的非内核驱动程序。开发板驱动程序用于描述和配置无法通过探测定位/配置的开发板硬件,这在基于 ARM64 的系统中很常见。
注意:
- 必须在板级驱动程序(而非实际驱动程序)中配置驱动程序,以便在组装时实现重复使用和模块化。
非内核驱动程序
然后,您可以添加常规非内核驱动程序来支持开发板,例如支持 GPIO、中断、时钟、电源、存储设备、音频设备、显示屏、GPU 等。如需了解详情,请点击此处。
注意:
- 有时,系统会特意在引导加载程序中初始化硬件,例如显示徽标。这需要在常规驱动程序中进行考虑。相关信息可以通过 ZBI 中的内核参数传递。
- 通过创建可跨驱动程序共享的库或通过使驱动程序从板级驱动程序高度可自定义来重复使用软件,从而避免重复。
- 使用系列(而非特定 SoC)来命名驱动程序和变量,以便更清晰地重复使用和汇总。
- 不要对引导加载程序留下的硬件状态做出假设(第 1 项中众所周知的情况除外)。硬件可能处于重置状态,也可能不处于重置状态。
- 具体而言,请确保所有 GPIO 均处于安全状态。
- 具体考虑引导加载程序可能为 DDR、DVFS、显示屏等硬件保留的缓慢配置。
添加了核心 build 配置支持
启动 build 正常运行后,您需要添加对核心 build 产品配置的支持,以创建具有核心系统服务、连接性和指标报告的自更新系统。
为了启用核心 build,您需要有一个正常运行的网络堆栈,因为核心 build 允许进行系统调试(例如使用 fx log
和 fx shell
)、更新(例如使用 fx ota
)和指标报告(例如使用 fx snapshot
)的方式就是通过网络堆栈。
添加了对完整系统配置的支持
核心构建工作正常后,就可以通过定义新的产品配置来集成整个系统。例如,对于 x64,我们已定义 workbench_eng,其中包含网络浏览器和许多其他功能。同样,可以为其他架构(例如基于 ARM64 的系统)添加新的产品配置。