繫結程式庫規範

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 裝置的高階屬性。如要定義 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.usbfuchsia 繫結程式庫擴充屬性。

供應商平台繫結程式庫可從任何硬體功能繫結程式庫擴充。

從舊版資源擴充

舊版 Fuchsia 繫結程式庫位於最高級別。所有繫結程式庫都可以從中擴充。不過,由於這些屬性已淘汰,我們應避免擴充屬性,並改為導入新屬性。