blob: 1fe1ae01dd3b04496be56ea77b6377bd7a3ddff9 [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 gpioinfo tool.
use std::env;
use std::path::Path;
use libgpiod::{
chip::Chip,
line::{Direction, Offset},
Error, Result,
};
fn line_info(chip: &Chip, offset: Offset) -> Result<()> {
let info = chip.line_info(offset)?;
let off = info.offset();
let name = match info.name() {
Ok(name) => name,
_ => "unused",
};
let consumer = match info.consumer() {
Ok(name) => name,
_ => "unnamed",
};
let low = if info.is_active_low() {
"active-low"
} else {
"active-high"
};
let dir = match info.direction()? {
Direction::AsIs => "None",
Direction::Input => "Input",
Direction::Output => "Output",
};
println!(
"\tline {:>3}\
\t{:>10}\
\t{:>10}\
\t{:>6}\
\t{:>14}",
off, name, consumer, dir, low
);
Ok(())
}
fn chip_info(chip: &Chip) -> Result<()> {
let info = chip.info()?;
let ngpio = info.num_lines();
println!("GPIO Chip name: {}", info.name()?);
println!("\tlabel: {}", info.label()?);
println!("\tpath: {}", chip.path()?);
println!("\tngpio: {}\n", ngpio);
println!("\tLine information:");
for offset in 0..ngpio {
line_info(chip, offset as Offset)?;
}
println!("\n");
Ok(())
}
fn main() -> Result<()> {
let args: Vec<String> = env::args().collect();
if args.len() > 2 {
println!("Usage: {}", args[0]);
return Err(Error::InvalidArguments);
}
if args.len() == 1 {
for chip in libgpiod::gpiochip_devices(&Path::new("/dev"))? {
chip_info(&chip)?;
}
} else {
let index = args[1]
.parse::<u32>()
.map_err(|_| Error::InvalidArguments)?;
let path = format!("/dev/gpiochip{}", index);
if libgpiod::is_gpiochip_device(&path) {
let chip = Chip::open(&path)?;
chip_info(&chip)?;
}
}
Ok(())
}