1*53ee8cc1Swenshuai.xi #ifndef _HIDDEV_H 2*53ee8cc1Swenshuai.xi #define _HIDDEV_H 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi /* 5*53ee8cc1Swenshuai.xi * Copyright (c) 1999-2000 Vojtech Pavlik 6*53ee8cc1Swenshuai.xi * 7*53ee8cc1Swenshuai.xi * Sponsored by SuSE 8*53ee8cc1Swenshuai.xi */ 9*53ee8cc1Swenshuai.xi 10*53ee8cc1Swenshuai.xi /* 11*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or modify 12*53ee8cc1Swenshuai.xi * it under the terms of the GNU General Public License as published by 13*53ee8cc1Swenshuai.xi * the Free Software Foundation; either version 2 of the License, or 14*53ee8cc1Swenshuai.xi * (at your option) any later version. 15*53ee8cc1Swenshuai.xi * 16*53ee8cc1Swenshuai.xi * This program is distributed in the hope that it will be useful, 17*53ee8cc1Swenshuai.xi * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*53ee8cc1Swenshuai.xi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*53ee8cc1Swenshuai.xi * GNU General Public License for more details. 20*53ee8cc1Swenshuai.xi * 21*53ee8cc1Swenshuai.xi * You should have received a copy of the GNU General Public License 22*53ee8cc1Swenshuai.xi * along with this program; if not, write to the Free Software 23*53ee8cc1Swenshuai.xi * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 24*53ee8cc1Swenshuai.xi * 25*53ee8cc1Swenshuai.xi * Should you need to contact me, the author, you can do so either by 26*53ee8cc1Swenshuai.xi * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail: 27*53ee8cc1Swenshuai.xi * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic 28*53ee8cc1Swenshuai.xi */ 29*53ee8cc1Swenshuai.xi 30*53ee8cc1Swenshuai.xi /* 31*53ee8cc1Swenshuai.xi * The event structure itself 32*53ee8cc1Swenshuai.xi */ 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi struct hiddev_event { 35*53ee8cc1Swenshuai.xi unsigned hid; 36*53ee8cc1Swenshuai.xi signed int value; 37*53ee8cc1Swenshuai.xi }; 38*53ee8cc1Swenshuai.xi 39*53ee8cc1Swenshuai.xi struct hiddev_devinfo { 40*53ee8cc1Swenshuai.xi __u32 bustype; 41*53ee8cc1Swenshuai.xi __u32 busnum; 42*53ee8cc1Swenshuai.xi __u32 devnum; 43*53ee8cc1Swenshuai.xi __u32 ifnum; 44*53ee8cc1Swenshuai.xi __s16 vendor; 45*53ee8cc1Swenshuai.xi __s16 product; 46*53ee8cc1Swenshuai.xi __s16 version; 47*53ee8cc1Swenshuai.xi __u32 num_applications; 48*53ee8cc1Swenshuai.xi }; 49*53ee8cc1Swenshuai.xi 50*53ee8cc1Swenshuai.xi struct hiddev_collection_info { 51*53ee8cc1Swenshuai.xi __u32 index; 52*53ee8cc1Swenshuai.xi __u32 type; 53*53ee8cc1Swenshuai.xi __u32 usage; 54*53ee8cc1Swenshuai.xi __u32 level; 55*53ee8cc1Swenshuai.xi }; 56*53ee8cc1Swenshuai.xi 57*53ee8cc1Swenshuai.xi #define HID_STRING_SIZE 256 58*53ee8cc1Swenshuai.xi struct hiddev_string_descriptor { 59*53ee8cc1Swenshuai.xi __s32 index; 60*53ee8cc1Swenshuai.xi char value[HID_STRING_SIZE]; 61*53ee8cc1Swenshuai.xi }; 62*53ee8cc1Swenshuai.xi 63*53ee8cc1Swenshuai.xi struct hiddev_report_info { 64*53ee8cc1Swenshuai.xi __u32 report_type; 65*53ee8cc1Swenshuai.xi __u32 report_id; 66*53ee8cc1Swenshuai.xi __u32 num_fields; 67*53ee8cc1Swenshuai.xi }; 68*53ee8cc1Swenshuai.xi 69*53ee8cc1Swenshuai.xi /* To do a GUSAGE/SUSAGE, fill in at least usage_code, report_type and 70*53ee8cc1Swenshuai.xi * report_id. Set report_id to REPORT_ID_UNKNOWN if the rest of the fields 71*53ee8cc1Swenshuai.xi * are unknown. Otherwise use a usage_ref struct filled in from a previous 72*53ee8cc1Swenshuai.xi * successful GUSAGE call to save time. To actually send a value to the 73*53ee8cc1Swenshuai.xi * device, perform a SUSAGE first, followed by a SREPORT. An INITREPORT or a 74*53ee8cc1Swenshuai.xi * GREPORT isn't necessary for a GUSAGE to return valid data. 75*53ee8cc1Swenshuai.xi */ 76*53ee8cc1Swenshuai.xi #define HID_REPORT_ID_UNKNOWN 0xffffffff 77*53ee8cc1Swenshuai.xi #define HID_REPORT_ID_FIRST 0x00000100 78*53ee8cc1Swenshuai.xi #define HID_REPORT_ID_NEXT 0x00000200 79*53ee8cc1Swenshuai.xi #define HID_REPORT_ID_MASK 0x000000ff 80*53ee8cc1Swenshuai.xi #define HID_REPORT_ID_MAX 0x000000ff 81*53ee8cc1Swenshuai.xi 82*53ee8cc1Swenshuai.xi #define HID_REPORT_TYPE_INPUT 1 83*53ee8cc1Swenshuai.xi #define HID_REPORT_TYPE_OUTPUT 2 84*53ee8cc1Swenshuai.xi #define HID_REPORT_TYPE_FEATURE 3 85*53ee8cc1Swenshuai.xi #define HID_REPORT_TYPE_MIN 1 86*53ee8cc1Swenshuai.xi #define HID_REPORT_TYPE_MAX 3 87*53ee8cc1Swenshuai.xi 88*53ee8cc1Swenshuai.xi struct hiddev_field_info { 89*53ee8cc1Swenshuai.xi __u32 report_type; 90*53ee8cc1Swenshuai.xi __u32 report_id; 91*53ee8cc1Swenshuai.xi __u32 field_index; 92*53ee8cc1Swenshuai.xi __u32 maxusage; 93*53ee8cc1Swenshuai.xi __u32 flags; 94*53ee8cc1Swenshuai.xi __u32 physical; /* physical usage for this field */ 95*53ee8cc1Swenshuai.xi __u32 logical; /* logical usage for this field */ 96*53ee8cc1Swenshuai.xi __u32 application; /* application usage for this field */ 97*53ee8cc1Swenshuai.xi __s32 logical_minimum; 98*53ee8cc1Swenshuai.xi __s32 logical_maximum; 99*53ee8cc1Swenshuai.xi __s32 physical_minimum; 100*53ee8cc1Swenshuai.xi __s32 physical_maximum; 101*53ee8cc1Swenshuai.xi __u32 unit_exponent; 102*53ee8cc1Swenshuai.xi __u32 unit; 103*53ee8cc1Swenshuai.xi }; 104*53ee8cc1Swenshuai.xi 105*53ee8cc1Swenshuai.xi /* Fill in report_type, report_id and field_index to get the information on a 106*53ee8cc1Swenshuai.xi * field. 107*53ee8cc1Swenshuai.xi */ 108*53ee8cc1Swenshuai.xi #define HID_FIELD_CONSTANT 0x001 109*53ee8cc1Swenshuai.xi #define HID_FIELD_VARIABLE 0x002 110*53ee8cc1Swenshuai.xi #define HID_FIELD_RELATIVE 0x004 111*53ee8cc1Swenshuai.xi #define HID_FIELD_WRAP 0x008 112*53ee8cc1Swenshuai.xi #define HID_FIELD_NONLINEAR 0x010 113*53ee8cc1Swenshuai.xi #define HID_FIELD_NO_PREFERRED 0x020 114*53ee8cc1Swenshuai.xi #define HID_FIELD_NULL_STATE 0x040 115*53ee8cc1Swenshuai.xi #define HID_FIELD_VOLATILE 0x080 116*53ee8cc1Swenshuai.xi #define HID_FIELD_BUFFERED_BYTE 0x100 117*53ee8cc1Swenshuai.xi 118*53ee8cc1Swenshuai.xi struct hiddev_usage_ref { 119*53ee8cc1Swenshuai.xi __u32 report_type; 120*53ee8cc1Swenshuai.xi __u32 report_id; 121*53ee8cc1Swenshuai.xi __u32 field_index; 122*53ee8cc1Swenshuai.xi __u32 usage_index; 123*53ee8cc1Swenshuai.xi __u32 usage_code; 124*53ee8cc1Swenshuai.xi __s32 value; 125*53ee8cc1Swenshuai.xi }; 126*53ee8cc1Swenshuai.xi 127*53ee8cc1Swenshuai.xi /* hiddev_usage_ref_multi is used for sending multiple bytes to a control. 128*53ee8cc1Swenshuai.xi * It really manifests itself as setting the value of consecutive usages */ 129*53ee8cc1Swenshuai.xi #define HID_MAX_MULTI_USAGES 1024 130*53ee8cc1Swenshuai.xi struct hiddev_usage_ref_multi { 131*53ee8cc1Swenshuai.xi struct hiddev_usage_ref uref; 132*53ee8cc1Swenshuai.xi __u32 num_values; 133*53ee8cc1Swenshuai.xi __s32 values[HID_MAX_MULTI_USAGES]; 134*53ee8cc1Swenshuai.xi }; 135*53ee8cc1Swenshuai.xi 136*53ee8cc1Swenshuai.xi /* FIELD_INDEX_NONE is returned in read() data from the kernel when flags 137*53ee8cc1Swenshuai.xi * is set to (HIDDEV_FLAG_UREF | HIDDEV_FLAG_REPORT) and a new report has 138*53ee8cc1Swenshuai.xi * been sent by the device 139*53ee8cc1Swenshuai.xi */ 140*53ee8cc1Swenshuai.xi #define HID_FIELD_INDEX_NONE 0xffffffff 141*53ee8cc1Swenshuai.xi 142*53ee8cc1Swenshuai.xi /* 143*53ee8cc1Swenshuai.xi * Protocol version. 144*53ee8cc1Swenshuai.xi */ 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi #define HID_VERSION 0x010004 147*53ee8cc1Swenshuai.xi 148*53ee8cc1Swenshuai.xi /* 149*53ee8cc1Swenshuai.xi * IOCTLs (0x00 - 0x7f) 150*53ee8cc1Swenshuai.xi */ 151*53ee8cc1Swenshuai.xi 152*53ee8cc1Swenshuai.xi #define HIDIOCGVERSION _IOR('H', 0x01, int) 153*53ee8cc1Swenshuai.xi #define HIDIOCAPPLICATION _IO('H', 0x02) 154*53ee8cc1Swenshuai.xi #define HIDIOCGDEVINFO _IOR('H', 0x03, struct hiddev_devinfo) 155*53ee8cc1Swenshuai.xi #define HIDIOCGSTRING _IOR('H', 0x04, struct hiddev_string_descriptor) 156*53ee8cc1Swenshuai.xi #define HIDIOCINITREPORT _IO('H', 0x05) 157*53ee8cc1Swenshuai.xi #define HIDIOCGNAME(len) _IOC(_IOC_READ, 'H', 0x06, len) 158*53ee8cc1Swenshuai.xi #define HIDIOCGREPORT _IOW('H', 0x07, struct hiddev_report_info) 159*53ee8cc1Swenshuai.xi #define HIDIOCSREPORT _IOW('H', 0x08, struct hiddev_report_info) 160*53ee8cc1Swenshuai.xi #define HIDIOCGREPORTINFO _IOWR('H', 0x09, struct hiddev_report_info) 161*53ee8cc1Swenshuai.xi #define HIDIOCGFIELDINFO _IOWR('H', 0x0A, struct hiddev_field_info) 162*53ee8cc1Swenshuai.xi #define HIDIOCGUSAGE _IOWR('H', 0x0B, struct hiddev_usage_ref) 163*53ee8cc1Swenshuai.xi #define HIDIOCSUSAGE _IOW('H', 0x0C, struct hiddev_usage_ref) 164*53ee8cc1Swenshuai.xi #define HIDIOCGUCODE _IOWR('H', 0x0D, struct hiddev_usage_ref) 165*53ee8cc1Swenshuai.xi #define HIDIOCGFLAG _IOR('H', 0x0E, int) 166*53ee8cc1Swenshuai.xi #define HIDIOCSFLAG _IOW('H', 0x0F, int) 167*53ee8cc1Swenshuai.xi #define HIDIOCGCOLLECTIONINDEX _IOW('H', 0x10, struct hiddev_usage_ref) 168*53ee8cc1Swenshuai.xi #define HIDIOCGCOLLECTIONINFO _IOWR('H', 0x11, struct hiddev_collection_info) 169*53ee8cc1Swenshuai.xi #define HIDIOCGPHYS(len) _IOC(_IOC_READ, 'H', 0x12, len) 170*53ee8cc1Swenshuai.xi 171*53ee8cc1Swenshuai.xi /* For writing/reading to multiple/consecutive usages */ 172*53ee8cc1Swenshuai.xi #define HIDIOCGUSAGES _IOWR('H', 0x13, struct hiddev_usage_ref_multi) 173*53ee8cc1Swenshuai.xi #define HIDIOCSUSAGES _IOW('H', 0x14, struct hiddev_usage_ref_multi) 174*53ee8cc1Swenshuai.xi 175*53ee8cc1Swenshuai.xi /* 176*53ee8cc1Swenshuai.xi * Flags to be used in HIDIOCSFLAG 177*53ee8cc1Swenshuai.xi */ 178*53ee8cc1Swenshuai.xi #define HIDDEV_FLAG_UREF 0x1 179*53ee8cc1Swenshuai.xi #define HIDDEV_FLAG_REPORT 0x2 180*53ee8cc1Swenshuai.xi #define HIDDEV_FLAGS 0x3 181*53ee8cc1Swenshuai.xi 182*53ee8cc1Swenshuai.xi /* To traverse the input report descriptor info for a HID device, perform the 183*53ee8cc1Swenshuai.xi * following: 184*53ee8cc1Swenshuai.xi * 185*53ee8cc1Swenshuai.xi * rinfo.report_type = HID_REPORT_TYPE_INPUT; 186*53ee8cc1Swenshuai.xi * rinfo.report_id = HID_REPORT_ID_FIRST; 187*53ee8cc1Swenshuai.xi * ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo); 188*53ee8cc1Swenshuai.xi * 189*53ee8cc1Swenshuai.xi * while (ret >= 0) { 190*53ee8cc1Swenshuai.xi * for (i = 0; i < rinfo.num_fields; i++) { 191*53ee8cc1Swenshuai.xi * finfo.report_type = rinfo.report_type; 192*53ee8cc1Swenshuai.xi * finfo.report_id = rinfo.report_id; 193*53ee8cc1Swenshuai.xi * finfo.field_index = i; 194*53ee8cc1Swenshuai.xi * ioctl(fd, HIDIOCGFIELDINFO, &finfo); 195*53ee8cc1Swenshuai.xi * for (j = 0; j < finfo.maxusage; j++) { 196*53ee8cc1Swenshuai.xi * uref.field_index = i; 197*53ee8cc1Swenshuai.xi * uref.usage_index = j; 198*53ee8cc1Swenshuai.xi * ioctl(fd, HIDIOCGUCODE, &uref); 199*53ee8cc1Swenshuai.xi * ioctl(fd, HIDIOCGUSAGE, &uref); 200*53ee8cc1Swenshuai.xi * } 201*53ee8cc1Swenshuai.xi * } 202*53ee8cc1Swenshuai.xi * rinfo.report_id |= HID_REPORT_ID_NEXT; 203*53ee8cc1Swenshuai.xi * ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo); 204*53ee8cc1Swenshuai.xi * } 205*53ee8cc1Swenshuai.xi */ 206*53ee8cc1Swenshuai.xi 207*53ee8cc1Swenshuai.xi 208*53ee8cc1Swenshuai.xi #endif 209