xref: /linux/include/uapi/linux/uhid.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*e2be04c7SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2607ca46eSDavid Howells #ifndef __UHID_H_
3607ca46eSDavid Howells #define __UHID_H_
4607ca46eSDavid Howells 
5607ca46eSDavid Howells /*
6607ca46eSDavid Howells  * User-space I/O driver support for HID subsystem
7607ca46eSDavid Howells  * Copyright (c) 2012 David Herrmann
8607ca46eSDavid Howells  */
9607ca46eSDavid Howells 
10607ca46eSDavid Howells /*
11607ca46eSDavid Howells  * This program is free software; you can redistribute it and/or modify it
12607ca46eSDavid Howells  * under the terms of the GNU General Public License as published by the Free
13607ca46eSDavid Howells  * Software Foundation; either version 2 of the License, or (at your option)
14607ca46eSDavid Howells  * any later version.
15607ca46eSDavid Howells  */
16607ca46eSDavid Howells 
17607ca46eSDavid Howells /*
18607ca46eSDavid Howells  * Public header for user-space communication. We try to keep every structure
19607ca46eSDavid Howells  * aligned but to be safe we also use __attribute__((__packed__)). Therefore,
20607ca46eSDavid Howells  * the communication should be ABI compatible even between architectures.
21607ca46eSDavid Howells  */
22607ca46eSDavid Howells 
23607ca46eSDavid Howells #include <linux/input.h>
24607ca46eSDavid Howells #include <linux/types.h>
254522643aSPetri Gynther #include <linux/hid.h>
26607ca46eSDavid Howells 
27607ca46eSDavid Howells enum uhid_event_type {
2850598e70SDavid Herrmann 	__UHID_LEGACY_CREATE,
29607ca46eSDavid Howells 	UHID_DESTROY,
30607ca46eSDavid Howells 	UHID_START,
31607ca46eSDavid Howells 	UHID_STOP,
32607ca46eSDavid Howells 	UHID_OPEN,
33607ca46eSDavid Howells 	UHID_CLOSE,
34607ca46eSDavid Howells 	UHID_OUTPUT,
3550598e70SDavid Herrmann 	__UHID_LEGACY_OUTPUT_EV,
3650598e70SDavid Herrmann 	__UHID_LEGACY_INPUT,
3750598e70SDavid Herrmann 	UHID_GET_REPORT,
3850598e70SDavid Herrmann 	UHID_GET_REPORT_REPLY,
394522643aSPetri Gynther 	UHID_CREATE2,
404522643aSPetri Gynther 	UHID_INPUT2,
4111c22155SDavid Herrmann 	UHID_SET_REPORT,
4211c22155SDavid Herrmann 	UHID_SET_REPORT_REPLY,
43607ca46eSDavid Howells };
44607ca46eSDavid Howells 
454522643aSPetri Gynther struct uhid_create2_req {
464522643aSPetri Gynther 	__u8 name[128];
474522643aSPetri Gynther 	__u8 phys[64];
484522643aSPetri Gynther 	__u8 uniq[64];
494522643aSPetri Gynther 	__u16 rd_size;
504522643aSPetri Gynther 	__u16 bus;
514522643aSPetri Gynther 	__u32 vendor;
524522643aSPetri Gynther 	__u32 product;
534522643aSPetri Gynther 	__u32 version;
544522643aSPetri Gynther 	__u32 country;
554522643aSPetri Gynther 	__u8 rd_data[HID_MAX_DESCRIPTOR_SIZE];
564522643aSPetri Gynther } __attribute__((__packed__));
574522643aSPetri Gynther 
58c2b2f16cSDavid Herrmann enum uhid_dev_flag {
59c2b2f16cSDavid Herrmann 	UHID_DEV_NUMBERED_FEATURE_REPORTS			= (1ULL << 0),
60c2b2f16cSDavid Herrmann 	UHID_DEV_NUMBERED_OUTPUT_REPORTS			= (1ULL << 1),
61c2b2f16cSDavid Herrmann 	UHID_DEV_NUMBERED_INPUT_REPORTS				= (1ULL << 2),
62c2b2f16cSDavid Herrmann };
63c2b2f16cSDavid Herrmann 
64c2b2f16cSDavid Herrmann struct uhid_start_req {
65c2b2f16cSDavid Herrmann 	__u64 dev_flags;
66c2b2f16cSDavid Herrmann };
67c2b2f16cSDavid Herrmann 
68607ca46eSDavid Howells #define UHID_DATA_MAX 4096
69607ca46eSDavid Howells 
70607ca46eSDavid Howells enum uhid_report_type {
71607ca46eSDavid Howells 	UHID_FEATURE_REPORT,
72607ca46eSDavid Howells 	UHID_OUTPUT_REPORT,
73607ca46eSDavid Howells 	UHID_INPUT_REPORT,
74607ca46eSDavid Howells };
75607ca46eSDavid Howells 
764522643aSPetri Gynther struct uhid_input2_req {
774522643aSPetri Gynther 	__u16 size;
784522643aSPetri Gynther 	__u8 data[UHID_DATA_MAX];
794522643aSPetri Gynther } __attribute__((__packed__));
804522643aSPetri Gynther 
81607ca46eSDavid Howells struct uhid_output_req {
82607ca46eSDavid Howells 	__u8 data[UHID_DATA_MAX];
83607ca46eSDavid Howells 	__u16 size;
84607ca46eSDavid Howells 	__u8 rtype;
85607ca46eSDavid Howells } __attribute__((__packed__));
86607ca46eSDavid Howells 
8750598e70SDavid Herrmann struct uhid_get_report_req {
8850598e70SDavid Herrmann 	__u32 id;
8950598e70SDavid Herrmann 	__u8 rnum;
9050598e70SDavid Herrmann 	__u8 rtype;
9150598e70SDavid Herrmann } __attribute__((__packed__));
9250598e70SDavid Herrmann 
9350598e70SDavid Herrmann struct uhid_get_report_reply_req {
9450598e70SDavid Herrmann 	__u32 id;
9550598e70SDavid Herrmann 	__u16 err;
9650598e70SDavid Herrmann 	__u16 size;
9750598e70SDavid Herrmann 	__u8 data[UHID_DATA_MAX];
9850598e70SDavid Herrmann } __attribute__((__packed__));
9950598e70SDavid Herrmann 
10011c22155SDavid Herrmann struct uhid_set_report_req {
10111c22155SDavid Herrmann 	__u32 id;
10211c22155SDavid Herrmann 	__u8 rnum;
10311c22155SDavid Herrmann 	__u8 rtype;
10411c22155SDavid Herrmann 	__u16 size;
10511c22155SDavid Herrmann 	__u8 data[UHID_DATA_MAX];
10611c22155SDavid Herrmann } __attribute__((__packed__));
10711c22155SDavid Herrmann 
10811c22155SDavid Herrmann struct uhid_set_report_reply_req {
10911c22155SDavid Herrmann 	__u32 id;
11011c22155SDavid Herrmann 	__u16 err;
11111c22155SDavid Herrmann } __attribute__((__packed__));
11211c22155SDavid Herrmann 
11350598e70SDavid Herrmann /*
11450598e70SDavid Herrmann  * Compat Layer
11550598e70SDavid Herrmann  * All these commands and requests are obsolete. You should avoid using them in
11650598e70SDavid Herrmann  * new code. We support them for backwards-compatibility, but you might not get
11750598e70SDavid Herrmann  * access to new feature in case you use them.
11850598e70SDavid Herrmann  */
11950598e70SDavid Herrmann 
12050598e70SDavid Herrmann enum uhid_legacy_event_type {
12150598e70SDavid Herrmann 	UHID_CREATE			= __UHID_LEGACY_CREATE,
12250598e70SDavid Herrmann 	UHID_OUTPUT_EV			= __UHID_LEGACY_OUTPUT_EV,
12350598e70SDavid Herrmann 	UHID_INPUT			= __UHID_LEGACY_INPUT,
12450598e70SDavid Herrmann 	UHID_FEATURE			= UHID_GET_REPORT,
12550598e70SDavid Herrmann 	UHID_FEATURE_ANSWER		= UHID_GET_REPORT_REPLY,
12650598e70SDavid Herrmann };
12750598e70SDavid Herrmann 
12850598e70SDavid Herrmann /* Obsolete! Use UHID_CREATE2. */
12950598e70SDavid Herrmann struct uhid_create_req {
13050598e70SDavid Herrmann 	__u8 name[128];
13150598e70SDavid Herrmann 	__u8 phys[64];
13250598e70SDavid Herrmann 	__u8 uniq[64];
13350598e70SDavid Herrmann 	__u8 __user *rd_data;
13450598e70SDavid Herrmann 	__u16 rd_size;
13550598e70SDavid Herrmann 
13650598e70SDavid Herrmann 	__u16 bus;
13750598e70SDavid Herrmann 	__u32 vendor;
13850598e70SDavid Herrmann 	__u32 product;
13950598e70SDavid Herrmann 	__u32 version;
14050598e70SDavid Herrmann 	__u32 country;
14150598e70SDavid Herrmann } __attribute__((__packed__));
14250598e70SDavid Herrmann 
14350598e70SDavid Herrmann /* Obsolete! Use UHID_INPUT2. */
14450598e70SDavid Herrmann struct uhid_input_req {
14550598e70SDavid Herrmann 	__u8 data[UHID_DATA_MAX];
14650598e70SDavid Herrmann 	__u16 size;
14750598e70SDavid Herrmann } __attribute__((__packed__));
14850598e70SDavid Herrmann 
14950598e70SDavid Herrmann /* Obsolete! Kernel uses UHID_OUTPUT exclusively now. */
150607ca46eSDavid Howells struct uhid_output_ev_req {
151607ca46eSDavid Howells 	__u16 type;
152607ca46eSDavid Howells 	__u16 code;
153607ca46eSDavid Howells 	__s32 value;
154607ca46eSDavid Howells } __attribute__((__packed__));
155607ca46eSDavid Howells 
156fa71f32bSDavid Herrmann /* Obsolete! Kernel uses ABI compatible UHID_GET_REPORT. */
157607ca46eSDavid Howells struct uhid_feature_req {
158607ca46eSDavid Howells 	__u32 id;
159607ca46eSDavid Howells 	__u8 rnum;
160607ca46eSDavid Howells 	__u8 rtype;
161607ca46eSDavid Howells } __attribute__((__packed__));
162607ca46eSDavid Howells 
163fa71f32bSDavid Herrmann /* Obsolete! Use ABI compatible UHID_GET_REPORT_REPLY. */
164607ca46eSDavid Howells struct uhid_feature_answer_req {
165607ca46eSDavid Howells 	__u32 id;
166607ca46eSDavid Howells 	__u16 err;
167607ca46eSDavid Howells 	__u16 size;
168607ca46eSDavid Howells 	__u8 data[UHID_DATA_MAX];
169fee5dfecSDavid Herrmann } __attribute__((__packed__));
170607ca46eSDavid Howells 
17150598e70SDavid Herrmann /*
17250598e70SDavid Herrmann  * UHID Events
17350598e70SDavid Herrmann  * All UHID events from and to the kernel are encoded as "struct uhid_event".
17450598e70SDavid Herrmann  * The "type" field contains a UHID_* type identifier. All payload depends on
17550598e70SDavid Herrmann  * that type and can be accessed via ev->u.XYZ accordingly.
17650598e70SDavid Herrmann  * If user-space writes short events, they're extended with 0s by the kernel. If
17750598e70SDavid Herrmann  * the kernel writes short events, user-space shall extend them with 0s.
17850598e70SDavid Herrmann  */
179fa71f32bSDavid Herrmann 
180607ca46eSDavid Howells struct uhid_event {
181607ca46eSDavid Howells 	__u32 type;
182607ca46eSDavid Howells 
183607ca46eSDavid Howells 	union {
184607ca46eSDavid Howells 		struct uhid_create_req create;
185607ca46eSDavid Howells 		struct uhid_input_req input;
186607ca46eSDavid Howells 		struct uhid_output_req output;
187607ca46eSDavid Howells 		struct uhid_output_ev_req output_ev;
188607ca46eSDavid Howells 		struct uhid_feature_req feature;
189fa71f32bSDavid Herrmann 		struct uhid_get_report_req get_report;
190607ca46eSDavid Howells 		struct uhid_feature_answer_req feature_answer;
191fa71f32bSDavid Herrmann 		struct uhid_get_report_reply_req get_report_reply;
1924522643aSPetri Gynther 		struct uhid_create2_req create2;
1934522643aSPetri Gynther 		struct uhid_input2_req input2;
19411c22155SDavid Herrmann 		struct uhid_set_report_req set_report;
19511c22155SDavid Herrmann 		struct uhid_set_report_reply_req set_report_reply;
196c2b2f16cSDavid Herrmann 		struct uhid_start_req start;
197607ca46eSDavid Howells 	} u;
198607ca46eSDavid Howells } __attribute__((__packed__));
199607ca46eSDavid Howells 
200607ca46eSDavid Howells #endif /* __UHID_H_ */
201