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