blob: 62aac0e4edf34a98c231b4d3248ef1a2b7854da3 [file] [log] [blame]
David Herrmannace3d862012-06-10 15:16:14 +02001#ifndef __UHID_H_
2#define __UHID_H_
3
4/*
5 * User-space I/O driver support for HID subsystem
6 * Copyright (c) 2012 David Herrmann
7 */
8
9/*
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the Free
12 * Software Foundation; either version 2 of the License, or (at your option)
13 * any later version.
14 */
15
16/*
17 * Public header for user-space communication. We try to keep every structure
18 * aligned but to be safe we also use __attribute__((__packed__)). Therefore,
19 * the communication should be ABI compatible even between architectures.
20 */
21
22#include <linux/input.h>
23#include <linux/types.h>
Petri Gynther45226432014-03-24 13:50:01 -070024#include <linux/hid.h>
David Herrmannace3d862012-06-10 15:16:14 +020025
26enum uhid_event_type {
David Herrmann50598e72014-07-29 17:14:22 +020027 __UHID_LEGACY_CREATE,
David Herrmannd365c6c2012-06-10 15:16:18 +020028 UHID_DESTROY,
David Herrmannec4b7de2012-06-10 15:16:21 +020029 UHID_START,
30 UHID_STOP,
David Herrmanne7191472012-06-10 15:16:22 +020031 UHID_OPEN,
32 UHID_CLOSE,
David Herrmann3b3baa82012-06-10 15:16:24 +020033 UHID_OUTPUT,
David Herrmann50598e72014-07-29 17:14:22 +020034 __UHID_LEGACY_OUTPUT_EV,
35 __UHID_LEGACY_INPUT,
36 UHID_GET_REPORT,
37 UHID_GET_REPORT_REPLY,
Petri Gynther45226432014-03-24 13:50:01 -070038 UHID_CREATE2,
39 UHID_INPUT2,
David Herrmann11c22152014-07-29 17:14:24 +020040 UHID_SET_REPORT,
41 UHID_SET_REPORT_REPLY,
David Herrmannace3d862012-06-10 15:16:14 +020042};
43
Petri Gynther45226432014-03-24 13:50:01 -070044struct uhid_create2_req {
45 __u8 name[128];
46 __u8 phys[64];
47 __u8 uniq[64];
48 __u16 rd_size;
49 __u16 bus;
50 __u32 vendor;
51 __u32 product;
52 __u32 version;
53 __u32 country;
54 __u8 rd_data[HID_MAX_DESCRIPTOR_SIZE];
55} __attribute__((__packed__));
56
David Herrmann5e87a362012-06-10 15:16:19 +020057#define UHID_DATA_MAX 4096
58
David Herrmann3b3baa82012-06-10 15:16:24 +020059enum uhid_report_type {
60 UHID_FEATURE_REPORT,
61 UHID_OUTPUT_REPORT,
62 UHID_INPUT_REPORT,
63};
64
Petri Gynther45226432014-03-24 13:50:01 -070065struct uhid_input2_req {
66 __u16 size;
67 __u8 data[UHID_DATA_MAX];
68} __attribute__((__packed__));
69
David Herrmann3b3baa82012-06-10 15:16:24 +020070struct uhid_output_req {
71 __u8 data[UHID_DATA_MAX];
72 __u16 size;
73 __u8 rtype;
74} __attribute__((__packed__));
75
David Herrmann50598e72014-07-29 17:14:22 +020076struct uhid_get_report_req {
77 __u32 id;
78 __u8 rnum;
79 __u8 rtype;
80} __attribute__((__packed__));
81
82struct uhid_get_report_reply_req {
83 __u32 id;
84 __u16 err;
85 __u16 size;
86 __u8 data[UHID_DATA_MAX];
87} __attribute__((__packed__));
88
David Herrmann11c22152014-07-29 17:14:24 +020089struct uhid_set_report_req {
90 __u32 id;
91 __u8 rnum;
92 __u8 rtype;
93 __u16 size;
94 __u8 data[UHID_DATA_MAX];
95} __attribute__((__packed__));
96
97struct uhid_set_report_reply_req {
98 __u32 id;
99 __u16 err;
100} __attribute__((__packed__));
101
David Herrmann50598e72014-07-29 17:14:22 +0200102/*
103 * Compat Layer
104 * All these commands and requests are obsolete. You should avoid using them in
105 * new code. We support them for backwards-compatibility, but you might not get
106 * access to new feature in case you use them.
107 */
108
109enum uhid_legacy_event_type {
110 UHID_CREATE = __UHID_LEGACY_CREATE,
111 UHID_OUTPUT_EV = __UHID_LEGACY_OUTPUT_EV,
112 UHID_INPUT = __UHID_LEGACY_INPUT,
113 UHID_FEATURE = UHID_GET_REPORT,
114 UHID_FEATURE_ANSWER = UHID_GET_REPORT_REPLY,
115};
116
117/* Obsolete! Use UHID_CREATE2. */
118struct uhid_create_req {
119 __u8 name[128];
120 __u8 phys[64];
121 __u8 uniq[64];
122 __u8 __user *rd_data;
123 __u16 rd_size;
124
125 __u16 bus;
126 __u32 vendor;
127 __u32 product;
128 __u32 version;
129 __u32 country;
130} __attribute__((__packed__));
131
132/* Obsolete! Use UHID_INPUT2. */
133struct uhid_input_req {
134 __u8 data[UHID_DATA_MAX];
135 __u16 size;
136} __attribute__((__packed__));
137
138/* Obsolete! Kernel uses UHID_OUTPUT exclusively now. */
David Herrmannf80e1362012-06-10 15:16:23 +0200139struct uhid_output_ev_req {
140 __u16 type;
141 __u16 code;
142 __s32 value;
143} __attribute__((__packed__));
144
David Herrmannfa71f322014-07-29 17:14:21 +0200145/* Obsolete! Kernel uses ABI compatible UHID_GET_REPORT. */
David Herrmannfcfcf0d2012-06-10 15:16:25 +0200146struct uhid_feature_req {
147 __u32 id;
148 __u8 rnum;
149 __u8 rtype;
150} __attribute__((__packed__));
151
David Herrmannfa71f322014-07-29 17:14:21 +0200152/* Obsolete! Use ABI compatible UHID_GET_REPORT_REPLY. */
David Herrmannfcfcf0d2012-06-10 15:16:25 +0200153struct uhid_feature_answer_req {
154 __u32 id;
155 __u16 err;
156 __u16 size;
157 __u8 data[UHID_DATA_MAX];
David Herrmannfee5dfe2012-12-17 13:20:43 +0100158} __attribute__((__packed__));
David Herrmannfcfcf0d2012-06-10 15:16:25 +0200159
David Herrmann50598e72014-07-29 17:14:22 +0200160/*
161 * UHID Events
162 * All UHID events from and to the kernel are encoded as "struct uhid_event".
163 * The "type" field contains a UHID_* type identifier. All payload depends on
164 * that type and can be accessed via ev->u.XYZ accordingly.
165 * If user-space writes short events, they're extended with 0s by the kernel. If
166 * the kernel writes short events, user-space shall extend them with 0s.
167 */
David Herrmannfa71f322014-07-29 17:14:21 +0200168
David Herrmannace3d862012-06-10 15:16:14 +0200169struct uhid_event {
170 __u32 type;
David Herrmannd365c6c2012-06-10 15:16:18 +0200171
172 union {
173 struct uhid_create_req create;
David Herrmann5e87a362012-06-10 15:16:19 +0200174 struct uhid_input_req input;
David Herrmann3b3baa82012-06-10 15:16:24 +0200175 struct uhid_output_req output;
David Herrmannf80e1362012-06-10 15:16:23 +0200176 struct uhid_output_ev_req output_ev;
David Herrmannfcfcf0d2012-06-10 15:16:25 +0200177 struct uhid_feature_req feature;
David Herrmannfa71f322014-07-29 17:14:21 +0200178 struct uhid_get_report_req get_report;
David Herrmannfcfcf0d2012-06-10 15:16:25 +0200179 struct uhid_feature_answer_req feature_answer;
David Herrmannfa71f322014-07-29 17:14:21 +0200180 struct uhid_get_report_reply_req get_report_reply;
Petri Gynther45226432014-03-24 13:50:01 -0700181 struct uhid_create2_req create2;
182 struct uhid_input2_req input2;
David Herrmann11c22152014-07-29 17:14:24 +0200183 struct uhid_set_report_req set_report;
184 struct uhid_set_report_reply_req set_report_reply;
David Herrmannd365c6c2012-06-10 15:16:18 +0200185 } u;
David Herrmannace3d862012-06-10 15:16:14 +0200186} __attribute__((__packed__));
187
188#endif /* __UHID_H_ */