blob: ceb8f72512b15e3dbb62a9d999f82ac065b042a4 [file] [log] [blame]
// Copyright (c) 2018 The rust-gpio-cdev Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/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.
use crate::IoctlKind;
pub const GPIOHANDLES_MAX: usize = 64;
// struct gpiochip_info
#[repr(C)]
pub struct gpiochip_info {
pub name: [libc::c_char; 32],
pub label: [libc::c_char; 32],
pub lines: u32,
}
#[repr(C)]
pub struct gpioline_info {
pub line_offset: u32,
pub flags: u32,
pub name: [libc::c_char; 32],
pub consumer: [libc::c_char; 32],
}
#[repr(C)]
pub struct gpiohandle_request {
pub lineoffsets: [u32; GPIOHANDLES_MAX],
pub flags: u32,
pub default_values: [u8; GPIOHANDLES_MAX],
pub consumer_label: [libc::c_char; 32],
pub lines: u32,
pub fd: libc::c_int,
}
#[repr(C)]
pub struct gpiohandle_data {
pub values: [u8; GPIOHANDLES_MAX],
}
#[repr(C)]
pub struct gpioevent_request {
pub lineoffset: u32,
pub handleflags: u32,
pub eventflags: u32,
pub consumer_label: [libc::c_char; 32],
pub fd: libc::c_int,
}
#[repr(C)]
pub struct gpioevent_data {
pub timestamp: u64,
pub id: u32,
}
macro_rules! wrap_ioctl {
($ioctl_macro:ident!($name:ident, $ioty:expr, $nr:expr, $ty:ident), $ioctl_error_type:expr) => {
mod $name {
$ioctl_macro!($name, $ioty, $nr, super::$ty);
}
pub(crate) fn $name(fd: libc::c_int, data: &mut $ty) -> crate::errors::Result<libc::c_int> {
unsafe {
$name::$name(fd, data).map_err(|e| crate::errors::ioctl_err($ioctl_error_type, e))
}
}
};
}
wrap_ioctl!(
ioctl_read!(gpio_get_chipinfo_ioctl, 0xB4, 0x01, gpiochip_info),
IoctlKind::ChipInfo
);
wrap_ioctl!(
ioctl_readwrite!(gpio_get_lineinfo_ioctl, 0xB4, 0x02, gpioline_info),
IoctlKind::LineInfo
);
wrap_ioctl!(
ioctl_readwrite!(gpio_get_linehandle_ioctl, 0xB4, 0x03, gpiohandle_request),
IoctlKind::LineHandle
);
wrap_ioctl!(
ioctl_readwrite!(gpio_get_lineevent_ioctl, 0xB4, 0x04, gpioevent_request),
IoctlKind::LineEvent
);
wrap_ioctl!(
ioctl_readwrite!(
gpiohandle_get_line_values_ioctl,
0xB4,
0x08,
gpiohandle_data
),
IoctlKind::GetLine
);
wrap_ioctl!(
ioctl_readwrite!(
gpiohandle_set_line_values_ioctl,
0xB4,
0x09,
gpiohandle_data
),
IoctlKind::SetLine
);