除了设备树, Zephyr 还使用 Kconfig 语言来配置源代码。在实现代码时,选择设备树还是 Kconfig 有时会令人困惑。本章节旨在帮助你面对该难题时可做出决定。
简而言之:
- 设备树用于描述 硬件 及其 启动时配置 。例如,开发板上的外设、启动时设置的时钟频率、中断线路等。
- Kconfig 用于配置 软件支持 来构建到最终镜像中。例如,是否添加网络支持、应用程序需要哪些驱动程序等。
换句话说,设备树主要处理硬件,而 Kconfig 则负责软件。
例如,假设一个包含具有 2 个 UART 或串行端口实例的 SoC 的开发板。
- 事实上,具有此 UART 硬件 的开发板,将通过设备树中的两个 UART 节点进行描述。这些设备树数据提供了 UART 类型(通过
compatible 属性)和某些设置,例如内存中硬件外设寄存器的地址范围(通过 reg 属性)。
- 此外,设备树还描述了 UART 启动时的配置 。其中可能包括诸如 RX IRQ 线路的优先级和 UART 波特率等配置。这些配置可以在运行时修改,但它们启动时的配置在设备树中描述。
- 是否在构建中包含对 UART 的 软件支持 ,是通过 Kconfig 控制的。不需要使用 UART 的应用程序可以使用 Kconfig 从构建中删除配置此驱动程序(例如
CONFIG_UART=n ),即使开发板的设备树仍保留 UART 节点。
再举一个例子,假设一个设备具有 2.4GHz、多协议(同时支持低功耗蓝牙和 802.15.4 无线技术)无线电。
- 设备树应该用于描述无线电 硬件 的存在、它与什么驱动程序兼容,等等。
- 无线电硬件 启动时的配置 也应在设备树中指定,例如以 dBm 为单位的 TX 功率。
- Kconfig 应用于决定为无线电构建哪些 软件功能 ,例如选择 BLE 或 802.15.4 协议栈。
作为另一个示例,曾经存在一些 Kconfig 选项可用于启用特定驱动程序实例,但如今都已被删除。你应该在设备树中,找到相应的硬件实例上为设备配置 status 关键字,以表示是否启用此设备驱动。
这些规则有一些 例外 情况:
- 由于 Kconfig 无法灵活控制一些特定于实例的驱动配置参数,例如内部缓冲区的大小,这些选项可能在设备树中定义。但是,为了明确它们不属于硬件描述或配置,而是特定于 Zephyr 驱动程序的,这些属性应该以
zephyr, 为前缀,例如在以太网设备树通用属性中的 zephyr,random-mac-address 。
- 设备树中的
chosen 关键字,允许用户出于特定目的选择硬件设备的指定实例,它本质上是用于指定某些 软件支持 。这方面的一个例子是选择一个特定的 UART 用作系统的控制台。