添加对新 Jamboard 的支持

概览

在 Fuchsia 中,可以按架构、主板和驱动程序划分硬件支持,请参阅 RFC-0111:初始 Fuchsia 硬件平台规格。本页面不介绍如何添加对新架构的支持。

请注意,x64 架构本身就被视为一种板(可配置性很高),因此本文不对其进行介绍,因为 x64 架构已受支持(但其实现可以改进,并支持更多当前无法工作的配置)。

如需添加对新开发板的支持,首先需要添加对 bringup build 产品配置的支持。

添加引入 build 配置支持

为了让启动构建正常运行,您需要:

  1. 支持的架构
  2. 引导加载程序和内核支持
  3. build 汇编
  4. 定义板驱动程序
  5. 非内核驱动程序

支持的架构

如需了解架构支持流程,请参阅 RFC-0111:初始 Fuchsia 硬件平台规范

引导加载程序和内核支持

新开发板需要一种内核加载方式,最好使用支持 Fuchsia 的引导加载程序。此外,内核至少需要支持一种采用内核驱动程序的形式的早期调试机制(例如串行端口)、中断控制器和计时器。

开发板必须包含一种对其编程的机制(例如,在 Flash 中存储内容)。更新引导加载程序时需要用到此文件。Fuchsia 映像可以使用此机制进行编程,也可以通过引导加载程序提供的支持进行编程。

引导加载程序

在本文档中,引导加载程序是指最终阶段引导加载程序,即启动过程中加载 Fuchsia 内核的软件组件。

有多种配置可让引导加载程序加载 Fuchsia 内核:

  • 引导加载程序支持 Fuchsia:最佳选项是在引导加载程序中添加对 Fuchsia 的支持。在这种情况下,Zircon 启动映像 (ZBI) 规范固件 SDK 实现。例如,针对 VIM3 增加的 U-Boot 支持
  • 如果引导加载程序不支持 Fuchsia,则必须向内核添加 boot shim 机制,使 Fuchsia build 与引导加载程序启动工具(例如 fastboot)兼容。点击此处查看 MediaTek 8167 开发板的示例。此 boot shim 将在以下各项中指定所有驱动程序。请注意,此处还必须列出启动 shim。

注意:

  1. 分区映射需要提供足够大的分区,以满足 Fuchsia 的要求。
  2. 需要考虑引导加载程序、Fuchsia 内核和任何安全端软件之间的预留资源,尤其是预留内存区域和预留硬件块。例如,某些硬件可能由引导加载程序配置,并且可能受以 EL3/EL2 运行的代码的控制。通过驱动程序从 EL1/0 操控此类设备可能会导致行为不稳定。确保了解安全监视器或 Hypervisor 可能正在使用哪些硬件/外围设备。

内核驱动程序

在 Fuchsia 中,大多数驱动程序都在用户空间中,但是本部分中列出的驱动程序必须存在于内核中。

要启动新开发板,需要一些早期阶段的调试机制,例如串行端口或 JTAG。如果串行端口是一种机制,则必须添加 UART 驱动程序(如果内核中尚无可用的 UART 驱动程序,例如此处)。此外,驱动程序还通过驱动程序添加了 ARM 的中断控制器和计时器支持,例如 gicv3通用计时器

所有这些驱动程序都需要配置为可供内核使用。如果内核由支持 fuchsia 的引导加载程序启动,驱动程序将在 ZBI 中配置,例如在此处的 U-Boot 中配置。如果内核是使用 boot shim 启动的,则驱动程序将在 shim 中进行配置。例如,对于 MediaTek 8167 开发板,请点击此处

注意:

  1. 例如,可以添加其他驱动程序,以使用 PSCI 控制电源。

build 组件

如需添加对新开发板的支持,需要向构建系统 (gn) 添加新的 board 配置。 VIM3board_bootfs_labels

添加板级配置后,可以指示构建系统为新开发板创建映像。例如:fx set bringup.vim3 后跟 fx build(请参阅 fx 工作流)。

这样,新开发板的启动 build 就可以加载到目标中,我们可以在串行端口中获得 shell(如果添加了内核串行端口驱动程序)。下一步是添加板驱动程序及其对应的非内核驱动程序,以提供更多功能。

开发板驱动程序

开发板驱动程序会描述并配置无法通过探测定位/配置的开发板硬件,这在基于 ARM64 的系统中很常见。

注意:

  1. 驱动程序的配置必须在开发板驱动程序中完成,而不是在实际驱动程序中完成,以便在组装时可重复使用和模块化。

非内核驱动程序

注意:

  1. 有时,硬件会特意在引导加载程序中进行初始化,以便显示徽标。需要在常规驱动程序中考虑到这一点。相关信息可以使用 ZBI 中的内核参数进行传递。
  2. 通过创建可跨驱动程序共享的库,或使驱动程序可从板驱动程序高度自定义,从而避免重复,从而重用软件。
  3. 使用系列(而不是特定的 SoC)为驱动程序和变量命名,以实现更明确的重用和汇总。
  4. 不要对引导加载程序保留的硬件状态做假设(第 1 项中所述的常见情况除外)。硬件不一定处于重置状态。
    1. 具体来说,请确保所有 GPIO 都处于安全状态。
    2. 具体而言,需要考虑引导加载程序可能会将硬件留在 DDR、DVFS、显示设备等方面的缓慢配置。

添加核心 build 配置支持

启动 build 运行后,您需要添加对核心 build 产品配置的支持,以创建包含核心系统服务、连接和指标报告的自行更新系统。

为了启用核心 build,您需要拥有一个正常运行的网络堆栈,因为核心 build 就是这样支持系统调试(例如使用 fx logfx shell)、更新(例如使用 fx ota)和指标报告(例如使用 fx snapshot)。

添加全面的系统配置支持

核心 build 正常运行后,可以通过定义新的产品配置来集成整个系统。例如,对于 x64,我们已经定义了 workbench_eng,其中包含网络浏览器和许多其他功能。同样,您也可以针对其他架构添加新的产品配置,例如基于 ARM64 的系统。