| # Bind Library Guidelines | |
| ## Fuchsia namespace and scope | |
| All bind libraries defined in the Fuchsia tree (`fuchsia.git`) must follow these | |
| rules for the namespace: | |
| * If the bind library is used for internal testing and excluded from the SDK, | |
| the top-level namespace must be test | |
| * Otherwise, the top-level namespace must be `fuchsia`. This signals that the | |
| bind libraries are part of the open-source Fuchsia project. | |
| ## Bind library scope | |
| Bind libraries should scoped by one of the following: | |
| * Vendor platform | |
| * Hardware functionality | |
| * Deprecated Banjo protocol | |
| ### Vendor platform | |
| Bind libraries scoped by a vendor platform define properties that are associated | |
| with hardware from the vendor. For example, a vendor such as Amlogic has their | |
| own database of product IDs (PID) that they maintain. | |
| At a high level, the bind library’s namespace should follow the format: | |
| ``` | |
| fuchsia.<vendor>.platform | |
| ``` | |
| Bind libraries can be scoped down further by specific hardware or functionality | |
| through namespace nesting. For instance, a high level bind library for Amlogic | |
| hardware would have the namespace `fuchsia.amlogic.platform`. | |
| If we want a bind library for the Amlogic Meson lineup, we can define it in the | |
| `fuchsia.amlogic.platform.meson` namespace. If we want a bind library for | |
| Amlogic hardware with display functionality, we can define it in the namespace | |
| `fuchsia.amlogic.platform.display`. | |
| ### Hardware functionality | |
| Bind libraries that’s scoped by hardware functionality contain properties | |
| related to the functionality. The namespace should follow the format: | |
| ``` | |
| fuchsia.<hardware function> | |
| ``` | |
| These bind libraries are considered to be high level and generic. As such the | |
| properties can be extended by any vendor platform bind libraries. | |
| The hardware functionality namespace can be divided to more specific bind | |
| libraries through nesting. For example, the `fuchsia.usb` bind library contains | |
| high level properties for USB devices. If we want to define properties specific | |
| to USB mass storage devices, we can define them in a `fuchsia.usb.massstorage` | |
| bind library. | |
| ### Deprecated Banjo protocol | |
| Bind libraries scoped by Banjo protocols contain properties that represent the | |
| devices implementing the protocol. These libraries are established due to legacy | |
| code and should be phased out into hardware functionality scoped libraries. | |
| ## Naming | |
| ### Namespace components | |
| Each component of the name is in lowercase and must match the regular expression | |
| `[a-z][a-z0-9]*`. | |
| ### Property keys and values | |
| Prefer screaming snake case for the property keys and values. This improves the | |
| readability for the generated constants in the language bindings. | |
| For example, given the following bind library | |
| ``` | |
| library fuchsia.input; | |
| enum DEVICE_CATEGORY { | |
| KEYBOARD, | |
| MOUSE, | |
| }; | |
| ``` | |
| The following constants are generated: | |
| * {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"; | |
| ``` | |
| ## Types | |
| ### Prefer enum types over string for bound sets | |
| Enum types are preferred for properties with a limited set of values that are | |
| statically known. For example, `fuchsia.hardware.gpio.FUNCTION` property is more | |
| suitable as an enum type because the set of functionality is known statically | |
| for each board. | |
| In a scenario where it’s possible that new values need to be added to the | |
| property, using enum may still be preferable. The property values can scale by | |
| extending the property from a new bind library. | |
| If the property values are flexible with a wide range, then string types are | |
| preferred. One example is the ACPI HID value, which is a character string that | |
| identifies the manufacturer of the device and the specific device manufactured | |
| by the vendor (ex/ "PRP0001"). | |
| ### Use integer values for external registries | |
| Integer values are more appropriate for properties that represent number-based | |
| values maintained externally by a well known registry, such as the vendor IDs in | |
| the PCI ID registry and the class codes in the USB registry. | |
| ### Avoid adding new properties to the legacy bind library | |
| Legacy properties are defined in the | |
| [`fuchsia` bind library](/src/devices/bind/fuchsia/fuchsia.bind) and | |
| [`binding_priv.h`](/src/lib/ddk/include/lib/ddk/binding_priv.h). Since these | |
| properties are deprecated and are in the process of being phased out, avoid | |
| adding any new properties to them as much as possible. | |
| ## Extending properties | |
| Bind libraries should only extend properties from other bind libraries that are | |
| higher up in its namespace or from libraries that are scoped by hardware | |
| functionality. | |
| If the bind library is scoped by hardware functionality, then it should only | |
| extend from the bind libraries higher up in its namespace. For example, the | |
| `fuchsia.usb.audio` bind library can only extend properties from the | |
| `fuchsia.usb` and `fuchsia` bind library. | |
| Vendor platform bind libraries can extend from any hardware functionality bind | |
| libraries. | |
| ### Extending from legacy properties | |
| The legacy fuchsia bind library is at the highest level. All bind libraries can | |
| extend from it. However, since these properties are deprecated, we should avoid | |
| extending the properties and favor introducing new properties instead. |