绑定库准则

Fuchsia 命名空间和范围

在 Fuchsia 树 (fuchsia.git) 中定义的所有绑定库都必须遵守这些 命名空间规则:

  • 如果绑定库用于内部测试并从 SDK 中排除, 顶级命名空间必须经过测试
  • 否则,顶级命名空间必须为 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 大容量存储设备,我们可以在 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”)。

对外部注册表使用整数值

整数值更适合表示基于数字的属性 由知名注册表在外部维护的值,如 以及 USB 注册表中的类代码。

避免向旧版绑定库添加新属性

旧版属性是在 fuchsia 绑定库binding_priv.h。由于这些 属性已被弃用且正在逐步淘汰, 尽可能为其添加新属性

扩展属性

绑定库应仅扩展来自其他绑定库的属性, 或位于由硬件作用域限定的库中 功能

如果绑定库的范围由硬件功能限定,那么它应该仅 从其命名空间中更高级别的绑定库进行扩展。例如, fuchsia.usb.audio 绑定库只能扩展来自 fuchsia.usbfuchsia 绑定库。

供应商平台绑定库可以从任何硬件功能绑定进行扩展 库。

从旧版媒体资源扩展

旧版 fuchsia 绑定库位于最高级别。所有绑定库 扩展。不过,由于这些属性已弃用, 并倾向于改为引入新属性。