cadmus_core/framebuffer/
linuxfb_sys.rs1#![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}