cadmus_core/framebuffer/
linuxfb_sys.rs

1#![allow(unused)]
2
3use anyhow::{Context, Error};
4use nix::{ioctl_read_bad, ioctl_write_ptr_bad};
5use std::fs::File;
6use std::mem;
7use std::os::unix::io::AsRawFd;
8
9ioctl_read_bad!(
10    read_variable_screen_info,
11    FBIOGET_VSCREENINFO,
12    VarScreenInfo
13);
14ioctl_write_ptr_bad!(
15    write_variable_screen_info,
16    FBIOPUT_VSCREENINFO,
17    VarScreenInfo
18);
19ioctl_read_bad!(read_fixed_screen_info, FBIOGET_FSCREENINFO, FixScreenInfo);
20
21pub const FBIOGET_VSCREENINFO: libc::c_ulong = 0x4600;
22pub const FBIOPUT_VSCREENINFO: libc::c_ulong = 0x4601;
23pub const FBIOGET_FSCREENINFO: libc::c_ulong = 0x4602;
24
25#[repr(C)]
26#[derive(Clone, Debug)]
27pub struct FixScreenInfo {
28    pub id: [u8; 16],
29    pub smem_start: usize,
30    pub smem_len: u32,
31    pub kind: u32,
32    pub type_aux: u32,
33    pub visual: u32,
34    pub xpanstep: u16,
35    pub ypanstep: u16,
36    pub ywrapstep: u16,
37    pub line_length: u32,
38    pub mmio_start: usize,
39    pub mmio_len: u32,
40    pub accel: u32,
41    pub capabilities: u16,
42    pub reserved: [u16; 2],
43}
44
45#[repr(C)]
46#[derive(Clone, Debug)]
47pub struct VarScreenInfo {
48    pub xres: u32,
49    pub yres: u32,
50    pub xres_virtual: u32,
51    pub yres_virtual: u32,
52    pub xoffset: u32,
53    pub yoffset: u32,
54    pub bits_per_pixel: u32,
55    pub grayscale: u32,
56    pub red: Bitfield,
57    pub green: Bitfield,
58    pub blue: Bitfield,
59    pub transp: Bitfield,
60    pub nonstd: u32,
61    pub activate: u32,
62    pub height: u32,
63    pub width: u32,
64    pub accel_flags: u32,
65    pub pixclock: u32,
66    pub left_margin: u32,
67    pub right_margin: u32,
68    pub upper_margin: u32,
69    pub lower_margin: u32,
70    pub hsync_len: u32,
71    pub vsync_len: u32,
72    pub sync: u32,
73    pub vmode: u32,
74    pub rotate: u32,
75    pub colorspace: u32,
76    pub reserved: [u32; 4],
77}
78
79#[repr(C)]
80#[derive(Clone, Debug)]
81pub struct Bitfield {
82    pub offset: u32,
83    pub length: u32,
84    pub msb_right: u32,
85}
86
87impl Default for Bitfield {
88    fn default() -> Self {
89        unsafe { mem::zeroed() }
90    }
91}
92
93impl Default for VarScreenInfo {
94    fn default() -> Self {
95        unsafe { mem::zeroed() }
96    }
97}
98
99impl Default for FixScreenInfo {
100    fn default() -> Self {
101        unsafe { mem::zeroed() }
102    }
103}
104
105pub fn fix_screen_info(file: &File) -> Result<FixScreenInfo, Error> {
106    let mut info: FixScreenInfo = Default::default();
107    let result = unsafe { read_fixed_screen_info(file.as_raw_fd(), &mut info) };
108    match result {
109        Err(e) => Err(Error::from(e).context("can't get fixed screen info")),
110        _ => Ok(info),
111    }
112}
113
114pub fn var_screen_info(file: &File) -> Result<VarScreenInfo, Error> {
115    let mut info: VarScreenInfo = Default::default();
116    let result = unsafe { read_variable_screen_info(file.as_raw_fd(), &mut info) };
117    match result {
118        Err(e) => Err(Error::from(e).context("can't get variable screen info")),
119        _ => Ok(info),
120    }
121}