// Copyright (c) 2018 The rust-gpio-cdev Project Developers. // // Licensed under the Apache License, Version 2.0 or the MIT license // , 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 { 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 );