rust-sysfs-gpio is a rust library/crate providing access to the Linux sysfs GPIO interface (https://www.kernel.org/doc/Documentation). It seeks to provide an API that is safe, convenient, and efficient.
Many devices such as the Raspberry Pi or Beaglebone Black provide userspace access to a number of GPIO peripherals. The standard kernel API for providing access to these GPIOs is via sysfs.
You might want to also check out the gpio-utils Project for a convenient way to associate names with pins and export them as part of system boot. That project uses this library.
To use sysfs_gpio
, first add this to your Cargo.toml
:
[dependencies]
sysfs_gpio = "0.5"
Then, add this to your crate root:
extern crate sysfs_gpio;
Blinking an LED:
extern crate sysfs_gpio;
use sysfs_gpio::{Direction, Pin};
use std::thread::sleep;
use std::time::Duration;
fn main() {
let my_led = Pin::new(127); // number depends on chip, etc.
my_led.with_exported(|| {
loop {
my_led.set_value(0).unwrap();
sleep(Duration::from_millis(200));
my_led.set_value(1).unwrap();
sleep(Duration::from_millis(200));
}
}).unwrap();
}
More Examples:
- Blink an LED
- Poll a GPIO Input
- Receive interrupt on GPIO Change
- Poll several pins asynchronously with Tokio
- gpio-utils Project (uses most features)
The following features are planned for the library:
- Support for exporting a GPIO
- Support for unexporting a GPIO
- Support for setting the direction of a GPIO (in/out)
- Support for reading the value of a GPIO input
- Support for writing the value of a GPIO output
- Support for configuring whether a pin is active low/high
- Support for configuring interrupts on GPIO
- Support for polling on GPIO with configured interrupt
- Support for asynchronous polling using
mio
ortokio-core
(requires enabling themio-evented
ortokio
crate features, respectively)
Most likely, the machine you are running on is not your development machine (although it could be). In those cases, you will need to cross-compile. The rust-cross guide provides excellent, detailed instructions for cross-compiling.
Cross-compiling can be done by specifying an appropriate target. You can then move that to your device by whatever means and run it.
$ cargo build --target=arm-unknown-linux-gnueabihf --example blinky
$ scp target/arm-unknown-linux-gnueabihf/debug/examples/blinky ...
Copyright (c) 2015, Paul Osborne <[email protected]>
Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
http://www.apache.org/license/LICENSE-2.0> or the MIT license
<LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
option. This file may not be copied, modified, or distributed
except according to those terms.