11da177e4SLinus Torvalds #ifndef _INPUT_H 21da177e4SLinus Torvalds #define _INPUT_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds /* 51da177e4SLinus Torvalds * Copyright (c) 1999-2002 Vojtech Pavlik 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify it 81da177e4SLinus Torvalds * under the terms of the GNU General Public License version 2 as published by 91da177e4SLinus Torvalds * the Free Software Foundation. 101da177e4SLinus Torvalds */ 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #ifdef __KERNEL__ 131da177e4SLinus Torvalds #include <linux/time.h> 141da177e4SLinus Torvalds #include <linux/list.h> 15d19fbe8aSDmitry Torokhov #include <linux/device.h> 16e39b8433SRusty Russell #include <linux/mod_devicetable.h> 171da177e4SLinus Torvalds #else 181da177e4SLinus Torvalds #include <sys/time.h> 191da177e4SLinus Torvalds #include <sys/ioctl.h> 201da177e4SLinus Torvalds #include <asm/types.h> 211da177e4SLinus Torvalds #endif 221da177e4SLinus Torvalds 231da177e4SLinus Torvalds /* 241da177e4SLinus Torvalds * The event structure itself 251da177e4SLinus Torvalds */ 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds struct input_event { 281da177e4SLinus Torvalds struct timeval time; 291da177e4SLinus Torvalds __u16 type; 301da177e4SLinus Torvalds __u16 code; 311da177e4SLinus Torvalds __s32 value; 321da177e4SLinus Torvalds }; 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds /* 351da177e4SLinus Torvalds * Protocol version. 361da177e4SLinus Torvalds */ 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds #define EV_VERSION 0x010000 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds /* 411da177e4SLinus Torvalds * IOCTLs (0x00 - 0x7f) 421da177e4SLinus Torvalds */ 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds struct input_id { 451da177e4SLinus Torvalds __u16 bustype; 461da177e4SLinus Torvalds __u16 vendor; 471da177e4SLinus Torvalds __u16 product; 481da177e4SLinus Torvalds __u16 version; 491da177e4SLinus Torvalds }; 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds struct input_absinfo { 521da177e4SLinus Torvalds __s32 value; 531da177e4SLinus Torvalds __s32 minimum; 541da177e4SLinus Torvalds __s32 maximum; 551da177e4SLinus Torvalds __s32 fuzz; 561da177e4SLinus Torvalds __s32 flat; 571da177e4SLinus Torvalds }; 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ 601da177e4SLinus Torvalds #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ 611da177e4SLinus Torvalds #define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ 621da177e4SLinus Torvalds #define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ 651da177e4SLinus Torvalds #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ 661da177e4SLinus Torvalds #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ 691da177e4SLinus Torvalds #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ 701da177e4SLinus Torvalds #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ 7131581066SRichard Purdie #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ 721da177e4SLinus Torvalds 731da177e4SLinus Torvalds #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ 741da177e4SLinus Torvalds #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ 751da177e4SLinus Torvalds #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ 781da177e4SLinus Torvalds #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ 791da177e4SLinus Torvalds #define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */ 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds /* 841da177e4SLinus Torvalds * Event types 851da177e4SLinus Torvalds */ 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds #define EV_SYN 0x00 881da177e4SLinus Torvalds #define EV_KEY 0x01 891da177e4SLinus Torvalds #define EV_REL 0x02 901da177e4SLinus Torvalds #define EV_ABS 0x03 911da177e4SLinus Torvalds #define EV_MSC 0x04 9231581066SRichard Purdie #define EV_SW 0x05 931da177e4SLinus Torvalds #define EV_LED 0x11 941da177e4SLinus Torvalds #define EV_SND 0x12 951da177e4SLinus Torvalds #define EV_REP 0x14 961da177e4SLinus Torvalds #define EV_FF 0x15 971da177e4SLinus Torvalds #define EV_PWR 0x16 981da177e4SLinus Torvalds #define EV_FF_STATUS 0x17 991da177e4SLinus Torvalds #define EV_MAX 0x1f 1001da177e4SLinus Torvalds 1011da177e4SLinus Torvalds /* 1021da177e4SLinus Torvalds * Synchronization events. 1031da177e4SLinus Torvalds */ 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds #define SYN_REPORT 0 1061da177e4SLinus Torvalds #define SYN_CONFIG 1 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds /* 1091da177e4SLinus Torvalds * Keys and buttons 1101da177e4SLinus Torvalds */ 1111da177e4SLinus Torvalds 1121da177e4SLinus Torvalds #define KEY_RESERVED 0 1131da177e4SLinus Torvalds #define KEY_ESC 1 1141da177e4SLinus Torvalds #define KEY_1 2 1151da177e4SLinus Torvalds #define KEY_2 3 1161da177e4SLinus Torvalds #define KEY_3 4 1171da177e4SLinus Torvalds #define KEY_4 5 1181da177e4SLinus Torvalds #define KEY_5 6 1191da177e4SLinus Torvalds #define KEY_6 7 1201da177e4SLinus Torvalds #define KEY_7 8 1211da177e4SLinus Torvalds #define KEY_8 9 1221da177e4SLinus Torvalds #define KEY_9 10 1231da177e4SLinus Torvalds #define KEY_0 11 1241da177e4SLinus Torvalds #define KEY_MINUS 12 1251da177e4SLinus Torvalds #define KEY_EQUAL 13 1261da177e4SLinus Torvalds #define KEY_BACKSPACE 14 1271da177e4SLinus Torvalds #define KEY_TAB 15 1281da177e4SLinus Torvalds #define KEY_Q 16 1291da177e4SLinus Torvalds #define KEY_W 17 1301da177e4SLinus Torvalds #define KEY_E 18 1311da177e4SLinus Torvalds #define KEY_R 19 1321da177e4SLinus Torvalds #define KEY_T 20 1331da177e4SLinus Torvalds #define KEY_Y 21 1341da177e4SLinus Torvalds #define KEY_U 22 1351da177e4SLinus Torvalds #define KEY_I 23 1361da177e4SLinus Torvalds #define KEY_O 24 1371da177e4SLinus Torvalds #define KEY_P 25 1381da177e4SLinus Torvalds #define KEY_LEFTBRACE 26 1391da177e4SLinus Torvalds #define KEY_RIGHTBRACE 27 1401da177e4SLinus Torvalds #define KEY_ENTER 28 1411da177e4SLinus Torvalds #define KEY_LEFTCTRL 29 1421da177e4SLinus Torvalds #define KEY_A 30 1431da177e4SLinus Torvalds #define KEY_S 31 1441da177e4SLinus Torvalds #define KEY_D 32 1451da177e4SLinus Torvalds #define KEY_F 33 1461da177e4SLinus Torvalds #define KEY_G 34 1471da177e4SLinus Torvalds #define KEY_H 35 1481da177e4SLinus Torvalds #define KEY_J 36 1491da177e4SLinus Torvalds #define KEY_K 37 1501da177e4SLinus Torvalds #define KEY_L 38 1511da177e4SLinus Torvalds #define KEY_SEMICOLON 39 1521da177e4SLinus Torvalds #define KEY_APOSTROPHE 40 1531da177e4SLinus Torvalds #define KEY_GRAVE 41 1541da177e4SLinus Torvalds #define KEY_LEFTSHIFT 42 1551da177e4SLinus Torvalds #define KEY_BACKSLASH 43 1561da177e4SLinus Torvalds #define KEY_Z 44 1571da177e4SLinus Torvalds #define KEY_X 45 1581da177e4SLinus Torvalds #define KEY_C 46 1591da177e4SLinus Torvalds #define KEY_V 47 1601da177e4SLinus Torvalds #define KEY_B 48 1611da177e4SLinus Torvalds #define KEY_N 49 1621da177e4SLinus Torvalds #define KEY_M 50 1631da177e4SLinus Torvalds #define KEY_COMMA 51 1641da177e4SLinus Torvalds #define KEY_DOT 52 1651da177e4SLinus Torvalds #define KEY_SLASH 53 1661da177e4SLinus Torvalds #define KEY_RIGHTSHIFT 54 1671da177e4SLinus Torvalds #define KEY_KPASTERISK 55 1681da177e4SLinus Torvalds #define KEY_LEFTALT 56 1691da177e4SLinus Torvalds #define KEY_SPACE 57 1701da177e4SLinus Torvalds #define KEY_CAPSLOCK 58 1711da177e4SLinus Torvalds #define KEY_F1 59 1721da177e4SLinus Torvalds #define KEY_F2 60 1731da177e4SLinus Torvalds #define KEY_F3 61 1741da177e4SLinus Torvalds #define KEY_F4 62 1751da177e4SLinus Torvalds #define KEY_F5 63 1761da177e4SLinus Torvalds #define KEY_F6 64 1771da177e4SLinus Torvalds #define KEY_F7 65 1781da177e4SLinus Torvalds #define KEY_F8 66 1791da177e4SLinus Torvalds #define KEY_F9 67 1801da177e4SLinus Torvalds #define KEY_F10 68 1811da177e4SLinus Torvalds #define KEY_NUMLOCK 69 1821da177e4SLinus Torvalds #define KEY_SCROLLLOCK 70 1831da177e4SLinus Torvalds #define KEY_KP7 71 1841da177e4SLinus Torvalds #define KEY_KP8 72 1851da177e4SLinus Torvalds #define KEY_KP9 73 1861da177e4SLinus Torvalds #define KEY_KPMINUS 74 1871da177e4SLinus Torvalds #define KEY_KP4 75 1881da177e4SLinus Torvalds #define KEY_KP5 76 1891da177e4SLinus Torvalds #define KEY_KP6 77 1901da177e4SLinus Torvalds #define KEY_KPPLUS 78 1911da177e4SLinus Torvalds #define KEY_KP1 79 1921da177e4SLinus Torvalds #define KEY_KP2 80 1931da177e4SLinus Torvalds #define KEY_KP3 81 1941da177e4SLinus Torvalds #define KEY_KP0 82 1951da177e4SLinus Torvalds #define KEY_KPDOT 83 1961da177e4SLinus Torvalds 1971da177e4SLinus Torvalds #define KEY_ZENKAKUHANKAKU 85 1981da177e4SLinus Torvalds #define KEY_102ND 86 1991da177e4SLinus Torvalds #define KEY_F11 87 2001da177e4SLinus Torvalds #define KEY_F12 88 2011da177e4SLinus Torvalds #define KEY_RO 89 2021da177e4SLinus Torvalds #define KEY_KATAKANA 90 2031da177e4SLinus Torvalds #define KEY_HIRAGANA 91 2041da177e4SLinus Torvalds #define KEY_HENKAN 92 2051da177e4SLinus Torvalds #define KEY_KATAKANAHIRAGANA 93 2061da177e4SLinus Torvalds #define KEY_MUHENKAN 94 2071da177e4SLinus Torvalds #define KEY_KPJPCOMMA 95 2081da177e4SLinus Torvalds #define KEY_KPENTER 96 2091da177e4SLinus Torvalds #define KEY_RIGHTCTRL 97 2101da177e4SLinus Torvalds #define KEY_KPSLASH 98 2111da177e4SLinus Torvalds #define KEY_SYSRQ 99 2121da177e4SLinus Torvalds #define KEY_RIGHTALT 100 2131da177e4SLinus Torvalds #define KEY_LINEFEED 101 2141da177e4SLinus Torvalds #define KEY_HOME 102 2151da177e4SLinus Torvalds #define KEY_UP 103 2161da177e4SLinus Torvalds #define KEY_PAGEUP 104 2171da177e4SLinus Torvalds #define KEY_LEFT 105 2181da177e4SLinus Torvalds #define KEY_RIGHT 106 2191da177e4SLinus Torvalds #define KEY_END 107 2201da177e4SLinus Torvalds #define KEY_DOWN 108 2211da177e4SLinus Torvalds #define KEY_PAGEDOWN 109 2221da177e4SLinus Torvalds #define KEY_INSERT 110 2231da177e4SLinus Torvalds #define KEY_DELETE 111 2241da177e4SLinus Torvalds #define KEY_MACRO 112 2251da177e4SLinus Torvalds #define KEY_MUTE 113 2261da177e4SLinus Torvalds #define KEY_VOLUMEDOWN 114 2271da177e4SLinus Torvalds #define KEY_VOLUMEUP 115 2281da177e4SLinus Torvalds #define KEY_POWER 116 2291da177e4SLinus Torvalds #define KEY_KPEQUAL 117 2301da177e4SLinus Torvalds #define KEY_KPPLUSMINUS 118 2311da177e4SLinus Torvalds #define KEY_PAUSE 119 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds #define KEY_KPCOMMA 121 2341da177e4SLinus Torvalds #define KEY_HANGUEL 122 2351da177e4SLinus Torvalds #define KEY_HANJA 123 2361da177e4SLinus Torvalds #define KEY_YEN 124 2371da177e4SLinus Torvalds #define KEY_LEFTMETA 125 2381da177e4SLinus Torvalds #define KEY_RIGHTMETA 126 2391da177e4SLinus Torvalds #define KEY_COMPOSE 127 2401da177e4SLinus Torvalds 2411da177e4SLinus Torvalds #define KEY_STOP 128 2421da177e4SLinus Torvalds #define KEY_AGAIN 129 2431da177e4SLinus Torvalds #define KEY_PROPS 130 2441da177e4SLinus Torvalds #define KEY_UNDO 131 2451da177e4SLinus Torvalds #define KEY_FRONT 132 2461da177e4SLinus Torvalds #define KEY_COPY 133 2471da177e4SLinus Torvalds #define KEY_OPEN 134 2481da177e4SLinus Torvalds #define KEY_PASTE 135 2491da177e4SLinus Torvalds #define KEY_FIND 136 2501da177e4SLinus Torvalds #define KEY_CUT 137 2511da177e4SLinus Torvalds #define KEY_HELP 138 2521da177e4SLinus Torvalds #define KEY_MENU 139 2531da177e4SLinus Torvalds #define KEY_CALC 140 2541da177e4SLinus Torvalds #define KEY_SETUP 141 2551da177e4SLinus Torvalds #define KEY_SLEEP 142 2561da177e4SLinus Torvalds #define KEY_WAKEUP 143 2571da177e4SLinus Torvalds #define KEY_FILE 144 2581da177e4SLinus Torvalds #define KEY_SENDFILE 145 2591da177e4SLinus Torvalds #define KEY_DELETEFILE 146 2601da177e4SLinus Torvalds #define KEY_XFER 147 2611da177e4SLinus Torvalds #define KEY_PROG1 148 2621da177e4SLinus Torvalds #define KEY_PROG2 149 2631da177e4SLinus Torvalds #define KEY_WWW 150 2641da177e4SLinus Torvalds #define KEY_MSDOS 151 2651da177e4SLinus Torvalds #define KEY_COFFEE 152 2661da177e4SLinus Torvalds #define KEY_DIRECTION 153 2671da177e4SLinus Torvalds #define KEY_CYCLEWINDOWS 154 2681da177e4SLinus Torvalds #define KEY_MAIL 155 2691da177e4SLinus Torvalds #define KEY_BOOKMARKS 156 2701da177e4SLinus Torvalds #define KEY_COMPUTER 157 2711da177e4SLinus Torvalds #define KEY_BACK 158 2721da177e4SLinus Torvalds #define KEY_FORWARD 159 2731da177e4SLinus Torvalds #define KEY_CLOSECD 160 2741da177e4SLinus Torvalds #define KEY_EJECTCD 161 2751da177e4SLinus Torvalds #define KEY_EJECTCLOSECD 162 2761da177e4SLinus Torvalds #define KEY_NEXTSONG 163 2771da177e4SLinus Torvalds #define KEY_PLAYPAUSE 164 2781da177e4SLinus Torvalds #define KEY_PREVIOUSSONG 165 2791da177e4SLinus Torvalds #define KEY_STOPCD 166 2801da177e4SLinus Torvalds #define KEY_RECORD 167 2811da177e4SLinus Torvalds #define KEY_REWIND 168 2821da177e4SLinus Torvalds #define KEY_PHONE 169 2831da177e4SLinus Torvalds #define KEY_ISO 170 2841da177e4SLinus Torvalds #define KEY_CONFIG 171 2851da177e4SLinus Torvalds #define KEY_HOMEPAGE 172 2861da177e4SLinus Torvalds #define KEY_REFRESH 173 2871da177e4SLinus Torvalds #define KEY_EXIT 174 2881da177e4SLinus Torvalds #define KEY_MOVE 175 2891da177e4SLinus Torvalds #define KEY_EDIT 176 2901da177e4SLinus Torvalds #define KEY_SCROLLUP 177 2911da177e4SLinus Torvalds #define KEY_SCROLLDOWN 178 2921da177e4SLinus Torvalds #define KEY_KPLEFTPAREN 179 2931da177e4SLinus Torvalds #define KEY_KPRIGHTPAREN 180 2948a409b01SVojtech Pavlik #define KEY_NEW 181 2958a409b01SVojtech Pavlik #define KEY_REDO 182 2961da177e4SLinus Torvalds 2971da177e4SLinus Torvalds #define KEY_F13 183 2981da177e4SLinus Torvalds #define KEY_F14 184 2991da177e4SLinus Torvalds #define KEY_F15 185 3001da177e4SLinus Torvalds #define KEY_F16 186 3011da177e4SLinus Torvalds #define KEY_F17 187 3021da177e4SLinus Torvalds #define KEY_F18 188 3031da177e4SLinus Torvalds #define KEY_F19 189 3041da177e4SLinus Torvalds #define KEY_F20 190 3051da177e4SLinus Torvalds #define KEY_F21 191 3061da177e4SLinus Torvalds #define KEY_F22 192 3071da177e4SLinus Torvalds #define KEY_F23 193 3081da177e4SLinus Torvalds #define KEY_F24 194 3091da177e4SLinus Torvalds 3101da177e4SLinus Torvalds #define KEY_PLAYCD 200 3111da177e4SLinus Torvalds #define KEY_PAUSECD 201 3121da177e4SLinus Torvalds #define KEY_PROG3 202 3131da177e4SLinus Torvalds #define KEY_PROG4 203 3141da177e4SLinus Torvalds #define KEY_SUSPEND 205 3151da177e4SLinus Torvalds #define KEY_CLOSE 206 3161da177e4SLinus Torvalds #define KEY_PLAY 207 3171da177e4SLinus Torvalds #define KEY_FASTFORWARD 208 3181da177e4SLinus Torvalds #define KEY_BASSBOOST 209 3191da177e4SLinus Torvalds #define KEY_PRINT 210 3201da177e4SLinus Torvalds #define KEY_HP 211 3211da177e4SLinus Torvalds #define KEY_CAMERA 212 3221da177e4SLinus Torvalds #define KEY_SOUND 213 3231da177e4SLinus Torvalds #define KEY_QUESTION 214 3241da177e4SLinus Torvalds #define KEY_EMAIL 215 3251da177e4SLinus Torvalds #define KEY_CHAT 216 3261da177e4SLinus Torvalds #define KEY_SEARCH 217 3271da177e4SLinus Torvalds #define KEY_CONNECT 218 3281da177e4SLinus Torvalds #define KEY_FINANCE 219 3291da177e4SLinus Torvalds #define KEY_SPORT 220 3301da177e4SLinus Torvalds #define KEY_SHOP 221 3311da177e4SLinus Torvalds #define KEY_ALTERASE 222 3321da177e4SLinus Torvalds #define KEY_CANCEL 223 3331da177e4SLinus Torvalds #define KEY_BRIGHTNESSDOWN 224 3341da177e4SLinus Torvalds #define KEY_BRIGHTNESSUP 225 3351da177e4SLinus Torvalds #define KEY_MEDIA 226 3361da177e4SLinus Torvalds 337146a4b3bSAndreas Jaggi #define KEY_SWITCHVIDEOMODE 227 338146a4b3bSAndreas Jaggi #define KEY_KBDILLUMTOGGLE 228 339146a4b3bSAndreas Jaggi #define KEY_KBDILLUMDOWN 229 340146a4b3bSAndreas Jaggi #define KEY_KBDILLUMUP 230 341146a4b3bSAndreas Jaggi 3428a409b01SVojtech Pavlik #define KEY_SEND 231 3438a409b01SVojtech Pavlik #define KEY_REPLY 232 3448a409b01SVojtech Pavlik #define KEY_FORWARDMAIL 233 3458a409b01SVojtech Pavlik #define KEY_SAVE 234 3468a409b01SVojtech Pavlik #define KEY_DOCUMENTS 235 3478a409b01SVojtech Pavlik 3481da177e4SLinus Torvalds #define KEY_UNKNOWN 240 3491da177e4SLinus Torvalds 3501da177e4SLinus Torvalds #define BTN_MISC 0x100 3511da177e4SLinus Torvalds #define BTN_0 0x100 3521da177e4SLinus Torvalds #define BTN_1 0x101 3531da177e4SLinus Torvalds #define BTN_2 0x102 3541da177e4SLinus Torvalds #define BTN_3 0x103 3551da177e4SLinus Torvalds #define BTN_4 0x104 3561da177e4SLinus Torvalds #define BTN_5 0x105 3571da177e4SLinus Torvalds #define BTN_6 0x106 3581da177e4SLinus Torvalds #define BTN_7 0x107 3591da177e4SLinus Torvalds #define BTN_8 0x108 3601da177e4SLinus Torvalds #define BTN_9 0x109 3611da177e4SLinus Torvalds 3621da177e4SLinus Torvalds #define BTN_MOUSE 0x110 3631da177e4SLinus Torvalds #define BTN_LEFT 0x110 3641da177e4SLinus Torvalds #define BTN_RIGHT 0x111 3651da177e4SLinus Torvalds #define BTN_MIDDLE 0x112 3661da177e4SLinus Torvalds #define BTN_SIDE 0x113 3671da177e4SLinus Torvalds #define BTN_EXTRA 0x114 3681da177e4SLinus Torvalds #define BTN_FORWARD 0x115 3691da177e4SLinus Torvalds #define BTN_BACK 0x116 3701da177e4SLinus Torvalds #define BTN_TASK 0x117 3711da177e4SLinus Torvalds 3721da177e4SLinus Torvalds #define BTN_JOYSTICK 0x120 3731da177e4SLinus Torvalds #define BTN_TRIGGER 0x120 3741da177e4SLinus Torvalds #define BTN_THUMB 0x121 3751da177e4SLinus Torvalds #define BTN_THUMB2 0x122 3761da177e4SLinus Torvalds #define BTN_TOP 0x123 3771da177e4SLinus Torvalds #define BTN_TOP2 0x124 3781da177e4SLinus Torvalds #define BTN_PINKIE 0x125 3791da177e4SLinus Torvalds #define BTN_BASE 0x126 3801da177e4SLinus Torvalds #define BTN_BASE2 0x127 3811da177e4SLinus Torvalds #define BTN_BASE3 0x128 3821da177e4SLinus Torvalds #define BTN_BASE4 0x129 3831da177e4SLinus Torvalds #define BTN_BASE5 0x12a 3841da177e4SLinus Torvalds #define BTN_BASE6 0x12b 3851da177e4SLinus Torvalds #define BTN_DEAD 0x12f 3861da177e4SLinus Torvalds 3871da177e4SLinus Torvalds #define BTN_GAMEPAD 0x130 3881da177e4SLinus Torvalds #define BTN_A 0x130 3891da177e4SLinus Torvalds #define BTN_B 0x131 3901da177e4SLinus Torvalds #define BTN_C 0x132 3911da177e4SLinus Torvalds #define BTN_X 0x133 3921da177e4SLinus Torvalds #define BTN_Y 0x134 3931da177e4SLinus Torvalds #define BTN_Z 0x135 3941da177e4SLinus Torvalds #define BTN_TL 0x136 3951da177e4SLinus Torvalds #define BTN_TR 0x137 3961da177e4SLinus Torvalds #define BTN_TL2 0x138 3971da177e4SLinus Torvalds #define BTN_TR2 0x139 3981da177e4SLinus Torvalds #define BTN_SELECT 0x13a 3991da177e4SLinus Torvalds #define BTN_START 0x13b 4001da177e4SLinus Torvalds #define BTN_MODE 0x13c 4011da177e4SLinus Torvalds #define BTN_THUMBL 0x13d 4021da177e4SLinus Torvalds #define BTN_THUMBR 0x13e 4031da177e4SLinus Torvalds 4041da177e4SLinus Torvalds #define BTN_DIGI 0x140 4051da177e4SLinus Torvalds #define BTN_TOOL_PEN 0x140 4061da177e4SLinus Torvalds #define BTN_TOOL_RUBBER 0x141 4071da177e4SLinus Torvalds #define BTN_TOOL_BRUSH 0x142 4081da177e4SLinus Torvalds #define BTN_TOOL_PENCIL 0x143 4091da177e4SLinus Torvalds #define BTN_TOOL_AIRBRUSH 0x144 4101da177e4SLinus Torvalds #define BTN_TOOL_FINGER 0x145 4111da177e4SLinus Torvalds #define BTN_TOOL_MOUSE 0x146 4121da177e4SLinus Torvalds #define BTN_TOOL_LENS 0x147 4131da177e4SLinus Torvalds #define BTN_TOUCH 0x14a 4141da177e4SLinus Torvalds #define BTN_STYLUS 0x14b 4151da177e4SLinus Torvalds #define BTN_STYLUS2 0x14c 4161da177e4SLinus Torvalds #define BTN_TOOL_DOUBLETAP 0x14d 4171da177e4SLinus Torvalds #define BTN_TOOL_TRIPLETAP 0x14e 4181da177e4SLinus Torvalds 4191da177e4SLinus Torvalds #define BTN_WHEEL 0x150 4201da177e4SLinus Torvalds #define BTN_GEAR_DOWN 0x150 4211da177e4SLinus Torvalds #define BTN_GEAR_UP 0x151 4221da177e4SLinus Torvalds 4231da177e4SLinus Torvalds #define KEY_OK 0x160 4241da177e4SLinus Torvalds #define KEY_SELECT 0x161 4251da177e4SLinus Torvalds #define KEY_GOTO 0x162 4261da177e4SLinus Torvalds #define KEY_CLEAR 0x163 4271da177e4SLinus Torvalds #define KEY_POWER2 0x164 4281da177e4SLinus Torvalds #define KEY_OPTION 0x165 4291da177e4SLinus Torvalds #define KEY_INFO 0x166 4301da177e4SLinus Torvalds #define KEY_TIME 0x167 4311da177e4SLinus Torvalds #define KEY_VENDOR 0x168 4321da177e4SLinus Torvalds #define KEY_ARCHIVE 0x169 4331da177e4SLinus Torvalds #define KEY_PROGRAM 0x16a 4341da177e4SLinus Torvalds #define KEY_CHANNEL 0x16b 4351da177e4SLinus Torvalds #define KEY_FAVORITES 0x16c 4361da177e4SLinus Torvalds #define KEY_EPG 0x16d 4371da177e4SLinus Torvalds #define KEY_PVR 0x16e 4381da177e4SLinus Torvalds #define KEY_MHP 0x16f 4391da177e4SLinus Torvalds #define KEY_LANGUAGE 0x170 4401da177e4SLinus Torvalds #define KEY_TITLE 0x171 4411da177e4SLinus Torvalds #define KEY_SUBTITLE 0x172 4421da177e4SLinus Torvalds #define KEY_ANGLE 0x173 4431da177e4SLinus Torvalds #define KEY_ZOOM 0x174 4441da177e4SLinus Torvalds #define KEY_MODE 0x175 4451da177e4SLinus Torvalds #define KEY_KEYBOARD 0x176 4461da177e4SLinus Torvalds #define KEY_SCREEN 0x177 4471da177e4SLinus Torvalds #define KEY_PC 0x178 4481da177e4SLinus Torvalds #define KEY_TV 0x179 4491da177e4SLinus Torvalds #define KEY_TV2 0x17a 4501da177e4SLinus Torvalds #define KEY_VCR 0x17b 4511da177e4SLinus Torvalds #define KEY_VCR2 0x17c 4521da177e4SLinus Torvalds #define KEY_SAT 0x17d 4531da177e4SLinus Torvalds #define KEY_SAT2 0x17e 4541da177e4SLinus Torvalds #define KEY_CD 0x17f 4551da177e4SLinus Torvalds #define KEY_TAPE 0x180 4561da177e4SLinus Torvalds #define KEY_RADIO 0x181 4571da177e4SLinus Torvalds #define KEY_TUNER 0x182 4581da177e4SLinus Torvalds #define KEY_PLAYER 0x183 4591da177e4SLinus Torvalds #define KEY_TEXT 0x184 4601da177e4SLinus Torvalds #define KEY_DVD 0x185 4611da177e4SLinus Torvalds #define KEY_AUX 0x186 4621da177e4SLinus Torvalds #define KEY_MP3 0x187 4631da177e4SLinus Torvalds #define KEY_AUDIO 0x188 4641da177e4SLinus Torvalds #define KEY_VIDEO 0x189 4651da177e4SLinus Torvalds #define KEY_DIRECTORY 0x18a 4661da177e4SLinus Torvalds #define KEY_LIST 0x18b 4671da177e4SLinus Torvalds #define KEY_MEMO 0x18c 4681da177e4SLinus Torvalds #define KEY_CALENDAR 0x18d 4691da177e4SLinus Torvalds #define KEY_RED 0x18e 4701da177e4SLinus Torvalds #define KEY_GREEN 0x18f 4711da177e4SLinus Torvalds #define KEY_YELLOW 0x190 4721da177e4SLinus Torvalds #define KEY_BLUE 0x191 4731da177e4SLinus Torvalds #define KEY_CHANNELUP 0x192 4741da177e4SLinus Torvalds #define KEY_CHANNELDOWN 0x193 4751da177e4SLinus Torvalds #define KEY_FIRST 0x194 4761da177e4SLinus Torvalds #define KEY_LAST 0x195 4771da177e4SLinus Torvalds #define KEY_AB 0x196 4781da177e4SLinus Torvalds #define KEY_NEXT 0x197 4791da177e4SLinus Torvalds #define KEY_RESTART 0x198 4801da177e4SLinus Torvalds #define KEY_SLOW 0x199 4811da177e4SLinus Torvalds #define KEY_SHUFFLE 0x19a 4821da177e4SLinus Torvalds #define KEY_BREAK 0x19b 4831da177e4SLinus Torvalds #define KEY_PREVIOUS 0x19c 4841da177e4SLinus Torvalds #define KEY_DIGITS 0x19d 4851da177e4SLinus Torvalds #define KEY_TEEN 0x19e 4861da177e4SLinus Torvalds #define KEY_TWEN 0x19f 4871da177e4SLinus Torvalds 4881da177e4SLinus Torvalds #define KEY_DEL_EOL 0x1c0 4891da177e4SLinus Torvalds #define KEY_DEL_EOS 0x1c1 4901da177e4SLinus Torvalds #define KEY_INS_LINE 0x1c2 4911da177e4SLinus Torvalds #define KEY_DEL_LINE 0x1c3 4921da177e4SLinus Torvalds 4931da177e4SLinus Torvalds #define KEY_FN 0x1d0 4941da177e4SLinus Torvalds #define KEY_FN_ESC 0x1d1 4951da177e4SLinus Torvalds #define KEY_FN_F1 0x1d2 4961da177e4SLinus Torvalds #define KEY_FN_F2 0x1d3 4971da177e4SLinus Torvalds #define KEY_FN_F3 0x1d4 4981da177e4SLinus Torvalds #define KEY_FN_F4 0x1d5 4991da177e4SLinus Torvalds #define KEY_FN_F5 0x1d6 5001da177e4SLinus Torvalds #define KEY_FN_F6 0x1d7 5011da177e4SLinus Torvalds #define KEY_FN_F7 0x1d8 5021da177e4SLinus Torvalds #define KEY_FN_F8 0x1d9 5031da177e4SLinus Torvalds #define KEY_FN_F9 0x1da 5041da177e4SLinus Torvalds #define KEY_FN_F10 0x1db 5051da177e4SLinus Torvalds #define KEY_FN_F11 0x1dc 5061da177e4SLinus Torvalds #define KEY_FN_F12 0x1dd 5071da177e4SLinus Torvalds #define KEY_FN_1 0x1de 5081da177e4SLinus Torvalds #define KEY_FN_2 0x1df 5091da177e4SLinus Torvalds #define KEY_FN_D 0x1e0 5101da177e4SLinus Torvalds #define KEY_FN_E 0x1e1 5111da177e4SLinus Torvalds #define KEY_FN_F 0x1e2 5121da177e4SLinus Torvalds #define KEY_FN_S 0x1e3 5131da177e4SLinus Torvalds #define KEY_FN_B 0x1e4 5141da177e4SLinus Torvalds 515b9ec4e10SSamuel Thibault #define KEY_BRL_DOT1 0x1f1 516b9ec4e10SSamuel Thibault #define KEY_BRL_DOT2 0x1f2 517b9ec4e10SSamuel Thibault #define KEY_BRL_DOT3 0x1f3 518b9ec4e10SSamuel Thibault #define KEY_BRL_DOT4 0x1f4 519b9ec4e10SSamuel Thibault #define KEY_BRL_DOT5 0x1f5 520b9ec4e10SSamuel Thibault #define KEY_BRL_DOT6 0x1f6 521b9ec4e10SSamuel Thibault #define KEY_BRL_DOT7 0x1f7 522b9ec4e10SSamuel Thibault #define KEY_BRL_DOT8 0x1f8 523b9ec4e10SSamuel Thibault 5241d8f430cSRusty Russell /* We avoid low common keys in module aliases so they don't get huge. */ 5251d8f430cSRusty Russell #define KEY_MIN_INTERESTING KEY_MUTE 5261da177e4SLinus Torvalds #define KEY_MAX 0x1ff 5271da177e4SLinus Torvalds 5281da177e4SLinus Torvalds /* 5291da177e4SLinus Torvalds * Relative axes 5301da177e4SLinus Torvalds */ 5311da177e4SLinus Torvalds 5321da177e4SLinus Torvalds #define REL_X 0x00 5331da177e4SLinus Torvalds #define REL_Y 0x01 5341da177e4SLinus Torvalds #define REL_Z 0x02 5351da177e4SLinus Torvalds #define REL_RX 0x03 5361da177e4SLinus Torvalds #define REL_RY 0x04 5371da177e4SLinus Torvalds #define REL_RZ 0x05 5381da177e4SLinus Torvalds #define REL_HWHEEL 0x06 5391da177e4SLinus Torvalds #define REL_DIAL 0x07 5401da177e4SLinus Torvalds #define REL_WHEEL 0x08 5411da177e4SLinus Torvalds #define REL_MISC 0x09 5421da177e4SLinus Torvalds #define REL_MAX 0x0f 5431da177e4SLinus Torvalds 5441da177e4SLinus Torvalds /* 5451da177e4SLinus Torvalds * Absolute axes 5461da177e4SLinus Torvalds */ 5471da177e4SLinus Torvalds 5481da177e4SLinus Torvalds #define ABS_X 0x00 5491da177e4SLinus Torvalds #define ABS_Y 0x01 5501da177e4SLinus Torvalds #define ABS_Z 0x02 5511da177e4SLinus Torvalds #define ABS_RX 0x03 5521da177e4SLinus Torvalds #define ABS_RY 0x04 5531da177e4SLinus Torvalds #define ABS_RZ 0x05 5541da177e4SLinus Torvalds #define ABS_THROTTLE 0x06 5551da177e4SLinus Torvalds #define ABS_RUDDER 0x07 5561da177e4SLinus Torvalds #define ABS_WHEEL 0x08 5571da177e4SLinus Torvalds #define ABS_GAS 0x09 5581da177e4SLinus Torvalds #define ABS_BRAKE 0x0a 5591da177e4SLinus Torvalds #define ABS_HAT0X 0x10 5601da177e4SLinus Torvalds #define ABS_HAT0Y 0x11 5611da177e4SLinus Torvalds #define ABS_HAT1X 0x12 5621da177e4SLinus Torvalds #define ABS_HAT1Y 0x13 5631da177e4SLinus Torvalds #define ABS_HAT2X 0x14 5641da177e4SLinus Torvalds #define ABS_HAT2Y 0x15 5651da177e4SLinus Torvalds #define ABS_HAT3X 0x16 5661da177e4SLinus Torvalds #define ABS_HAT3Y 0x17 5671da177e4SLinus Torvalds #define ABS_PRESSURE 0x18 5681da177e4SLinus Torvalds #define ABS_DISTANCE 0x19 5691da177e4SLinus Torvalds #define ABS_TILT_X 0x1a 5701da177e4SLinus Torvalds #define ABS_TILT_Y 0x1b 5711da177e4SLinus Torvalds #define ABS_TOOL_WIDTH 0x1c 5721da177e4SLinus Torvalds #define ABS_VOLUME 0x20 5731da177e4SLinus Torvalds #define ABS_MISC 0x28 5741da177e4SLinus Torvalds #define ABS_MAX 0x3f 5751da177e4SLinus Torvalds 5761da177e4SLinus Torvalds /* 57731581066SRichard Purdie * Switch events 57831581066SRichard Purdie */ 57931581066SRichard Purdie 58031581066SRichard Purdie #define SW_0 0x00 58131581066SRichard Purdie #define SW_1 0x01 58231581066SRichard Purdie #define SW_2 0x02 58331581066SRichard Purdie #define SW_3 0x03 58431581066SRichard Purdie #define SW_4 0x04 58531581066SRichard Purdie #define SW_5 0x05 58631581066SRichard Purdie #define SW_6 0x06 58731581066SRichard Purdie #define SW_7 0x07 58831581066SRichard Purdie #define SW_MAX 0x0f 58931581066SRichard Purdie 59031581066SRichard Purdie /* 5911da177e4SLinus Torvalds * Misc events 5921da177e4SLinus Torvalds */ 5931da177e4SLinus Torvalds 5941da177e4SLinus Torvalds #define MSC_SERIAL 0x00 5951da177e4SLinus Torvalds #define MSC_PULSELED 0x01 5961da177e4SLinus Torvalds #define MSC_GESTURE 0x02 5971da177e4SLinus Torvalds #define MSC_RAW 0x03 5981da177e4SLinus Torvalds #define MSC_SCAN 0x04 5991da177e4SLinus Torvalds #define MSC_MAX 0x07 6001da177e4SLinus Torvalds 6011da177e4SLinus Torvalds /* 6021da177e4SLinus Torvalds * LEDs 6031da177e4SLinus Torvalds */ 6041da177e4SLinus Torvalds 6051da177e4SLinus Torvalds #define LED_NUML 0x00 6061da177e4SLinus Torvalds #define LED_CAPSL 0x01 6071da177e4SLinus Torvalds #define LED_SCROLLL 0x02 6081da177e4SLinus Torvalds #define LED_COMPOSE 0x03 6091da177e4SLinus Torvalds #define LED_KANA 0x04 6101da177e4SLinus Torvalds #define LED_SLEEP 0x05 6111da177e4SLinus Torvalds #define LED_SUSPEND 0x06 6121da177e4SLinus Torvalds #define LED_MUTE 0x07 6131da177e4SLinus Torvalds #define LED_MISC 0x08 6141da177e4SLinus Torvalds #define LED_MAIL 0x09 6151da177e4SLinus Torvalds #define LED_CHARGING 0x0a 6161da177e4SLinus Torvalds #define LED_MAX 0x0f 6171da177e4SLinus Torvalds 6181da177e4SLinus Torvalds /* 6191da177e4SLinus Torvalds * Autorepeat values 6201da177e4SLinus Torvalds */ 6211da177e4SLinus Torvalds 6221da177e4SLinus Torvalds #define REP_DELAY 0x00 6231da177e4SLinus Torvalds #define REP_PERIOD 0x01 6241da177e4SLinus Torvalds #define REP_MAX 0x01 6251da177e4SLinus Torvalds 6261da177e4SLinus Torvalds /* 6271da177e4SLinus Torvalds * Sounds 6281da177e4SLinus Torvalds */ 6291da177e4SLinus Torvalds 6301da177e4SLinus Torvalds #define SND_CLICK 0x00 6311da177e4SLinus Torvalds #define SND_BELL 0x01 6321da177e4SLinus Torvalds #define SND_TONE 0x02 6331da177e4SLinus Torvalds #define SND_MAX 0x07 6341da177e4SLinus Torvalds 6351da177e4SLinus Torvalds /* 6361da177e4SLinus Torvalds * IDs. 6371da177e4SLinus Torvalds */ 6381da177e4SLinus Torvalds 6391da177e4SLinus Torvalds #define ID_BUS 0 6401da177e4SLinus Torvalds #define ID_VENDOR 1 6411da177e4SLinus Torvalds #define ID_PRODUCT 2 6421da177e4SLinus Torvalds #define ID_VERSION 3 6431da177e4SLinus Torvalds 6441da177e4SLinus Torvalds #define BUS_PCI 0x01 6451da177e4SLinus Torvalds #define BUS_ISAPNP 0x02 6461da177e4SLinus Torvalds #define BUS_USB 0x03 6471da177e4SLinus Torvalds #define BUS_HIL 0x04 6481da177e4SLinus Torvalds #define BUS_BLUETOOTH 0x05 6491da177e4SLinus Torvalds 6501da177e4SLinus Torvalds #define BUS_ISA 0x10 6511da177e4SLinus Torvalds #define BUS_I8042 0x11 6521da177e4SLinus Torvalds #define BUS_XTKBD 0x12 6531da177e4SLinus Torvalds #define BUS_RS232 0x13 6541da177e4SLinus Torvalds #define BUS_GAMEPORT 0x14 6551da177e4SLinus Torvalds #define BUS_PARPORT 0x15 6561da177e4SLinus Torvalds #define BUS_AMIGA 0x16 6571da177e4SLinus Torvalds #define BUS_ADB 0x17 6581da177e4SLinus Torvalds #define BUS_I2C 0x18 6591da177e4SLinus Torvalds #define BUS_HOST 0x19 6606ab0f5cdSMatthew Wilcox #define BUS_GSC 0x1A 6611da177e4SLinus Torvalds 6621da177e4SLinus Torvalds /* 6631da177e4SLinus Torvalds * Values describing the status of an effect 6641da177e4SLinus Torvalds */ 6651da177e4SLinus Torvalds #define FF_STATUS_STOPPED 0x00 6661da177e4SLinus Torvalds #define FF_STATUS_PLAYING 0x01 6671da177e4SLinus Torvalds #define FF_STATUS_MAX 0x01 6681da177e4SLinus Torvalds 6691da177e4SLinus Torvalds /* 6701da177e4SLinus Torvalds * Structures used in ioctls to upload effects to a device 6711da177e4SLinus Torvalds * The first structures are not passed directly by using ioctls. 6721da177e4SLinus Torvalds * They are sub-structures of the actually sent structure (called ff_effect) 6731da177e4SLinus Torvalds */ 6741da177e4SLinus Torvalds 6751da177e4SLinus Torvalds struct ff_replay { 6761da177e4SLinus Torvalds __u16 length; /* Duration of an effect in ms. All other times are also expressed in ms */ 6771da177e4SLinus Torvalds __u16 delay; /* Time to wait before to start playing an effect */ 6781da177e4SLinus Torvalds }; 6791da177e4SLinus Torvalds 6801da177e4SLinus Torvalds struct ff_trigger { 6811da177e4SLinus Torvalds __u16 button; /* Number of button triggering an effect */ 6821da177e4SLinus Torvalds __u16 interval; /* Time to wait before an effect can be re-triggered (ms) */ 6831da177e4SLinus Torvalds }; 6841da177e4SLinus Torvalds 6851da177e4SLinus Torvalds struct ff_envelope { 6861da177e4SLinus Torvalds __u16 attack_length; /* Duration of attack (ms) */ 6871da177e4SLinus Torvalds __u16 attack_level; /* Level at beginning of attack */ 6881da177e4SLinus Torvalds __u16 fade_length; /* Duration of fade (ms) */ 6891da177e4SLinus Torvalds __u16 fade_level; /* Level at end of fade */ 6901da177e4SLinus Torvalds }; 6911da177e4SLinus Torvalds 6921da177e4SLinus Torvalds /* FF_CONSTANT */ 6931da177e4SLinus Torvalds struct ff_constant_effect { 6941da177e4SLinus Torvalds __s16 level; /* Strength of effect. Negative values are OK */ 6951da177e4SLinus Torvalds struct ff_envelope envelope; 6961da177e4SLinus Torvalds }; 6971da177e4SLinus Torvalds 6981da177e4SLinus Torvalds /* FF_RAMP */ 6991da177e4SLinus Torvalds struct ff_ramp_effect { 7001da177e4SLinus Torvalds __s16 start_level; 7011da177e4SLinus Torvalds __s16 end_level; 7021da177e4SLinus Torvalds struct ff_envelope envelope; 7031da177e4SLinus Torvalds }; 7041da177e4SLinus Torvalds 7051da177e4SLinus Torvalds /* FF_SPRING of FF_FRICTION */ 7061da177e4SLinus Torvalds struct ff_condition_effect { 7071da177e4SLinus Torvalds __u16 right_saturation; /* Max level when joystick is on the right */ 7081da177e4SLinus Torvalds __u16 left_saturation; /* Max level when joystick in on the left */ 7091da177e4SLinus Torvalds 7101da177e4SLinus Torvalds __s16 right_coeff; /* Indicates how fast the force grows when the 7111da177e4SLinus Torvalds joystick moves to the right */ 7121da177e4SLinus Torvalds __s16 left_coeff; /* Same for left side */ 7131da177e4SLinus Torvalds 7141da177e4SLinus Torvalds __u16 deadband; /* Size of area where no force is produced */ 7151da177e4SLinus Torvalds __s16 center; /* Position of dead zone */ 7161da177e4SLinus Torvalds 7171da177e4SLinus Torvalds }; 7181da177e4SLinus Torvalds 7191da177e4SLinus Torvalds /* FF_PERIODIC */ 7201da177e4SLinus Torvalds struct ff_periodic_effect { 7211da177e4SLinus Torvalds __u16 waveform; /* Kind of wave (sine, square...) */ 7221da177e4SLinus Torvalds __u16 period; /* in ms */ 7231da177e4SLinus Torvalds __s16 magnitude; /* Peak value */ 7241da177e4SLinus Torvalds __s16 offset; /* Mean value of wave (roughly) */ 7251da177e4SLinus Torvalds __u16 phase; /* 'Horizontal' shift */ 7261da177e4SLinus Torvalds 7271da177e4SLinus Torvalds struct ff_envelope envelope; 7281da177e4SLinus Torvalds 7291da177e4SLinus Torvalds /* Only used if waveform == FF_CUSTOM */ 7301da177e4SLinus Torvalds __u32 custom_len; /* Number of samples */ 7311da177e4SLinus Torvalds __s16 *custom_data; /* Buffer of samples */ 7321da177e4SLinus Torvalds /* Note: the data pointed by custom_data is copied by the driver. You can 7331da177e4SLinus Torvalds * therefore dispose of the memory after the upload/update */ 7341da177e4SLinus Torvalds }; 7351da177e4SLinus Torvalds 7361da177e4SLinus Torvalds /* FF_RUMBLE */ 7371da177e4SLinus Torvalds /* Some rumble pads have two motors of different weight. 7381da177e4SLinus Torvalds strong_magnitude represents the magnitude of the vibration generated 7391da177e4SLinus Torvalds by the heavy motor. 7401da177e4SLinus Torvalds */ 7411da177e4SLinus Torvalds struct ff_rumble_effect { 7421da177e4SLinus Torvalds __u16 strong_magnitude; /* Magnitude of the heavy motor */ 7431da177e4SLinus Torvalds __u16 weak_magnitude; /* Magnitude of the light one */ 7441da177e4SLinus Torvalds }; 7451da177e4SLinus Torvalds 7461da177e4SLinus Torvalds /* 7471da177e4SLinus Torvalds * Structure sent through ioctl from the application to the driver 7481da177e4SLinus Torvalds */ 7491da177e4SLinus Torvalds struct ff_effect { 7501da177e4SLinus Torvalds __u16 type; 7511da177e4SLinus Torvalds /* Following field denotes the unique id assigned to an effect. 7521da177e4SLinus Torvalds * If user sets if to -1, a new effect is created, and its id is returned in the same field 7531da177e4SLinus Torvalds * Else, the user sets it to the effect id it wants to update. 7541da177e4SLinus Torvalds */ 7551da177e4SLinus Torvalds __s16 id; 7561da177e4SLinus Torvalds 7571da177e4SLinus Torvalds __u16 direction; /* Direction. 0 deg -> 0x0000 (down) 7581da177e4SLinus Torvalds 90 deg -> 0x4000 (left) 7591da177e4SLinus Torvalds 180 deg -> 0x8000 (up) 7601da177e4SLinus Torvalds 270 deg -> 0xC000 (right) 7611da177e4SLinus Torvalds */ 7621da177e4SLinus Torvalds 7631da177e4SLinus Torvalds struct ff_trigger trigger; 7641da177e4SLinus Torvalds struct ff_replay replay; 7651da177e4SLinus Torvalds 7661da177e4SLinus Torvalds union { 7671da177e4SLinus Torvalds struct ff_constant_effect constant; 7681da177e4SLinus Torvalds struct ff_ramp_effect ramp; 7691da177e4SLinus Torvalds struct ff_periodic_effect periodic; 7701da177e4SLinus Torvalds struct ff_condition_effect condition[2]; /* One for each axis */ 7711da177e4SLinus Torvalds struct ff_rumble_effect rumble; 7721da177e4SLinus Torvalds } u; 7731da177e4SLinus Torvalds }; 7741da177e4SLinus Torvalds 7751da177e4SLinus Torvalds /* 7761da177e4SLinus Torvalds * Force feedback effect types 7771da177e4SLinus Torvalds */ 7781da177e4SLinus Torvalds 7791da177e4SLinus Torvalds #define FF_RUMBLE 0x50 7801da177e4SLinus Torvalds #define FF_PERIODIC 0x51 7811da177e4SLinus Torvalds #define FF_CONSTANT 0x52 7821da177e4SLinus Torvalds #define FF_SPRING 0x53 7831da177e4SLinus Torvalds #define FF_FRICTION 0x54 7841da177e4SLinus Torvalds #define FF_DAMPER 0x55 7851da177e4SLinus Torvalds #define FF_INERTIA 0x56 7861da177e4SLinus Torvalds #define FF_RAMP 0x57 7871da177e4SLinus Torvalds 7881da177e4SLinus Torvalds /* 7891da177e4SLinus Torvalds * Force feedback periodic effect types 7901da177e4SLinus Torvalds */ 7911da177e4SLinus Torvalds 7921da177e4SLinus Torvalds #define FF_SQUARE 0x58 7931da177e4SLinus Torvalds #define FF_TRIANGLE 0x59 7941da177e4SLinus Torvalds #define FF_SINE 0x5a 7951da177e4SLinus Torvalds #define FF_SAW_UP 0x5b 7961da177e4SLinus Torvalds #define FF_SAW_DOWN 0x5c 7971da177e4SLinus Torvalds #define FF_CUSTOM 0x5d 7981da177e4SLinus Torvalds 7991da177e4SLinus Torvalds /* 8001da177e4SLinus Torvalds * Set ff device properties 8011da177e4SLinus Torvalds */ 8021da177e4SLinus Torvalds 8031da177e4SLinus Torvalds #define FF_GAIN 0x60 8041da177e4SLinus Torvalds #define FF_AUTOCENTER 0x61 8051da177e4SLinus Torvalds 8061da177e4SLinus Torvalds #define FF_MAX 0x7f 8071da177e4SLinus Torvalds 8081d8f430cSRusty Russell struct input_device_id { 8091d8f430cSRusty Russell 8101d8f430cSRusty Russell kernel_ulong_t flags; 8111d8f430cSRusty Russell 8121d8f430cSRusty Russell struct input_id id; 8131d8f430cSRusty Russell 8141d8f430cSRusty Russell kernel_ulong_t evbit[EV_MAX/BITS_PER_LONG+1]; 8151d8f430cSRusty Russell kernel_ulong_t keybit[KEY_MAX/BITS_PER_LONG+1]; 8161d8f430cSRusty Russell kernel_ulong_t relbit[REL_MAX/BITS_PER_LONG+1]; 8171d8f430cSRusty Russell kernel_ulong_t absbit[ABS_MAX/BITS_PER_LONG+1]; 8181d8f430cSRusty Russell kernel_ulong_t mscbit[MSC_MAX/BITS_PER_LONG+1]; 8191d8f430cSRusty Russell kernel_ulong_t ledbit[LED_MAX/BITS_PER_LONG+1]; 8201d8f430cSRusty Russell kernel_ulong_t sndbit[SND_MAX/BITS_PER_LONG+1]; 8211d8f430cSRusty Russell kernel_ulong_t ffbit[FF_MAX/BITS_PER_LONG+1]; 8221d8f430cSRusty Russell kernel_ulong_t swbit[SW_MAX/BITS_PER_LONG+1]; 8231d8f430cSRusty Russell 8241d8f430cSRusty Russell kernel_ulong_t driver_info; 8251d8f430cSRusty Russell }; 8261d8f430cSRusty Russell 8271d8f430cSRusty Russell /* 8281d8f430cSRusty Russell * Structure for hotplug & device<->driver matching. 8291d8f430cSRusty Russell */ 8301d8f430cSRusty Russell 8311d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_BUS 1 8321d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_VENDOR 2 8331d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_PRODUCT 4 8341d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_VERSION 8 8351d8f430cSRusty Russell 8361d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_EVBIT 0x010 8371d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020 8381d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_RELBIT 0x040 8391d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080 8401d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_MSCIT 0x100 8411d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200 8421d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400 8431d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_FFBIT 0x800 8441d8f430cSRusty Russell #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 8451d8f430cSRusty Russell 8461da177e4SLinus Torvalds #ifdef __KERNEL__ 8471da177e4SLinus Torvalds 8481da177e4SLinus Torvalds /* 8491da177e4SLinus Torvalds * In-kernel definitions. 8501da177e4SLinus Torvalds */ 8511da177e4SLinus Torvalds 8521da177e4SLinus Torvalds #include <linux/fs.h> 8531da177e4SLinus Torvalds #include <linux/timer.h> 8541da177e4SLinus Torvalds 8551da177e4SLinus Torvalds #define NBITS(x) (((x)/BITS_PER_LONG)+1) 8561da177e4SLinus Torvalds #define BIT(x) (1UL<<((x)%BITS_PER_LONG)) 8571da177e4SLinus Torvalds #define LONG(x) ((x)/BITS_PER_LONG) 8581da177e4SLinus Torvalds 8591da177e4SLinus Torvalds #define INPUT_KEYCODE(dev, scancode) ((dev->keycodesize == 1) ? ((u8*)dev->keycode)[scancode] : \ 8601da177e4SLinus Torvalds ((dev->keycodesize == 2) ? ((u16*)dev->keycode)[scancode] : (((u32*)dev->keycode)[scancode]))) 8611da177e4SLinus Torvalds 8621da177e4SLinus Torvalds #define SET_INPUT_KEYCODE(dev, scancode, val) \ 8631da177e4SLinus Torvalds ({ unsigned __old; \ 8641da177e4SLinus Torvalds switch (dev->keycodesize) { \ 8651da177e4SLinus Torvalds case 1: { \ 8661da177e4SLinus Torvalds u8 *k = (u8 *)dev->keycode; \ 8671da177e4SLinus Torvalds __old = k[scancode]; \ 8681da177e4SLinus Torvalds k[scancode] = val; \ 8691da177e4SLinus Torvalds break; \ 8701da177e4SLinus Torvalds } \ 8711da177e4SLinus Torvalds case 2: { \ 8721da177e4SLinus Torvalds u16 *k = (u16 *)dev->keycode; \ 8731da177e4SLinus Torvalds __old = k[scancode]; \ 8741da177e4SLinus Torvalds k[scancode] = val; \ 8751da177e4SLinus Torvalds break; \ 8761da177e4SLinus Torvalds } \ 8771da177e4SLinus Torvalds default: { \ 8781da177e4SLinus Torvalds u32 *k = (u32 *)dev->keycode; \ 8791da177e4SLinus Torvalds __old = k[scancode]; \ 8801da177e4SLinus Torvalds k[scancode] = val; \ 8811da177e4SLinus Torvalds break; \ 8821da177e4SLinus Torvalds } \ 8831da177e4SLinus Torvalds } \ 8841da177e4SLinus Torvalds __old; }) 8851da177e4SLinus Torvalds 8861da177e4SLinus Torvalds struct input_dev { 8871da177e4SLinus Torvalds 8881da177e4SLinus Torvalds void *private; 8891da177e4SLinus Torvalds 8905b6271bdSDmitry Torokhov const char *name; 8915b6271bdSDmitry Torokhov const char *phys; 8925b6271bdSDmitry Torokhov const char *uniq; 8931da177e4SLinus Torvalds struct input_id id; 8941da177e4SLinus Torvalds 8951da177e4SLinus Torvalds unsigned long evbit[NBITS(EV_MAX)]; 8961da177e4SLinus Torvalds unsigned long keybit[NBITS(KEY_MAX)]; 8971da177e4SLinus Torvalds unsigned long relbit[NBITS(REL_MAX)]; 8981da177e4SLinus Torvalds unsigned long absbit[NBITS(ABS_MAX)]; 8991da177e4SLinus Torvalds unsigned long mscbit[NBITS(MSC_MAX)]; 9001da177e4SLinus Torvalds unsigned long ledbit[NBITS(LED_MAX)]; 9011da177e4SLinus Torvalds unsigned long sndbit[NBITS(SND_MAX)]; 9021da177e4SLinus Torvalds unsigned long ffbit[NBITS(FF_MAX)]; 90331581066SRichard Purdie unsigned long swbit[NBITS(SW_MAX)]; 9041da177e4SLinus Torvalds int ff_effects_max; 9051da177e4SLinus Torvalds 9061da177e4SLinus Torvalds unsigned int keycodemax; 9071da177e4SLinus Torvalds unsigned int keycodesize; 9081da177e4SLinus Torvalds void *keycode; 9091da177e4SLinus Torvalds 9101da177e4SLinus Torvalds unsigned int repeat_key; 9111da177e4SLinus Torvalds struct timer_list timer; 9121da177e4SLinus Torvalds 9131da177e4SLinus Torvalds struct pt_regs *regs; 9141da177e4SLinus Torvalds int state; 9151da177e4SLinus Torvalds 9161da177e4SLinus Torvalds int sync; 9171da177e4SLinus Torvalds 9181da177e4SLinus Torvalds int abs[ABS_MAX + 1]; 9191da177e4SLinus Torvalds int rep[REP_MAX + 1]; 9201da177e4SLinus Torvalds 9211da177e4SLinus Torvalds unsigned long key[NBITS(KEY_MAX)]; 9221da177e4SLinus Torvalds unsigned long led[NBITS(LED_MAX)]; 9231da177e4SLinus Torvalds unsigned long snd[NBITS(SND_MAX)]; 92431581066SRichard Purdie unsigned long sw[NBITS(SW_MAX)]; 9251da177e4SLinus Torvalds 9261da177e4SLinus Torvalds int absmax[ABS_MAX + 1]; 9271da177e4SLinus Torvalds int absmin[ABS_MAX + 1]; 9281da177e4SLinus Torvalds int absfuzz[ABS_MAX + 1]; 9291da177e4SLinus Torvalds int absflat[ABS_MAX + 1]; 9301da177e4SLinus Torvalds 9311da177e4SLinus Torvalds int (*open)(struct input_dev *dev); 9321da177e4SLinus Torvalds void (*close)(struct input_dev *dev); 9331da177e4SLinus Torvalds int (*accept)(struct input_dev *dev, struct file *file); 9341da177e4SLinus Torvalds int (*flush)(struct input_dev *dev, struct file *file); 9351da177e4SLinus Torvalds int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); 9361da177e4SLinus Torvalds int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect); 9371da177e4SLinus Torvalds int (*erase_effect)(struct input_dev *dev, int effect_id); 9381da177e4SLinus Torvalds 9391da177e4SLinus Torvalds struct input_handle *grab; 9400fbf87caSDmitry Torokhov 941e676c232SJes Sorensen struct mutex mutex; /* serializes open and close operations */ 9420fbf87caSDmitry Torokhov unsigned int users; 9430fbf87caSDmitry Torokhov 944d19fbe8aSDmitry Torokhov struct class_device cdev; 945d19fbe8aSDmitry Torokhov struct device *dev; /* will be removed soon */ 946d19fbe8aSDmitry Torokhov 947d19fbe8aSDmitry Torokhov int dynalloc; /* temporarily */ 9481da177e4SLinus Torvalds 9491da177e4SLinus Torvalds struct list_head h_list; 9501da177e4SLinus Torvalds struct list_head node; 9511da177e4SLinus Torvalds }; 952d19fbe8aSDmitry Torokhov #define to_input_dev(d) container_of(d, struct input_dev, cdev) 9531da177e4SLinus Torvalds 9541da177e4SLinus Torvalds #define INPUT_DEVICE_ID_MATCH_DEVICE\ 9551da177e4SLinus Torvalds (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) 9561da177e4SLinus Torvalds #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION\ 9571da177e4SLinus Torvalds (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION) 9581da177e4SLinus Torvalds 9591da177e4SLinus Torvalds struct input_handle; 9601da177e4SLinus Torvalds 9611da177e4SLinus Torvalds struct input_handler { 9621da177e4SLinus Torvalds 9631da177e4SLinus Torvalds void *private; 9641da177e4SLinus Torvalds 9651da177e4SLinus Torvalds void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); 9661da177e4SLinus Torvalds struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); 9671da177e4SLinus Torvalds void (*disconnect)(struct input_handle *handle); 9681da177e4SLinus Torvalds 96999ac48f5SArjan van de Ven const struct file_operations *fops; 9701da177e4SLinus Torvalds int minor; 9711da177e4SLinus Torvalds char *name; 9721da177e4SLinus Torvalds 9731da177e4SLinus Torvalds struct input_device_id *id_table; 9741da177e4SLinus Torvalds struct input_device_id *blacklist; 9751da177e4SLinus Torvalds 9761da177e4SLinus Torvalds struct list_head h_list; 9771da177e4SLinus Torvalds struct list_head node; 9781da177e4SLinus Torvalds }; 9791da177e4SLinus Torvalds 9801da177e4SLinus Torvalds struct input_handle { 9811da177e4SLinus Torvalds 9821da177e4SLinus Torvalds void *private; 9831da177e4SLinus Torvalds 9841da177e4SLinus Torvalds int open; 9851da177e4SLinus Torvalds char *name; 9861da177e4SLinus Torvalds 9871da177e4SLinus Torvalds struct input_dev *dev; 9881da177e4SLinus Torvalds struct input_handler *handler; 9891da177e4SLinus Torvalds 9901da177e4SLinus Torvalds struct list_head d_node; 9911da177e4SLinus Torvalds struct list_head h_node; 9921da177e4SLinus Torvalds }; 9931da177e4SLinus Torvalds 9941da177e4SLinus Torvalds #define to_dev(n) container_of(n,struct input_dev,node) 9951da177e4SLinus Torvalds #define to_handler(n) container_of(n,struct input_handler,node); 9961da177e4SLinus Torvalds #define to_handle(n) container_of(n,struct input_handle,d_node) 9971da177e4SLinus Torvalds #define to_handle_h(n) container_of(n,struct input_handle,h_node) 9981da177e4SLinus Torvalds 9991da177e4SLinus Torvalds static inline void init_input_dev(struct input_dev *dev) 10001da177e4SLinus Torvalds { 10011da177e4SLinus Torvalds INIT_LIST_HEAD(&dev->h_list); 10021da177e4SLinus Torvalds INIT_LIST_HEAD(&dev->node); 10031da177e4SLinus Torvalds } 10041da177e4SLinus Torvalds 1005d19fbe8aSDmitry Torokhov struct input_dev *input_allocate_device(void); 1006d19fbe8aSDmitry Torokhov 1007d19fbe8aSDmitry Torokhov static inline struct input_dev *input_get_device(struct input_dev *dev) 1008d19fbe8aSDmitry Torokhov { 1009d19fbe8aSDmitry Torokhov return to_input_dev(class_device_get(&dev->cdev)); 1010d19fbe8aSDmitry Torokhov } 1011d19fbe8aSDmitry Torokhov 1012d19fbe8aSDmitry Torokhov static inline void input_put_device(struct input_dev *dev) 1013d19fbe8aSDmitry Torokhov { 1014d19fbe8aSDmitry Torokhov class_device_put(&dev->cdev); 1015d19fbe8aSDmitry Torokhov } 1016d19fbe8aSDmitry Torokhov 1017493a7e0dSDmitry Torokhov static inline void input_free_device(struct input_dev *dev) 1018493a7e0dSDmitry Torokhov { 1019*1a0cceceSDmitry Torokhov if (dev) 1020493a7e0dSDmitry Torokhov input_put_device(dev); 1021493a7e0dSDmitry Torokhov } 1022493a7e0dSDmitry Torokhov 10235f945489SDmitry Torokhov int input_register_device(struct input_dev *); 10241da177e4SLinus Torvalds void input_unregister_device(struct input_dev *); 10251da177e4SLinus Torvalds 10261da177e4SLinus Torvalds void input_register_handler(struct input_handler *); 10271da177e4SLinus Torvalds void input_unregister_handler(struct input_handler *); 10281da177e4SLinus Torvalds 10291da177e4SLinus Torvalds int input_grab_device(struct input_handle *); 10301da177e4SLinus Torvalds void input_release_device(struct input_handle *); 10311da177e4SLinus Torvalds 10321da177e4SLinus Torvalds int input_open_device(struct input_handle *); 10331da177e4SLinus Torvalds void input_close_device(struct input_handle *); 10341da177e4SLinus Torvalds 10351da177e4SLinus Torvalds int input_accept_process(struct input_handle *handle, struct file *file); 10361da177e4SLinus Torvalds int input_flush_device(struct input_handle* handle, struct file* file); 10371da177e4SLinus Torvalds 10381da177e4SLinus Torvalds void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); 10391da177e4SLinus Torvalds 10401da177e4SLinus Torvalds static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) 10411da177e4SLinus Torvalds { 10421da177e4SLinus Torvalds input_event(dev, EV_KEY, code, !!value); 10431da177e4SLinus Torvalds } 10441da177e4SLinus Torvalds 10451da177e4SLinus Torvalds static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value) 10461da177e4SLinus Torvalds { 10471da177e4SLinus Torvalds input_event(dev, EV_REL, code, value); 10481da177e4SLinus Torvalds } 10491da177e4SLinus Torvalds 10501da177e4SLinus Torvalds static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value) 10511da177e4SLinus Torvalds { 10521da177e4SLinus Torvalds input_event(dev, EV_ABS, code, value); 10531da177e4SLinus Torvalds } 10541da177e4SLinus Torvalds 10551da177e4SLinus Torvalds static inline void input_report_ff(struct input_dev *dev, unsigned int code, int value) 10561da177e4SLinus Torvalds { 10571da177e4SLinus Torvalds input_event(dev, EV_FF, code, value); 10581da177e4SLinus Torvalds } 10591da177e4SLinus Torvalds 10601da177e4SLinus Torvalds static inline void input_report_ff_status(struct input_dev *dev, unsigned int code, int value) 10611da177e4SLinus Torvalds { 10621da177e4SLinus Torvalds input_event(dev, EV_FF_STATUS, code, value); 10631da177e4SLinus Torvalds } 10641da177e4SLinus Torvalds 106531581066SRichard Purdie static inline void input_report_switch(struct input_dev *dev, unsigned int code, int value) 106631581066SRichard Purdie { 106731581066SRichard Purdie input_event(dev, EV_SW, code, !!value); 106831581066SRichard Purdie } 106931581066SRichard Purdie 10701da177e4SLinus Torvalds static inline void input_regs(struct input_dev *dev, struct pt_regs *regs) 10711da177e4SLinus Torvalds { 10721da177e4SLinus Torvalds dev->regs = regs; 10731da177e4SLinus Torvalds } 10741da177e4SLinus Torvalds 10751da177e4SLinus Torvalds static inline void input_sync(struct input_dev *dev) 10761da177e4SLinus Torvalds { 10771da177e4SLinus Torvalds input_event(dev, EV_SYN, SYN_REPORT, 0); 10781da177e4SLinus Torvalds dev->regs = NULL; 10791da177e4SLinus Torvalds } 10801da177e4SLinus Torvalds 10811da177e4SLinus Torvalds static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat) 10821da177e4SLinus Torvalds { 10831da177e4SLinus Torvalds dev->absmin[axis] = min; 10841da177e4SLinus Torvalds dev->absmax[axis] = max; 10851da177e4SLinus Torvalds dev->absfuzz[axis] = fuzz; 10861da177e4SLinus Torvalds dev->absflat[axis] = flat; 10871da177e4SLinus Torvalds 10881da177e4SLinus Torvalds dev->absbit[LONG(axis)] |= BIT(axis); 10891da177e4SLinus Torvalds } 10901da177e4SLinus Torvalds 1091ea9f240bSGreg Kroah-Hartman extern struct class input_class; 10921da177e4SLinus Torvalds 10931da177e4SLinus Torvalds #endif 10941da177e4SLinus Torvalds #endif 1095