input_linux_sys/
uinput.rs

1use crate::{ff_effect, input_absinfo, input_id, ABS_CNT};
2use libc::{c_char, c_int, c_uint};
3use nix::{
4	ioctl_none,
5	ioctl_read, ioctl_read_buf,
6	ioctl_readwrite,
7	ioctl_write_int, ioctl_write_ptr,
8};
9
10pub const UINPUT_MAX_NAME_SIZE: c_int = 80;
11
12pub const UINPUT_VERSION: c_int = 5;
13
14/// This is the new event type, used only by uinput.
15/// 'code' is UI_FF_UPLOAD or UI_FF_ERASE, and 'value' is the unique request ID.
16pub const EV_UINPUT: c_int = 0x0101;
17pub const UI_FF_UPLOAD: c_int = 1;
18pub const UI_FF_ERASE: c_int = 2;
19
20#[repr(C)]
21pub struct uinput_setup {
22	pub id: input_id,
23	pub name: [c_char; UINPUT_MAX_NAME_SIZE as usize],
24	pub ff_effects_max: u32,
25}
26
27#[repr(C)]
28pub struct uinput_abs_setup {
29	pub code: u16,
30	pub absinfo: input_absinfo,
31}
32
33#[repr(C)]
34pub struct uinput_user_dev {
35	pub name: [c_char; UINPUT_MAX_NAME_SIZE as usize],
36	pub id: input_id,
37
38	pub ff_effects_max: u32,
39	pub absmax: [i32; ABS_CNT as usize],
40	pub absmin: [i32; ABS_CNT as usize],
41	pub absfuzz: [i32; ABS_CNT as usize],
42	pub absflat: [i32; ABS_CNT as usize],
43}
44
45#[repr(C)]
46#[derive(Copy, Clone)]
47pub struct uinput_ff_upload {
48	pub request_id: u32,
49	pub retval: i32,
50	pub effect: ff_effect,
51	pub old: ff_effect,
52}
53
54#[repr(C)]
55#[derive(Copy, Clone)]
56pub struct uinput_ff_erase {
57	pub request_id: u32,
58	pub retval: i32,
59	pub effect_id: u32,
60}
61
62ioctl_none!(ui_dev_create, b'U', 1);
63ioctl_none!(ui_dev_destroy, b'U', 2);
64
65ioctl_write_ptr! {
66	/// Set device parameters for setup
67	ui_dev_setup, b'U', 3, uinput_setup
68}
69
70ioctl_write_ptr! {
71	/// Set absolute axis information for the device to setup
72	ui_abs_setup, b'U', 4, uinput_abs_setup
73}
74
75ioctl_write_int!(ui_set_evbit, b'U', 100);
76ioctl_write_int!(ui_set_keybit, b'U', 101);
77ioctl_write_int!(ui_set_relbit, b'U', 102);
78ioctl_write_int!(ui_set_absbit, b'U', 103);
79ioctl_write_int!(ui_set_mscbit, b'U', 104);
80ioctl_write_int!(ui_set_ledbit, b'U', 105);
81ioctl_write_int!(ui_set_sndbit, b'U', 106);
82ioctl_write_int!(ui_set_ffbit, b'U', 107);
83ioctl_write_ptr!(ui_set_phys, b'U', 108, c_char);
84ioctl_write_int!(ui_set_swbit, b'U', 109);
85ioctl_write_int!(ui_set_propbit, b'U', 110);
86
87ioctl_readwrite!(ui_begin_ff_upload, b'U', 200, uinput_ff_upload);
88ioctl_write_ptr!(ui_end_ff_upload, b'U', 201, uinput_ff_upload);
89
90ioctl_readwrite!(ui_begin_ff_erase, b'U', 202, uinput_ff_erase);
91ioctl_write_ptr!(ui_end_ff_erase, b'U', 203, uinput_ff_erase);
92
93ioctl_read_buf! {
94	/// get the sysfs name of the created uinput device
95	ui_get_sysname, b'U', 44, c_char
96}
97
98ioctl_read! {
99	/// Return version of uinput protocol
100	ui_get_version, b'U', 45, c_uint
101}