1 | /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ |
2 | #ifndef __UHID_H_ |
3 | #define __UHID_H_ |
4 | |
5 | /* |
6 | * User-space I/O driver support for HID subsystem |
7 | * Copyright (c) 2012 David Herrmann |
8 | */ |
9 | |
10 | /* |
11 | * This program is free software; you can redistribute it and/or modify it |
12 | * under the terms of the GNU General Public License as published by the Free |
13 | * Software Foundation; either version 2 of the License, or (at your option) |
14 | * any later version. |
15 | */ |
16 | |
17 | /* |
18 | * Public header for user-space communication. We try to keep every structure |
19 | * aligned but to be safe we also use __attribute__((__packed__)). Therefore, |
20 | * the communication should be ABI compatible even between architectures. |
21 | */ |
22 | |
23 | #include <linux/input.h> |
24 | #include <linux/types.h> |
25 | #include <linux/hid.h> |
26 | |
27 | enum uhid_event_type { |
28 | __UHID_LEGACY_CREATE, |
29 | UHID_DESTROY, |
30 | UHID_START, |
31 | UHID_STOP, |
32 | UHID_OPEN, |
33 | UHID_CLOSE, |
34 | UHID_OUTPUT, |
35 | __UHID_LEGACY_OUTPUT_EV, |
36 | __UHID_LEGACY_INPUT, |
37 | UHID_GET_REPORT, |
38 | UHID_GET_REPORT_REPLY, |
39 | UHID_CREATE2, |
40 | UHID_INPUT2, |
41 | UHID_SET_REPORT, |
42 | UHID_SET_REPORT_REPLY, |
43 | }; |
44 | |
45 | struct uhid_create2_req { |
46 | __u8 name[128]; |
47 | __u8 phys[64]; |
48 | __u8 uniq[64]; |
49 | __u16 rd_size; |
50 | __u16 bus; |
51 | __u32 vendor; |
52 | __u32 product; |
53 | __u32 version; |
54 | __u32 country; |
55 | __u8 rd_data[HID_MAX_DESCRIPTOR_SIZE]; |
56 | } __attribute__((__packed__)); |
57 | |
58 | enum uhid_dev_flag { |
59 | UHID_DEV_NUMBERED_FEATURE_REPORTS = (1ULL << 0), |
60 | UHID_DEV_NUMBERED_OUTPUT_REPORTS = (1ULL << 1), |
61 | UHID_DEV_NUMBERED_INPUT_REPORTS = (1ULL << 2), |
62 | }; |
63 | |
64 | struct uhid_start_req { |
65 | __u64 dev_flags; |
66 | }; |
67 | |
68 | #define UHID_DATA_MAX 4096 |
69 | |
70 | enum uhid_report_type { |
71 | UHID_FEATURE_REPORT, |
72 | UHID_OUTPUT_REPORT, |
73 | UHID_INPUT_REPORT, |
74 | }; |
75 | |
76 | struct uhid_input2_req { |
77 | __u16 size; |
78 | __u8 data[UHID_DATA_MAX]; |
79 | } __attribute__((__packed__)); |
80 | |
81 | struct uhid_output_req { |
82 | __u8 data[UHID_DATA_MAX]; |
83 | __u16 size; |
84 | __u8 rtype; |
85 | } __attribute__((__packed__)); |
86 | |
87 | struct uhid_get_report_req { |
88 | __u32 id; |
89 | __u8 rnum; |
90 | __u8 rtype; |
91 | } __attribute__((__packed__)); |
92 | |
93 | struct uhid_get_report_reply_req { |
94 | __u32 id; |
95 | __u16 err; |
96 | __u16 size; |
97 | __u8 data[UHID_DATA_MAX]; |
98 | } __attribute__((__packed__)); |
99 | |
100 | struct uhid_set_report_req { |
101 | __u32 id; |
102 | __u8 rnum; |
103 | __u8 rtype; |
104 | __u16 size; |
105 | __u8 data[UHID_DATA_MAX]; |
106 | } __attribute__((__packed__)); |
107 | |
108 | struct uhid_set_report_reply_req { |
109 | __u32 id; |
110 | __u16 err; |
111 | } __attribute__((__packed__)); |
112 | |
113 | /* |
114 | * Compat Layer |
115 | * All these commands and requests are obsolete. You should avoid using them in |
116 | * new code. We support them for backwards-compatibility, but you might not get |
117 | * access to new feature in case you use them. |
118 | */ |
119 | |
120 | enum uhid_legacy_event_type { |
121 | UHID_CREATE = __UHID_LEGACY_CREATE, |
122 | UHID_OUTPUT_EV = __UHID_LEGACY_OUTPUT_EV, |
123 | UHID_INPUT = __UHID_LEGACY_INPUT, |
124 | UHID_FEATURE = UHID_GET_REPORT, |
125 | UHID_FEATURE_ANSWER = UHID_GET_REPORT_REPLY, |
126 | }; |
127 | |
128 | /* Obsolete! Use UHID_CREATE2. */ |
129 | struct uhid_create_req { |
130 | __u8 name[128]; |
131 | __u8 phys[64]; |
132 | __u8 uniq[64]; |
133 | __u8 __user *rd_data; |
134 | __u16 rd_size; |
135 | |
136 | __u16 bus; |
137 | __u32 vendor; |
138 | __u32 product; |
139 | __u32 version; |
140 | __u32 country; |
141 | } __attribute__((__packed__)); |
142 | |
143 | /* Obsolete! Use UHID_INPUT2. */ |
144 | struct uhid_input_req { |
145 | __u8 data[UHID_DATA_MAX]; |
146 | __u16 size; |
147 | } __attribute__((__packed__)); |
148 | |
149 | /* Obsolete! Kernel uses UHID_OUTPUT exclusively now. */ |
150 | struct uhid_output_ev_req { |
151 | __u16 type; |
152 | __u16 code; |
153 | __s32 value; |
154 | } __attribute__((__packed__)); |
155 | |
156 | /* Obsolete! Kernel uses ABI compatible UHID_GET_REPORT. */ |
157 | struct uhid_feature_req { |
158 | __u32 id; |
159 | __u8 rnum; |
160 | __u8 rtype; |
161 | } __attribute__((__packed__)); |
162 | |
163 | /* Obsolete! Use ABI compatible UHID_GET_REPORT_REPLY. */ |
164 | struct uhid_feature_answer_req { |
165 | __u32 id; |
166 | __u16 err; |
167 | __u16 size; |
168 | __u8 data[UHID_DATA_MAX]; |
169 | } __attribute__((__packed__)); |
170 | |
171 | /* |
172 | * UHID Events |
173 | * All UHID events from and to the kernel are encoded as "struct uhid_event". |
174 | * The "type" field contains a UHID_* type identifier. All payload depends on |
175 | * that type and can be accessed via ev->u.XYZ accordingly. |
176 | * If user-space writes short events, they're extended with 0s by the kernel. If |
177 | * the kernel writes short events, user-space shall extend them with 0s. |
178 | */ |
179 | |
180 | struct uhid_event { |
181 | __u32 type; |
182 | |
183 | union { |
184 | struct uhid_create_req create; |
185 | struct uhid_input_req input; |
186 | struct uhid_output_req output; |
187 | struct uhid_output_ev_req output_ev; |
188 | struct uhid_feature_req feature; |
189 | struct uhid_get_report_req get_report; |
190 | struct uhid_feature_answer_req feature_answer; |
191 | struct uhid_get_report_reply_req get_report_reply; |
192 | struct uhid_create2_req create2; |
193 | struct uhid_input2_req input2; |
194 | struct uhid_set_report_req set_report; |
195 | struct uhid_set_report_reply_req set_report_reply; |
196 | struct uhid_start_req start; |
197 | } u; |
198 | } __attribute__((__packed__)); |
199 | |
200 | #endif /* __UHID_H_ */ |
201 | |