blob: 607407d5a68ffd0249c4a69071af1453c2b28337 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
// SPDX-FileCopyrightText: 2022 Linaro Ltd.
// SPDX-FileCopyrightText: 2022 Viresh Kumar <viresh.kumar@linaro.org>
//
// Simplified Rust implementation of the gpioset tool.
use std::env;
use std::io::{stdin, Read};
use libgpiod::{
chip::Chip,
line::{self, Direction, Offset, SettingVal, Value},
request, Error, Result,
};
fn usage(name: &str) {
println!("Usage: {} <chip> <line_offset0>=<value0> ...", name);
}
fn main() -> Result<()> {
let args: Vec<String> = env::args().collect();
if args.len() < 3 {
usage(&args[0]);
return Err(Error::InvalidArguments);
}
let mut lconfig = line::Config::new()?;
for arg in &args[2..] {
let pair: Vec<&str> = arg.split('=').collect();
if pair.len() != 2 {
usage(&args[0]);
return Err(Error::InvalidArguments);
}
let offset = pair[0]
.parse::<Offset>()
.map_err(|_| Error::InvalidArguments)?;
let value = pair[1]
.parse::<i32>()
.map_err(|_| Error::InvalidArguments)?;
let mut lsettings = line::Settings::new()?;
lsettings.set_prop(&[
SettingVal::Direction(Direction::Output),
SettingVal::OutputValue(Value::new(value)?),
])?;
lconfig.add_line_settings(&[offset], lsettings)?;
}
let path = format!("/dev/gpiochip{}", args[1]);
let chip = Chip::open(&path)?;
let mut rconfig = request::Config::new()?;
rconfig.set_consumer(&args[0])?;
chip.request_lines(Some(&rconfig), &lconfig)?;
// Wait for keypress, let user verify line status.
stdin().read_exact(&mut [0u8]).unwrap();
Ok(())
}