Fuchsia 命名空间和范围
Fuchsia 树 (fuchsia.git) 中定义的所有绑定库都必须遵循以下命名空间规则:
- 如果绑定库用于内部测试并从 SDK 中排除,则顶级命名空间必须为 test
- 否则,顶级命名空间必须为
fuchsia。这表示绑定库是开源 Fuchsia 项目的一部分。
绑定库范围
绑定库应按以下其中一项确定范围:
- 供应商平台
- 硬件功能
- 已废弃的 Banjo 协议
供应商平台
由供应商平台确定范围的绑定库定义了与供应商硬件关联的属性。例如,Amlogic 等供应商拥有自己的产品 ID (PID) 数据库,并自行维护该数据库。
从宏观层面来看,绑定库的命名空间应采用以下格式:
fuchsia.<vendor>.platform
绑定库可以通过命名空间嵌套,进一步按特定硬件或功能确定范围。例如,Amlogic 硬件的高级绑定库的命名空间为 fuchsia.amlogic.platform。
如果我们想要为 Amlogic Meson 系列产品提供绑定库,可以在 fuchsia.amlogic.platform.meson 命名空间中定义该库。如果我们想要为具有显示功能的 Amlogic 硬件提供绑定库,可以在 fuchsia.amlogic.platform.display 命名空间中定义该库。
硬件功能
由硬件功能确定范围的绑定库包含与该功能相关的属性。命名空间应采用以下格式:
fuchsia.<hardware function>
这些绑定库被认为是高级库和通用库。因此,任何供应商平台绑定库都可以扩展这些属性。
硬件功能命名空间可以通过嵌套划分为更具体的绑定库。例如,fuchsia.usb 绑定库包含 USB 设备的高级属性。如果我们想要定义特定于 USB 大容量存储设备的属性,可以在 fuchsia.usb.massstorage 绑定库中定义这些属性。
已废弃的 Banjo 协议
由 Banjo 协议确定范围的绑定库包含表示实现该协议的设备的属性。这些库是因旧版代码而建立的,应逐步淘汰,并替换为由硬件功能确定范围的库。
命名
命名空间组件
名称的每个组件都采用小写形式,并且必须与正则表达式 [a-z][a-z0-9]* 匹配。
属性键和值
属性键和值最好采用尖叫式蛇形命名法。这样可以提高语言绑定中生成的常量的可读性。
例如,给定以下绑定库
library fuchsia.input;
enum DEVICE_CATEGORY {
KEYBOARD,
MOUSE,
};
系统会生成以下常量:
C++
// WARNING: This file is machine generated by bindc.
#ifndef BIND_FUCHSIA_INPUT_BINDLIB_
#define BIND_FUCHSIA_INPUT_BINDLIB_
#include <string>
namespace bind_fuchsia_input {
static const std::string DEVICE_CATEGORY = "fuchsia.input.DEVICE_CATEGORY";
static const std::string DEVICE_CATEGORY_KEYBOARD = "fuchsia.input.DEVICE_CATEGORY.KEYBOARD";
static const std::string DEVICE_CATEGORY_MOUSE = "fuchsia.input.DEVICE_CATEGORY.MOUSE";
} // namespace bind_fuchsia_input
#endif // BIND_FUCHSIA_INPUT_BINDLIB_
Rust
// WARNING: This file is machine generated by bindc.
pub const DEVICE_CATEGORY: &str = "fuchsia.example.library.DeviceCategory";
pub const DEVICE_CATEGORY_KEYBOARD: &str =
"fuchsia.input.DEVICE_CATEGORY.KEYBOARD";
pub const DEVICE_CATEGORY_MOUSE: &str =
"fuchsia.input.DEVICE_CATEGORY.MOUSE";
类型
对于绑定集,最好使用枚举类型而不是字符串
对于具有一组数量有限且静态已知的属性,最好使用枚举类型。例如,fuchsia.hardware.gpio.FUNCTION 属性更适合作为枚举类型,因为每个板的功能集都是静态已知的。
在可能需要向属性添加新值的情况下,使用枚举可能仍然是更好的选择。属性值可以通过从新绑定库扩展属性来扩缩。
如果属性值灵活且范围广泛,则最好使用字符串类型。一个示例是 ACPI HID 值,它是一个字符字符串,用于标识设备的制造商以及供应商制造的特定设备(例如“PRP0001”)。
为外部注册表使用整数值
对于表示由知名注册表(例如 PCI ID 注册表中的供应商 ID 和 USB 注册表中的类代码)在外部维护的基于数字的值的属性,整数值更合适。
避免向旧版绑定库添加新属性
旧版属性在
fuchsia 绑定库 和
binding_priv.h 中定义。由于这些属性已废弃,并且正在逐步淘汰,因此请尽可能避免向其中添加任何新属性。
扩展属性
绑定库应仅扩展其命名空间中更高级别的其他绑定库中的属性,或由硬件功能确定范围的库中的属性。
如果绑定库由硬件功能确定范围,则应仅从其命名空间中更高级别的绑定库进行扩展。例如,
fuchsia.usb.audio 绑定库只能从
fuchsia.usb 和 fuchsia 绑定库扩展属性。
供应商平台绑定库可以从任何硬件功能绑定库进行扩展。
从旧版属性进行扩展
旧版 Fuchsia 绑定库位于最高级别。所有绑定库都可以从中进行扩展。但是,由于这些属性已废弃,因此我们应避免扩展这些属性,而应倾向于引入新属性。