blob: 2a1c2862fc49fb53b2c50d370d079f9ec12d5968 [file] [log] [blame] [view] [edit]
# Driver Binding
In Fuchsia, the driver framework maintains a tree of drivers and devices in the system. In this
tree, a device represents access to some hardware available to the OS. A driver both publishes and
binds to devices. For example, a USB driver might bind to a PCI device (its parent) and publish an
ethernet device (its child). In order to determine which devices a driver can bind to, each driver
has a bind program and each device has a set of properties. The bind program defines a condition
that matches the properties of devices that it wants to bind to. For more details, see [the DDK
documentation](/docs/concepts/drivers/overview).
Bind programs and the conditions they refer to are defined by a domain specific language. The bind
compiler consumes this language and produces bytecode for bind programs. In the future, it will
also produce code artefacts that drivers may refer to when publishing device propertieis. The
language has two kinds of source files: programs, and libraries. Libraries are used to share
property definitions between drivers and bind programs.
## The compiler
The compiler takes a list of library sources, and one program source. For example:
```
bindc --include pci.lib,usb.lib --output gizmo.h gizmo.bind
```
Currently, it produces a C header file that may be included by a driver. The header file defines a
macro:
```
ZIRCON_DRIVER(Driver, Ops, VendorName, Version);
```
* `Driver` is the name of the driver.
* `Ops` is a `zx_driver_ops`, which are the driver operation hooks
* `VendorName` is a string representing the name of the driver vendor.
* `Version` is a string representing the version of the driver.
For more details, see [the driver development documentation]
(/docs/concepts/drivers/driver-development).
## Bind Programs
A bind program defines the conditions to call a driver's `bind()` hook.
TODO(fxbug.dev/35932): Flesh out this documentation.
### Grammar
```
program = using-list , ( statement )+ ;
using-list = ( using , ";" )* ;
statement = condition , ";" | accept | if-statement ;
condition = compound-identifier , condition-op , value ;
condition-op = "==" | "!=" ;
accept = "accept" , compound-identifier , "{" ( value , "," )+ "}" ;
if-statement = "if" , condition , "{" , program , "}" ,
( "else if" , "{" , program , "}" )* ,
"else" , "{" , program , "}" ;
compound-identifier = IDENTIFIER ( "." , IDENTIFIER )* ;
value = compound-identifier | STRING-LITERAL | NUMERIC-LITERAL | "true" | "false" ;
```
An identifier matches the regex `[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?` and must not match any
keyword. The list of keywords is:
```
if
else
accept
using
```
A string literal matches the regex `”[^”]*”`, and a numeric literal matches the regex `[0-9]+` or
`0x[0-9A-F]+.`
## Bind Libraries
A bind library defines a set of properties that drivers may assign to their children. Also,
bind programs may refer to bind libraries.
TODO(fxbug.dev/35932): Flesh out this documentation.
TODO(fxbug.dev/36103): Implement and document comments.
```
library = library-header , using-list , declaration-list ;
library-header = "library" , compound-identifier , ";" ;
using-list = ( using , ";" )* ;
using = "using" , compound-identifier , ( "as" , IDENTIFIER ) ;
compound-identifier = IDENTIFIER ( "." , IDENTIFIER )* ;
declaration-list = ( declaration , ";" )* ;
declaration = primitive-declaration | enum-declaration ;
primitive-declaration = ( "extend" ) , type , IDENTIFIER ,
( "{" primitive-value-list "}" ) ;
type = "uint" | "string" | "bool";
primitive-value-list = ( IDENTIFIER , "=" , literal , "," )* ;
enum-declaration = ( "extend" ) , "enum" , IDENTIFIER ,
( "{" , enum-value-list , "}" ) ;
enum-value-list = ( IDENTIFIER , "," )* ;
literal = STRING-LITERAL | NUMERIC-LITERAL | "true" | "false" ;
```
An identifier matches the regex `[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?` and must not match any
keyword. The list of keywords is:
```
bool
enum
extend
library
string
uint
using
```
A string literal matches the regex `”[^”]*”`, and a numeric literal matches the regex `[0-9]+` or
`0x[0-9A-F]+.`