Ruff Board Description describes hardware interfaces (such as GPIO), and on-board devices (such as LED) that application can control. The board is a prerequisite condition for any Ruff app to run on a real board.
Please refer to Ruff MBD V1 about how to write descriptions for a real board.
Prerequisites
- Please click here if you are not sure how to use Ruff to write apps.
- Please click here if you know nothing about boards.
- Please upload device information to Rap Registry for accurate visualization on
rap layout - visual. Visit here for how to add a device to Rap Registry. - Please read the datasheet to confirm the information of hardwares interface and on-board boards.
The Structure of Board Description
board.json is a main file in the board project to describe the board. The structure is written as follows:{
"version": "2.0",
"id": "foo",
"model": "foo",
"devices": [
{
"id": "gpio-0",
"driver": "sys-gpio",
"inputs": {
"pin": {
"type": "number",
"args": {
"pin": 0
}
}
},
"outputs": {
"gpio": {
"type": "gpio"
}
}
}
],
"outputs": {
"gpio-0": "gpio-0/gpio"
}
}
- There are some properties declared in board.json:
version- currently the schema version ofboard.jsonis 2.0.id- ID for this board and also the ID what you input during initialization.model- hardware model. You’d better upload your device information to Rap Registry.devices- the on-board hardware resource(interface or device).outputs- the export hardware resource, and can be used by other devices.
Configuring Resouce on The Board
It is important to configure resource on the board, including:
- Hardware interface
- VCC
- GND
- On-board device
If it is not a Ruff OS built-in driver, please install rap install --save and then refer it in the configuration.
Hardware Interface
Hardware interface is the most essential part of the board that provides a real interface for other devices to connnect.
There are two parts for the hardware interface:
devices- basic information, including driver and PIN etc.outputs- export interface, which provides real interface for other devices to connnect.
The devices contain the following fields:
id- the device IDdriver- the device driverinputs- the argument for driveroutputs- the export interface, which provides real interface for other devices to connnect.
Here is an example:"devices": [
...
{
"id": "gpio-0",
"driver": "sys-gpio",
"inputs": {
"pin": {
"type": "number",
"args": {
"pin": 0
}
}
},
"outputs": {
"gpio": {
"type": "gpio"
}
}
}
...
],
"outputs": {
...
"gpio-0": "gpio-0/gpio"
...
}
A GPIO interface is declared as follows:
- ID is named as
gpio-0 - The driver is
sys-gpio, a RuffOS builtin driver. - The driver specifies a
PINfor GPIO. Its type is a number, and pin as the argument is 0. - It will export a GPIO interface for other devices. Its name is
gpioand the type isgpio. The type usuually is used for matching during the hardware layout.
A name is defined in outputs for external use:
gpio-0- the gpio interface exported from gpio-0
Please refere to Hardware Inteface Guide for more details.
VCC
VCC provides a power interface on the board for device to connect.
To configure VCC, a configuration with power as id should be declared in devices. VCC is a virtual configuration, so there is no need to configure the driver. You need to declare VCC according to the real board. The real VCC resource is configured in outputs.
voltage- the voltage of VCC.
Here is an example:"devices": [
...
{
"id": "power",
"outputs": {
"vdd-0": {
"type": "power",
"args": {
"voltage": "3.3v"
}
},
"vdd-1": {
"type": "power",
"args": {
"voltage": "5v"
}
}
}
},
...
]
Two VCCs are declared as follows:
- The VCC named as
vdd-0has 3.3v voltage. - The VCC named as
vdd-1has 5v voltage.
GND
GND provides a ground interface on the board for devices to connect.
To configure GND, a configuration with ground as id should be declared in devices. GND is a virtual configuration, so there is no need to configure driver. You need to declare GND according to the real board.The real GND resource is configured in outputs.
There are four GNDs declared in the following example:"devices": [
...
{
"id": "ground",
"outputs": {
"gnd-0": {
"type": "ground"
},
"gnd-1": {
"type": "ground"
},
"gnd-2": {
"type": "ground"
},
"gnd-3": {
"type": "ground"
}
}
}
...
]
On-Board Device
On-Board Device is an object installed on the board, like LED and button. Application can use on-board devices by declaruing them in board.json.
The on-board devices is declared in devices. The following are examples of fields that are configured.
id- device ID. Application can use $(‘#‘) to access the device.model- optional field and the device model.driver- the driver for device.inputs- the arguments provided to driver but varies from drivers.
The on-board driver is a plain driver installed by rap install --save. Once installed, the driver can be refered in driver.json.
An example of on-board LED is listed as follow:"devices": [
...
{
"id": "led-r",
"model": "ruff-led-gpio",
"driver": "led-gpio",
"inputs": {
"gpio": {
"type": "gpio",
"bind": "gpio-22/gpio",
"args": {
"direction": "out",
"level": "low"
}
}
}
}
...
]
The above configuration tell us,
- The ID of the on-board LED is
led-r. The application can access the device with $(‘#led-r’). - The model is
ruff-led-gpio - The driver is
led-gpio - The inputs depends on
led-gpio.
A gpio configuration is declared here:
- The type is
gpio. - Bind to
gpio-22/gpio. - The arguments are
directionisoutandlevelislow.
Hardware Inteface Guideline
Here is a list of hardware interface that Ruff currently supports:
| Interface | RuffOS Builtin Driver |
|---|---|
| GPIO | sys-gpio |
| I²C | sys-i2c |
| UART | sys-uart |
| PWM | N |
| ADC | N |
Ruff OS Built-in Driver
GPIO
The Ruff OS built-in driver is sys-gpio:
- Takes a PIN as input argument
- Exports a GPIO interface
An example is listed as follows:"devices": [
...
{
"id": "gpio-0",
"driver": "sys-gpio",
"inputs": {
"pin": {
"type": "number",
"args": {
"pin": 0
}
}
},
"outputs": {
"gpio": {
"type": "gpio"
}
}
}
...
],
"outputs": {
...
"gpio-0": "gpio-0/gpio"
...
}
I²C
The Ruff OS built-in driver is sys-i2c:
- Takes a bus as input argument
- Exports a I²C interface
Here is an example:"devices": [
...
{
"id": "i2c-0",
"model": "ruff-i2c",
"driver": "sys-i2c",
"inputs": {
"bus": {
"type": "number",
"args": {
"bus": 0
}
}
},
"outputs": {
"i2c": {
"type": "i2c"
}
}
}
...
],
"outputs": {
...
"i2c-0": "i2c-0/i2c"
...
}
UART
The Ruff OS built-in driver is sys-uart:
- Takes a path as input argument
- Exports a UART interface
"devices": [ |
Convertor
It’s common in hardware development to convert one interface to the other.
Please see Ruff MBD V1 as an example.
I²C to PWM
In Ruff MBD V1, it takes pca9685 to convert I²C to PWM that has 8 channels. Here is an example:"devices": [
...
{
"id": "ruff-pwm",
"model": "ruff-pwm",
"driver": "pca9685",
"inputs": {
"i2c": {
"type": "i2c",
"args": {
"address": 85
}
}
},
"outputs": {
"pwm-0": {
"type": "pwm"
},
"pwm-1": {
"type": "pwm"
},
"pwm-2": {
"type": "pwm"
},
"pwm-3": {
"type": "pwm"
},
"pwm-4": {
"type": "pwm"
},
"pwm-5": {
"type": "pwm"
},
"pwm-6": {
"type": "pwm"
},
"pwm-7": {
"type": "pwm"
}
}
}
...
],
"outputs": {
...
"pwm-0": "ruff-pwm/pwm-0",
"pwm-1": "ruff-pwm/pwm-1",
"pwm-2": "ruff-pwm/pwm-2",
"pwm-3": "ruff-pwm/pwm-3",
"pwm-4": "ruff-pwm/pwm-4",
"pwm-5": "ruff-pwm/pwm-5",
"pwm-6": "ruff-pwm/pwm-6",
"pwm-7": "ruff-pwm/pwm-7",
...
}
I²C to ADC
In Ruff MBD V1, it takes ltc2309 to convert I²C to ADC that has 8 channels. An example is listed as follow:"devices": [
...
{
"id": "ruff-adc",
"model": "ruff-adc",
"driver": "ltc2309",
"inputs": {
"i2c": {
"type": "i2c",
"args": {
"address": 8
}
}
},
"outputs": {
"an-0": {
"type": "adc"
},
"an-1": {
"type": "adc"
},
"an-2": {
"type": "adc"
},
"an-3": {
"type": "adc"
},
"an-4": {
"type": "adc"
},
"an-5": {
"type": "adc"
},
"an-6": {
"type": "adc"
},
"an-7": {
"type": "adc"
}
}
}
...
],
"outputs": {
...
"an-0": "ruff-adc/an-0",
"an-1": "ruff-adc/an-1",
"an-2": "ruff-adc/an-2",
"an-3": "ruff-adc/an-3",
"an-4": "ruff-adc/an-4",
"an-5": "ruff-adc/an-5",
"an-6": "ruff-adc/an-6",
"an-7": "ruff-adc/an-7",
...
}
I²C to GPIO
In Ruff MBD V1, it takes mcp23017 to convert I²C to GPIO that has 16 channels. Here is an example:"devices": [
...
{
"id": "gpio-plus",
"model": "ruff-gpio",
"driver": "mcp23017",
"inputs": {
"i2c": {
"type": "i2c",
"args": {
"address": 36
}
},
"gpio": {
"type": "gpio",
"bind": "gpio-0/gpio",
"args": {
"direction": "in",
"edge": "both"
}
}
},
"outputs": {
"io-0": {
"type": "gpio"
},
"io-1": {
"type": "gpio"
},
"io-2": {
"type": "gpio"
},
"io-3": {
"type": "gpio"
},
"io-4": {
"type": "gpio"
},
"io-5": {
"type": "gpio"
},
"io-6": {
"type": "gpio"
},
"io-7": {
"type": "gpio"
},
"io-8": {
"type": "gpio"
},
"io-9": {
"type": "gpio"
},
"io-10": {
"type": "gpio"
},
"io-11": {
"type": "gpio"
},
"io-12": {
"type": "gpio"
},
"io-13": {
"type": "gpio"
},
"io-14": {
"type": "gpio"
},
"io-15": {
"type": "gpio"
}
}
}
...
],
"outputs": {
...
"io-0": "gpio-plus/io-0",
"io-1": "gpio-plus/io-1",
"io-2": "gpio-plus/io-2",
"io-3": "gpio-plus/io-3",
"io-4": "gpio-plus/io-4",
"io-5": "gpio-plus/io-5",
"io-6": "gpio-plus/io-6",
"io-7": "gpio-plus/io-7",
"io-8": "gpio-plus/io-8",
"io-9": "gpio-plus/io-9",
"io-10": "gpio-plus/io-10",
"io-11": "gpio-plus/io-11",
"io-12": "gpio-plus/io-12",
"io-13": "gpio-plus/io-13",
"io-14": "gpio-plus/io-14",
"io-15": "gpio-plus/io-15"
...
}