mirror of https://github.com/periph/devices
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
5.9 KiB
Markdown
165 lines
5.9 KiB
Markdown
# periph - Peripherals I/O in Go
|
|
|
|
|
|
## Features
|
|
|
|
- Continuously tested on [Raspberry Pi](https://raspberrypi.org),
|
|
[C.H.I.P.](https://getchip.com/) and Windows 10 via
|
|
[gohci](https://github.com/periph/gohci).
|
|
- Interfaces: I²C, SPI, gpio (both low latency memory mapped registers and
|
|
zero-CPU edge detection), 1-wire and more.
|
|
- Devices: apa102, bme280, ds18b20, ssd1306, tm1637, and more coming.
|
|
|
|
|
|
## Quick links
|
|
|
|
- [doc/users/](https://periph.io/doc/users/) for ready-to-use tools.
|
|
- [doc/apps/](https://periph.io/doc/apps/) to use `periph` as a library. The
|
|
complete API documentation, including examples, is at
|
|
[](https://godoc.org/periph.io/x/periph).
|
|
- [doc/drivers/](https://periph.io/doc/drivers/) to expand the list of supported
|
|
hardware.
|
|
|
|
|
|
## Users
|
|
|
|
periph includes [many ready-to-use
|
|
tools](https://github.com/google/periph/tree/master/cmd/)! See
|
|
[doc/users/](https://periph.io/doc/users/) for more info on configuring the host
|
|
and using the included tools.
|
|
|
|
```bash
|
|
# Retrieve and install all the commands at once:
|
|
go get periph.io/x/periph/cmd/...
|
|
# List the host drivers registered and/or initialized:
|
|
periph-info
|
|
# List the known headers:
|
|
headers-list
|
|
# List the known GPIO state:
|
|
gpio-list
|
|
```
|
|
|
|
|
|
## Application developers
|
|
|
|
For [application developers](https://periph.io/doc/apps/), `periph` provides
|
|
OS-independent bus interfacing. It really tries hard to _get out of the way_.
|
|
Here's the canonical "toggle a LED" sample:
|
|
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"time"
|
|
"periph.io/x/periph/conn/gpio"
|
|
"periph.io/x/periph/host"
|
|
)
|
|
|
|
func main() {
|
|
host.Init()
|
|
for l := gpio.Low; ; l = !l {
|
|
gpio.ByNumber(13).Out(l)
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
}
|
|
```
|
|
|
|
The following are synonyms, use the form you prefer:
|
|
|
|
- Runtime discovery:
|
|
- [`gpio.ByNumber(13)`](https://godoc.org/periph.io/x/periph/conn/gpio/#ByNumber)
|
|
or
|
|
[`gpio.ByName("13")`](https://godoc.org/periph.io/x/periph/conn/gpio/#ByName)
|
|
- [`gpio.ByName("GPIO13")`](https://godoc.org/periph.io/x/periph/conn/gpio/#ByName)
|
|
- Using global variables:
|
|
- [`rpi.P1_33`](https://godoc.org/periph.io/x/periph/host/rpi#/P1_33) to
|
|
select the pin via its position on the board
|
|
- [`bcm283x.GPIO13`](https://godoc.org/periph.io/x/periph/host/bcm283x/#GPIO13)
|
|
|
|
This example uses basically no CPU: the `Out()` call doesn't call into the
|
|
kernel. Instead it directly changes the GPIO memory mapped register.
|
|
|
|
|
|
### Samples
|
|
|
|
See [doc/apps/samples/](https://periph.io/doc/apps/samples/) for more examples.
|
|
|
|
|
|
## Contributions
|
|
|
|
`periph` provides an extensible driver registry and common bus interfaces which
|
|
are explained in more details at [doc/drivers/](https://periph.io/doc/drivers/).
|
|
`periph` is designed to work well with drivers living in external repositories
|
|
so you are not _required_ to fork the periph repository to load out-of-tree
|
|
drivers for your platform.
|
|
|
|
**Every commit is [tested on real
|
|
hardware](https://periph.io/doc/drivers/contributing/#testing) via
|
|
[gohci](https://github.com/periph/gohci) workers.**
|
|
|
|
We gladly accept contributions for documentation improvements and from device
|
|
driver developers via GitHub pull requests, as long as the author has signed the
|
|
Google Contributor License. Please see
|
|
[doc/drivers/contributing/](https://periph.io/doc/drivers/contributing/) for
|
|
more details.
|
|
|
|
|
|
## Philosophy
|
|
|
|
1. Optimize for simplicity, correctness and usability in that order.
|
|
- e.g. everything, interfaces and structs, uses strict typing, there's no
|
|
`interface{}` in sight.
|
|
2. OS agnostic. Clear separation of interfaces in
|
|
[conn/](https://godoc.org/periph.io/x/periph/conn),
|
|
enablers in [host/](https://godoc.org/periph.io/x/periph/host) and device
|
|
drivers in [devices/](https://godoc.org/periph.io/x/periph/devices).
|
|
- e.g. no devfs or sysfs path in sight.
|
|
- e.g. conditional compilation enables only the relevant drivers to be loaded
|
|
on each platform.
|
|
3. ... yet doesn't get in the way of platform specific code.
|
|
- e.g. A user can use statically typed global variables
|
|
[rpi.P1_3](https://godoc.org/periph.io/x/periph/host/rpi#pkg-variables),
|
|
[bcm283x.GPIO2](https://godoc.org/periph.io/x/periph/host/bcm283x#Pin)
|
|
to refer to the exact same pin on a Raspberry Pi.
|
|
3. The user can chose to optimize for performance instead of usability.
|
|
- e.g.
|
|
[apa102.Dev](https://godoc.org/periph.io/x/periph/devices/apa102#Dev)
|
|
exposes both high level
|
|
[draw.Image](https://golang.org/pkg/image/draw/#Image) to draw an image and
|
|
low level [io.Writer](https://golang.org/pkg/io/#Writer) to write raw RGB
|
|
24 bits pixels. The user chooses.
|
|
4. Use a divide and conquer approach. Each component has exactly one
|
|
responsibility.
|
|
- e.g. instead of having a driver per "platform", there's a driver per
|
|
"component": one for the CPU, one for the board headers, one for each
|
|
bus and sensor, etc.
|
|
5. Extensible via a [driver
|
|
registry](https://godoc.org/periph.io/x/periph#Register).
|
|
- e.g. a user can inject a custom driver to expose more pins, headers, etc.
|
|
A USB device (like an FT232H) can expose headers _in addition_ to the
|
|
headers found on the host.
|
|
6. The drivers must use the fastest possible implementation.
|
|
- e.g. both
|
|
[allwinner](https://godoc.org/periph.io/x/periph/host/allwinner)
|
|
and
|
|
[bcm283x](https://godoc.org/periph.io/x/periph/host/bcm283x)
|
|
leverage sysfs gpio to expose interrupt driven edge detection, yet use
|
|
memory mapped GPIO registers to perform single-cycle reads and writes.
|
|
|
|
|
|
## Authors
|
|
|
|
`periph` was initiated by [Marc-Antoine Ruel](https://github.com/maruel). The
|
|
full list of contributors is in
|
|
[AUTHORS](https://github.com/google/periph/blob/master/AUTHORS) and
|
|
[CONTRIBUTORS](https://github.com/google/periph/blob/master/CONTRIBUTORS).
|
|
|
|
|
|
## Disclaimer
|
|
|
|
This is not an official Google product (experimental or otherwise), it
|
|
is just code that happens to be owned by Google.
|
|
|
|
This project is not affiliated with the Go project.
|