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