]> gitweb.factorcode.org Git - factor.git/blob - basis/linux/input-events/ffi/ffi.factor
classes.struct: moving to new/boa instead of <struct>/<struct-boa>
[factor.git] / basis / linux / input-events / ffi / ffi.factor
1 ! Copyright (C) 2021 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types alien.data alien.syntax byte-arrays
4 classes.struct combinators continuations io.encodings.string
5 io.encodings.utf8 kernel libc math math.vectors sequences
6 splitting unix.ffi unix.types ;
7 IN: linux.input-events.ffi
8
9 ! IOCTLs 0x00-0x7f
10 STRUCT: input_id
11     { bustype __u16 }
12     { vendor __u16 }
13     { product __u16 }
14     { version __u16 } ;
15
16 STRUCT: input_absinfo
17     { value __s32 }
18     { minimum __s32 }
19     { maximum __s32 }
20     { fuzz __s32 }
21     { flat __s32 }
22     { resolution __s32 } ;
23
24 STRUCT: input_keymap_entry
25     { flags __u8 }
26     { len __u8 }
27     { index __u16 }
28     { keycode __u32 }
29     { scancode __u8[32] } ;
30
31 STRUCT: input_mask
32     { type __u32 }
33     { codes_size __u32 }
34     { codes_ptr __u64 } ;
35
36 STRUCT: ff_replay
37     { length __u16 }
38     { delay __u16 } ;
39
40 STRUCT: ff_trigger
41     { button __u16 }
42     { interval __u16 } ;
43
44 STRUCT: ff_envelope
45     { attack_length __u16 }
46     { attack_level __u16 }
47     { fade_length __u16 }
48     { fade_level __u16 } ;
49
50 STRUCT: ff_constant_effect
51     { level __s16 }
52     { envelope ff_envelope } ;
53
54 STRUCT: ff_ramp_effect
55     { start_level __s16 }
56     { end_level __s16 }
57     { envelope ff_envelope } ;
58
59 STRUCT: ff_condition_effect
60     { right_saturation __u16 }
61     { left_saturation __u16 }
62     { right_coeff __s16 }
63     { left_coeff __s16 }
64     { deadband __u16 }
65     { center __s16 } ;
66
67 STRUCT: ff_periodic_effect
68     { waveform __u16 }
69     { period __u16 }
70     { magnitude __s16 }
71     { offset __s16 }
72     { phase __u16 }
73     { envelope ff_envelope }
74     { custom_len __u32 }
75     { custom_data __s16* } ;
76
77 STRUCT: ff_rumble_effect
78     { strong_magnitude __u16 }
79     { weak_magnitude __u16 } ;
80
81 UNION-STRUCT: ff_dummy
82     { constant ff_constant_effect }
83     { ramp ff_ramp_effect }
84     { periodic ff_periodic_effect }
85     { condition ff_condition_effect[2] } ! One for each axis
86     { rumble ff_rumble_effect } ;
87
88 ! direction in degrees, 0, 90, 180, 270: 0x0000 down, 0x4000 left, 0x8000 up, 0xc000 right
89 STRUCT: ff_effect
90     { type __u16 }
91     { id __s16 }
92     { direction __u16 }
93     { trigger ff_trigger }
94     { replay ff_replay }
95     { union ff_dummy } ;
96
97 : n>explode-values ( x -- seq )
98     [ dup 0 > ]
99     [ dup log2 2^ [ bitxor ] keep ] produce nip reverse ; inline
100
101 : n>explode-positions ( x -- seq )
102     n>explode-values [ log2 ] map ; inline
103
104 : seq>explode-values ( seq -- seq' )
105     [ [ n>explode-values ] dip 8 * v+n ] map-index concat ;
106
107 : seq>explode-positions ( seq -- seq' )
108     [ [ n>explode-positions ] dip 8 * v+n ] map-index concat ;
109
110 : values>implode ( seq -- x ) 0 [ bitor ] reduce ;
111 : positions>implode ( seq -- x ) 0 [ 2^ bitor ] reduce ;
112
113 CONSTANT: IOC_NONE 0
114 CONSTANT: IOC_WRITE 1
115 CONSTANT: IOC_READ 2
116
117 ! IOC is encoded as:
118 CONSTANT: IOC_NRBITS 8
119 CONSTANT: IOC_TYPEBITS 8
120 CONSTANT: IOC_SIZEBITS 14
121 CONSTANT: IOC_DIRBITS 2
122
123 CONSTANT: IOC_NRSHIFT 0
124 CONSTANT: IOC_TYPESHIFT 8  ! NRSHIFT + NRBITS
125 CONSTANT: IOC_SIZESHIFT 16 ! TYPESHIFT + TYEPBITS
126 CONSTANT: IOC_DIRSHIFT 30  ! SIZESHIFT + SIZEBITS
127
128 : IOC ( dir type-ch nr c-size -- x )
129     {
130         [ IOC_DIRSHIFT shift ]
131         [ IOC_TYPESHIFT shift ]
132         [ IOC_NRSHIFT shift ]
133         [ IOC_SIZESHIFT shift ]
134     } spread + + + ; inline
135
136 : IOR-size ( type-ch nr size -- x )
137     [ IOC_READ ] 3dip IOC ; inline
138
139 : IOR ( type-ch nr c-type -- x c-type )
140     [ IOC_READ ] 3dip [ heap-size IOC ] keep ; inline
141
142 : IOW ( type-ch nr struct -- x struct )
143     [ IOC_WRITE ] 3dip [ byte-length IOC ] keep ; inline
144 : IOW-size ( type-ch nr size -- x )
145     [ IOC_WRITE ] 3dip IOC ; inline
146
147 : call-ioctl ( handle id bytes -- ) ioctl io-error ; inline
148 : call-ioctl-out ( handle id bytes -- out )
149     [ ioctl io-error ] keep ; inline
150
151 : <0ref> ( type -- ref ) 0 swap <ref> ; inline
152 : byte-array-ioctl ( handle id len -- out )
153     <byte-array> call-ioctl-out ; inline
154 : c-array-ioctl ( handle id ctype -- out )
155     heap-size <byte-array> call-ioctl-out ; inline
156 : c-string-ioctl ( handle id ctype -- out )
157     c-array-ioctl "\0" split1 drop utf8 decode ;
158 : ctype-ioctl-out ( handle id ctype -- out )
159     [ <0ref> call-ioctl-out ] keep deref ; inline
160 : ctype-ioctl-inout ( handle id bytes type -- out )
161     [ call-ioctl-out ] dip deref ; inline
162 : struct-ioctl ( handle id struct-class -- out )
163     new call-ioctl-out ; inline
164
165 ! EV IOC G/S - evdev ioctl get/set
166 ! EVIOCGVERSION EVIOCGID EVIOCGREP EVIOCSREP
167 : evdev-get-version ( handle -- version ) CHAR: E 0x01 int IOR ctype-ioctl-out ;
168 : evdev-get-id ( handle -- version ) CHAR: E 0x02 input_id IOR struct-ioctl ;
169 : evdev-get-repeat ( handle -- version ) CHAR: E 0x03 { int 2 } IOR c-array-ioctl ;
170 : evdev-set-repeat ( handle struct -- version )
171     [ CHAR: E 0x03 ] dip IOW call-ioctl-out ;
172 ! EVIOCGKEYCODE EVIOCGKEYCODE_V2 EVIOCSKEYCODE EVIOCSKEYCODE_V2
173 : evdev-get-keycode ( handle -- int[2] ) CHAR: E 0x04 { int 2 } IOR c-array-ioctl ;
174 : evdev-get-keycode-v2 ( handle -- input_keymap_entry ) CHAR: E 0x04 input_keymap_entry IOR struct-ioctl ;
175 : evdev-set-keycode ( handle int[2] -- out ) [ CHAR: E 0x04 ] dip IOW call-ioctl-out ;
176 : evdev-set-keycode-v2 ( handle input_keymap_entry -- out ) [ CHAR: E 0x04 ] dip IOW call-ioctl-out ;
177 ! EVIOCGNAME EVIOCGPHYS EVIOCGUNIQ EVIOCGPROP
178 : evdev-get-name ( handle -- name ) CHAR: E 0x06 { char 256 } IOR c-string-ioctl ;
179 : evdev-get-physical ( handle -- physical ) CHAR: E 0x07 { char 256 } IOR c-string-ioctl ;
180 : evdev-get-unique ( handle -- unique )
181     '[ _ CHAR: E 0x08 { char 512 } IOR c-string-ioctl ] [ drop "" ] recover ;
182 : evdev-get-prop ( handle -- prop ) CHAR: E 0x09 { char 256 } IOR c-string-ioctl ;
183 ! EVIOCGMTSLOTS, size is encoded by IOR
184 STRUCT: input_mt_request_layout
185     { code __u32 }
186     { values __s32* } ; ! values[num_slots]
187 : evdev-get-mt-slots ( handle size input_mt_request_layout -- prop )
188     '[ _ CHAR: E 0x0a _ IOR-size _ call-ioctl-out ] [ drop f ] recover ;
189 ! EVIOCGKEY EVIOCGLED EVIOCGSND EVIOCGSW EVIOCGABS EVIOCSABS
190 : evdev-get-key ( handle -- bytes ) CHAR: E 0x18 256 IOR-size 256 byte-array-ioctl ;
191 : evdev-get-led ( handle -- bytes ) CHAR: E 0x19 256 IOR-size 256 byte-array-ioctl ;
192 : evdev-get-sound ( handle -- bytes ) CHAR: E 0x1a 256 IOR-size 256 byte-array-ioctl ;
193 : evdev-get-switch ( handle -- bytes ) CHAR: E 0x1b 256 IOR-size 256 byte-array-ioctl ;
194 : evdev-get-abs ( handle n -- int[6] ) [ CHAR: E ] dip 0x40 + input_absinfo IOR struct-ioctl ;
195 : evdev-set-abs ( handle input_absinfo -- int[6] ) [ CHAR: E ] dip 0xc0 + input_absinfo IOW struct-ioctl ;
196 ! EVIOCSFF EVIOCRMFF EVIOCGEFFECTS
197 : evdev-set-force-feedback ( handle ff_effect -- out )
198     [ CHAR: E 0x80 ] dip IOW call-ioctl-out ;
199 : evdev-unset-force-feedback ( handle int -- int )
200     [ CHAR: E 0x81 ] dip IOW int ctype-ioctl-inout ;
201 : evdev-get-simulataneous-effects ( handle -- int )
202     CHAR: E 0x84 int IOR ctype-ioctl-out ;
203 ! EVIOCGRAB EVIOCREVOKE
204 : evdev-grab-device ( handle -- int )
205     CHAR: E 0x90 69 int <ref> IOW int ctype-ioctl-inout ;
206 : evdev-ungrab-device ( handle -- )
207     CHAR: E 0x90 4 IOW-size f call-ioctl ;
208 : evdev-revoke-device ( handle -- )
209     CHAR: E 0x91 4 IOW-size f call-ioctl ;
210 ! EVIOCGMASK EVIOCSMASK
211 : evdev-get-event-mask ( handle -- int )
212     CHAR: E 0x92 input_mask IOR struct-ioctl ;
213 : evdev-set-event-mask ( handle event_mask -- int )
214     [ CHAR: E 0x93 ] dip IOW call-ioctl-out ;
215 ! EVIOCSCLOCKID
216 : evdev-set-clock-id ( handle n -- int )
217     [ CHAR: E 0xa0 ] dip int <ref> IOW int ctype-ioctl-inout ;
218
219 : evdev-get-bytes ( handle ev len -- bits )
220     [
221         [ IOC_READ CHAR: E ]
222         [ 0x20 + ]
223         [ IOC ] tri*
224     ] keep byte-array-ioctl ;
225
226 ENUM: INPUT_PROP
227     { INPUT_PROP_POINTER                 0x00 }   ! needs a pointer
228     { INPUT_PROP_DIRECT                  0x01 }   ! direct input devices
229     { INPUT_PROP_BUTTONPAD               0x02 }   ! has button(s) under pad
230     { INPUT_PROP_SEMI_MT                 0x03 }   ! touch rectangle only
231     { INPUT_PROP_TOPBUTTONPAD            0x04 }   ! softbuttons at top of pad
232     { INPUT_PROP_POINTING_STICK          0x05 }   ! is a pointing stick
233     { INPUT_PROP_ACCELEROMETER           0x06 }   ! has accelerometer
234     { INPUT_PROP_MAX                     0x1f }
235     { INPUT_PROP_CNT                     0x20 } ; ! (INPUT_PROP_MAX + 1)
236
237 ! Type, 2nd parameter from /dev/input/event8
238 ENUM: INPUT_EVENT
239     { EV_SYN            0x00 }   ! events
240     { EV_KEY            0x01 }   ! keys/buttons
241     { EV_REL            0x02 }   ! relative
242     { EV_ABS            0x03 }   ! absolute
243     { EV_MSC            0x04 }   ! miscellaneous
244     { EV_SW             0x05 }   ! switches
245     { EV_LED            0x11 }   ! LEDs
246     { EV_SND            0x12 }   ! sound
247     { EV_REP            0x14 }   ! autorepeat
248     { EV_FF             0x15 }   ! force feedback
249     { EV_PWR            0x16 }   ! power management
250     { EV_FF_STATUS      0x17 }   ! force feedback status
251     { EV_MAX            0x1f }   ! maximum
252     { EV_CNT            0x20 } ; ! EV_MAX + 1
253
254 ENUM: INPUT_SYN
255     { SYN_REPORT          0 }
256     { SYN_CONFIG          1 }
257     { SYN_MT_REPORT       2 }
258     { SYN_DROPPED         3 }
259     { SYN_MAX          0x0f }
260     { SYN_CNT          0x10 } ; ! (SYN_MAX+1)
261
262 ! code, 3rd param
263 ENUM: INPUT_KEY
264     { KEY_RESERVED                         0 }
265     { KEY_ESC                              1 }
266     { KEY_1                                2 }
267     { KEY_2                                3 }
268     { KEY_3                                4 }
269     { KEY_4                                5 }
270     { KEY_5                                6 }
271     { KEY_6                                7 }
272     { KEY_7                                8 }
273     { KEY_8                                9 }
274     { KEY_9                               10 }
275     { KEY_0                               11 }
276     { KEY_MINUS                           12 }
277     { KEY_EQUAL                           13 }
278     { KEY_BACKSPACE                       14 }
279     { KEY_TAB                             15 }
280     { KEY_Q                               16 }
281     { KEY_W                               17 }
282     { KEY_E                               18 }
283     { KEY_R                               19 }
284     { KEY_T                               20 }
285     { KEY_Y                               21 }
286     { KEY_U                               22 }
287     { KEY_I                               23 }
288     { KEY_O                               24 }
289     { KEY_P                               25 }
290     { KEY_LEFTBRACE                       26 }
291     { KEY_RIGHTBRACE                      27 }
292     { KEY_ENTER                           28 }
293     { KEY_LEFTCTRL                        29 }
294     { KEY_A                               30 }
295     { KEY_S                               31 }
296     { KEY_D                               32 }
297     { KEY_F                               33 }
298     { KEY_G                               34 }
299     { KEY_H                               35 }
300     { KEY_J                               36 }
301     { KEY_K                               37 }
302     { KEY_L                               38 }
303     { KEY_SEMICOLON                       39 }
304     { KEY_APOSTROPHE                      40 }
305     { KEY_GRAVE                           41 }
306     { KEY_LEFTSHIFT                       42 }
307     { KEY_BACKSLASH                       43 }
308     { KEY_Z                               44 }
309     { KEY_X                               45 }
310     { KEY_C                               46 }
311     { KEY_V                               47 }
312     { KEY_B                               48 }
313     { KEY_N                               49 }
314     { KEY_M                               50 }
315     { KEY_COMMA                           51 }
316     { KEY_DOT                             52 }
317     { KEY_SLASH                           53 }
318     { KEY_RIGHTSHIFT                      54 }
319     { KEY_KPASTERISK                      55 }
320     { KEY_LEFTALT                         56 }
321     { KEY_SPACE                           57 }
322     { KEY_CAPSLOCK                        58 }
323     { KEY_F1                              59 }
324     { KEY_F2                              60 }
325     { KEY_F3                              61 }
326     { KEY_F4                              62 }
327     { KEY_F5                              63 }
328     { KEY_F6                              64 }
329     { KEY_F7                              65 }
330     { KEY_F8                              66 }
331     { KEY_F9                              67 }
332     { KEY_F10                             68 }
333     { KEY_NUMLOCK                         69 }
334     { KEY_SCROLLLOCK                      70 }
335     { KEY_KP7                             71 }
336     { KEY_KP8                             72 }
337     { KEY_KP9                             73 }
338     { KEY_KPMINUS                         74 }
339     { KEY_KP4                             75 }
340     { KEY_KP5                             76 }
341     { KEY_KP6                             77 }
342     { KEY_KPPLUS                          78 }
343     { KEY_KP1                             79 }
344     { KEY_KP2                             80 }
345     { KEY_KP3                             81 }
346     { KEY_KP0                             82 }
347     { KEY_KPDOT                           83 }
348     { KEY_ZENKAKUHANKAKU                  85 }
349     { KEY_102ND                           86 }
350     { KEY_F11                             87 }
351     { KEY_F12                             88 }
352     { KEY_RO                              89 }
353     { KEY_KATAKANA                        90 }
354     { KEY_HIRAGANA                        91 }
355     { KEY_HENKAN                          92 }
356     { KEY_KATAKANAHIRAGANA                93 }
357     { KEY_MUHENKAN                        94 }
358     { KEY_KPJPCOMMA                       95 }
359     { KEY_KPENTER                         96 }
360     { KEY_RIGHTCTRL                       97 }
361     { KEY_KPSLASH                         98 }
362     { KEY_SYSRQ                           99 }
363     { KEY_RIGHTALT                       100 }
364     { KEY_LINEFEED                       101 }
365     { KEY_HOME                           102 }
366     { KEY_UP                             103 }
367     { KEY_PAGEUP                         104 }
368     { KEY_LEFT                           105 }
369     { KEY_RIGHT                          106 }
370     { KEY_END                            107 }
371     { KEY_DOWN                           108 }
372     { KEY_PAGEDOWN                       109 }
373     { KEY_INSERT                         110 }
374     { KEY_DELETE                         111 }
375     { KEY_MACRO                          112 }
376     { KEY_MUTE                           113 }
377     { KEY_VOLUMEDOWN                     114 }
378     { KEY_VOLUMEUP                       115 }
379     { KEY_POWER                          116 }    ! SC System Power Down
380     { KEY_KPEQUAL                        117 }
381     { KEY_KPPLUSMINUS                    118 }
382     { KEY_PAUSE                          119 }
383     { KEY_SCALE                          120 }    ! AL Compiz Scale (Expose)
384     { KEY_KPCOMMA                        121 }
385     { KEY_HANGEUL                        122 }
386     { KEY_HANJA                          123 }
387     { KEY_YEN                            124 }
388     { KEY_LEFTMETA                       125 }
389     { KEY_RIGHTMETA                      126 }
390     { KEY_COMPOSE                        127 }
391     { KEY_STOP                           128 }    ! AC Stop
392     { KEY_AGAIN                          129 }
393     { KEY_PROPS                          130 }    ! AC Properties
394     { KEY_UNDO                           131 }    ! AC Undo
395     { KEY_FRONT                          132 }
396     { KEY_COPY                           133 }    ! AC Copy
397     { KEY_OPEN                           134 }    ! AC Open
398     { KEY_PASTE                          135 }    ! AC Paste
399     { KEY_FIND                           136 }    ! AC Search
400     { KEY_CUT                            137 }    ! AC Cut
401     { KEY_HELP                           138 }    ! AL Integrated Help Center
402     { KEY_MENU                           139 }    ! Menu (show menu)
403     { KEY_CALC                           140 }    ! AL Calculator
404     { KEY_SETUP                          141 }
405     { KEY_SLEEP                          142 }    ! SC System Sleep
406     { KEY_WAKEUP                         143 }    ! System Wake Up
407     { KEY_FILE                           144 }    ! AL Local Machine Browser
408     { KEY_SENDFILE                       145 }
409     { KEY_DELETEFILE                     146 }
410     { KEY_XFER                           147 }
411     { KEY_PROG1                          148 }
412     { KEY_PROG2                          149 }
413     { KEY_WWW                            150 }    ! AL Internet Browser
414     { KEY_MSDOS                          151 }
415     { KEY_COFFEE                         152 }    ! AL Terminal Lock/Screensaver
416     { KEY_ROTATE_DISPLAY                 153 }    ! Display orientation for e.g. tablets
417     { KEY_CYCLEWINDOWS                   154 }
418     { KEY_MAIL                           155 }
419     { KEY_BOOKMARKS                      156 }    ! AC Bookmarks
420     { KEY_COMPUTER                       157 }
421     { KEY_BACK                           158 }    ! AC Back
422     { KEY_FORWARD                        159 }    ! AC Forward
423     { KEY_CLOSECD                        160 }
424     { KEY_EJECTCD                        161 }
425     { KEY_EJECTCLOSECD                   162 }
426     { KEY_NEXTSONG                       163 }
427     { KEY_PLAYPAUSE                      164 }
428     { KEY_PREVIOUSSONG                   165 }
429     { KEY_STOPCD                         166 }
430     { KEY_RECORD                         167 }
431     { KEY_REWIND                         168 }
432     { KEY_PHONE                          169 }    ! Media Select Telephone
433     { KEY_ISO                            170 }
434     { KEY_CONFIG                         171 }    ! AL Consumer Control Configuration
435     { KEY_HOMEPAGE                       172 }    ! AC Home
436     { KEY_REFRESH                        173 }    ! AC Refresh
437     { KEY_EXIT                           174 }    ! AC Exit
438     { KEY_MOVE                           175 }
439     { KEY_EDIT                           176 }
440     { KEY_SCROLLUP                       177 }
441     { KEY_SCROLLDOWN                     178 }
442     { KEY_KPLEFTPAREN                    179 }
443     { KEY_KPRIGHTPAREN                   180 }
444     { KEY_NEW                            181 }    ! AC New
445     { KEY_REDO                           182 }    ! AC Redo/Repeat
446     { KEY_F13                            183 }
447     { KEY_F14                            184 }
448     { KEY_F15                            185 }
449     { KEY_F16                            186 }
450     { KEY_F17                            187 }
451     { KEY_F18                            188 }
452     { KEY_F19                            189 }
453     { KEY_F20                            190 }
454     { KEY_F21                            191 }
455     { KEY_F22                            192 }
456     { KEY_F23                            193 }
457     { KEY_F24                            194 }
458     { KEY_PLAYCD                         200 }
459     { KEY_PAUSECD                        201 }
460     { KEY_PROG3                          202 }
461     { KEY_PROG4                          203 }
462     { KEY_DASHBOARD                      204 }    ! AL Dashboard
463     { KEY_SUSPEND                        205 }
464     { KEY_CLOSE                          206 }    ! AC Close
465     { KEY_PLAY                           207 }
466     { KEY_FASTFORWARD                    208 }
467     { KEY_BASSBOOST                      209 }
468     { KEY_PRINT                          210 }    ! AC Print
469     { KEY_HP                             211 }
470     { KEY_CAMERA                         212 }
471     { KEY_SOUND                          213 }
472     { KEY_QUESTION                       214 }
473     { KEY_EMAIL                          215 }
474     { KEY_CHAT                           216 }
475     { KEY_SEARCH                         217 }
476     { KEY_CONNECT                        218 }
477     { KEY_FINANCE                        219 }    ! AL Checkbook/Finance
478     { KEY_SPORT                          220 }
479     { KEY_SHOP                           221 }
480     { KEY_ALTERASE                       222 }
481     { KEY_CANCEL                         223 }    ! AC Cancel
482     { KEY_BRIGHTNESSDOWN                 224 }
483     { KEY_BRIGHTNESSUP                   225 }
484     { KEY_MEDIA                          226 }
485     { KEY_SWITCHVIDEOMODE                227 }    ! Cycle between available video
486                                                   ! outputs (Monitor/LCD/TV-out/etc)
487     { KEY_KBDILLUMTOGGLE                 228 }
488     { KEY_KBDILLUMDOWN                   229 }
489     { KEY_KBDILLUMUP                     230 }
490     { KEY_SEND                           231 }    ! AC Send
491     { KEY_REPLY                          232 }    ! AC Reply
492     { KEY_FORWARDMAIL                    233 }    ! AC Forward Msg
493     { KEY_SAVE                           234 }    ! AC Save
494     { KEY_DOCUMENTS                      235 }
495     { KEY_BATTERY                        236 }
496     { KEY_BLUETOOTH                      237 }
497     { KEY_WLAN                           238 }
498     { KEY_UWB                            239 }
499     { KEY_UNKNOWN                        240 }
500     { KEY_VIDEO_NEXT                     241 }    ! drive next video source
501     { KEY_VIDEO_PREV                     242 }    ! drive previous video source
502     { KEY_BRIGHTNESS_CYCLE               243 }    ! brightness up, after max is min
503     { KEY_BRIGHTNESS_AUTO                244 }    ! Set Auto Brightness: manual
504                                                   ! brightness control is off,
505                                                   ! rely on ambient
506     { KEY_DISPLAY_OFF                    245 }   ! display device to off state
507     { KEY_WWAN                           246 }   ! Wireless WAN (LTE, UMTS, GSM, etc.)
508     { KEY_RFKILL                         247 }   ! Key that controls all radios
509     { KEY_MICMUTE                        248 }   ! Mute / unmute the microphone
510 ! Code 255 is reserved for special needs of AT keyboard driver
511     { BTN_0                        0x100 }
512     { BTN_1                        0x101 }
513     { BTN_2                        0x102 }
514     { BTN_3                        0x103 }
515     { BTN_4                        0x104 }
516     { BTN_5                        0x105 }
517     { BTN_6                        0x106 }
518     { BTN_7                        0x107 }
519     { BTN_8                        0x108 }
520     { BTN_9                        0x109 }
521     { BTN_MOUSE                    0x110 }
522     { BTN_LEFT                     0x110 }
523     { BTN_RIGHT                    0x111 }
524     { BTN_MIDDLE                   0x112 }
525     { BTN_SIDE                     0x113 }
526     { BTN_EXTRA                    0x114 }
527     { BTN_FORWARD                  0x115 }
528     { BTN_BACK                     0x116 }
529     { BTN_TASK                     0x117 }
530     { BTN_TRIGGER                  0x120 }
531     { BTN_JOYSTICK                 0x120 } ! Button 1
532     { BTN_THUMB                    0x121 }
533     { BTN_THUMB2                   0x122 }
534     { BTN_TOP                      0x123 }
535     { BTN_TOP2                     0x124 }
536     { BTN_PINKIE                   0x125 }
537     { BTN_BASE                     0x126 }
538     { BTN_BASE2                    0x127 }
539     { BTN_BASE3                    0x128 }
540     { BTN_BASE4                    0x129 }
541     { BTN_BASE5                    0x12a }
542     { BTN_BASE6                    0x12b }
543     { BTN_BASE7                    0x12c } ! not defined by linux
544     { BTN_BASE8                    0x12d } ! not defined by linux
545     { BTN_BASE9                    0x12e } ! not defined by linux
546     { BTN_DEAD                     0x12f }
547     { BTN_A                        0x130 }
548     { BTN_B                        0x131 }
549     { BTN_C                        0x132 }
550     { BTN_X                        0x133 }
551     { BTN_Y                        0x134 }
552     { BTN_Z                        0x135 }
553     { BTN_TL                       0x136 }
554     { BTN_TR                       0x137 }
555     { BTN_TL2                      0x138 }
556     { BTN_TR2                      0x139 }
557     { BTN_SELECT                   0x13a }
558     { BTN_START                    0x13b }
559     { BTN_MODE                     0x13c }
560     { BTN_THUMBL                   0x13d }
561     { BTN_THUMBR                   0x13e }
562     { BTN_TOOL_PEN                 0x140 }
563     { BTN_TOOL_RUBBER              0x141 }
564     { BTN_TOOL_BRUSH               0x142 }
565     { BTN_TOOL_PENCIL              0x143 }
566     { BTN_TOOL_AIRBRUS             0x144 }
567     { BTN_TOOL_FINGER              0x145 }
568     { BTN_TOOL_MOUSE               0x146 }
569     { BTN_TOOL_LENS                0x147 }
570     { BTN_TOOL_QUINTTA             0x148 }    ! Five fingers on trackpad
571     { BTN_STYLUS3                  0x149 }
572     { BTN_TOUCH                    0x14a }
573     { BTN_STYLUS                   0x14b }
574     { BTN_STYLUS2                  0x14c }
575     { BTN_TOOL_DOUBLETAP           0x14d }
576     { BTN_TOOL_TRIPLETAP           0x14e }
577     { BTN_TOOL_QUADTAP             0x14f }    ! Four fingers on trackpad
578     { BTN_WHEEL                    0x150 }
579     { BTN_GEAR_DOWN                0x150 }
580     { BTN_GEAR_UP                  0x151 }
581     { KEY_OK                       0x160 }
582     { KEY_SELECT                   0x161 }
583     { KEY_GOTO                     0x162 }
584     { KEY_CLEAR                    0x163 }
585     { KEY_POWER2                   0x164 }
586     { KEY_OPTION                   0x165 }
587     { KEY_INFO                     0x166 }    ! AL OEM Features/Tips/Tutorial
588     { KEY_TIME                     0x167 }
589     { KEY_VENDOR                   0x168 }
590     { KEY_ARCHIVE                  0x169 }
591     { KEY_PROGRAM                  0x16a }    ! Media Select Program Guide
592     { KEY_CHANNEL                  0x16b }
593     { KEY_FAVORITES                0x16c }
594     { KEY_EPG                      0x16d }
595     { KEY_PVR                      0x16e }    ! Media Select Home
596     { KEY_MHP                      0x16f }
597     { KEY_LANGUAGE                 0x170 }
598     { KEY_TITLE                    0x171 }
599     { KEY_SUBTITLE                 0x172 }
600     { KEY_ANGLE                    0x173 }
601     { KEY_ZOOM                     0x174 }
602     { KEY_MODE                     0x175 }
603     { KEY_KEYBOARD                 0x176 }
604     { KEY_SCREEN                   0x177 }
605     { KEY_PC                       0x178 }    ! Media Select Computer
606     { KEY_TV                       0x179 }    ! Media Select TV
607     { KEY_TV2                      0x17a }    ! Media Select Cable
608     { KEY_VCR                      0x17b }    ! Media Select VCR
609     { KEY_VCR2                     0x17c }    ! VCR Plus
610     { KEY_SAT                      0x17d }    ! Media Select Satellite
611     { KEY_SAT2                     0x17e }
612     { KEY_CD                       0x17f }    ! Media Select CD
613     { KEY_TAPE                     0x180 }    ! Media Select Tape
614     { KEY_RADIO                    0x181 }
615     { KEY_TUNER                    0x182 }    ! Media Select Tuner
616     { KEY_PLAYER                   0x183 }
617     { KEY_TEXT                     0x184 }
618     { KEY_DVD                      0x185 }    ! Media Select DVD
619     { KEY_AUX                      0x186 }
620     { KEY_MP3                      0x187 }
621     { KEY_AUDIO                    0x188 }    ! AL Audio Browser
622     { KEY_VIDEO                    0x189 }    ! AL Movie Browser
623     { KEY_DIRECTORY                0x18a }
624     { KEY_LIST                     0x18b }
625     { KEY_MEMO                     0x18c }    ! Media Select Messages
626     { KEY_CALENDAR                 0x18d }
627     { KEY_RED                      0x18e }
628     { KEY_GREEN                    0x18f }
629     { KEY_YELLOW                   0x190 }
630     { KEY_BLUE                     0x191 }
631     { KEY_CHANNELUP                0x192 }    ! Channel Increment
632     { KEY_CHANNELDOWN              0x193 }    ! Channel Decrement
633     { KEY_FIRST                    0x194 }
634     { KEY_LAST                     0x195 }    ! Recall Last
635     { KEY_AB                       0x196 }
636     { KEY_NEXT                     0x197 }
637     { KEY_RESTART                  0x198 }
638     { KEY_SLOW                     0x199 }
639     { KEY_SHUFFLE                  0x19a }
640     { KEY_BREAK                    0x19b }
641     { KEY_PREVIOUS                 0x19c }
642     { KEY_DIGITS                   0x19d }
643     { KEY_TEEN                     0x19e }
644     { KEY_TWEN                     0x19f }
645     { KEY_VIDEOPHONE               0x1a0 }    ! Media Select Video Phone
646     { KEY_GAMES                    0x1a1 }    ! Media Select Games
647     { KEY_ZOOMIN                   0x1a2 }    ! AC Zoom In
648     { KEY_ZOOMOUT                  0x1a3 }    ! AC Zoom Out
649     { KEY_ZOOMRESET                0x1a4 }    ! AC Zoom
650     { KEY_WORDPROCESSOR            0x1a5 }    ! AL Word Processor
651     { KEY_EDITOR                   0x1a6 }    ! AL Text Editor
652     { KEY_SPREADSHEET              0x1a7 }    ! AL Spreadsheet
653     { KEY_GRAPHICSEDITOR           0x1a8 }    ! AL Graphics Editor
654     { KEY_PRESENTATION             0x1a9 }    ! AL Presentation App
655     { KEY_DATABASE                 0x1aa }    ! AL Database App
656     { KEY_NEWS                     0x1ab }    ! AL Newsreader
657     { KEY_VOICEMAIL                0x1ac }    ! AL Voicemail
658     { KEY_ADDRESSBOOK              0x1ad }    ! AL Contacts/Address Book
659     { KEY_MESSENGER                0x1ae }    ! AL Instant Messaging
660     { KEY_DISPLAYTOGGLE            0x1af }    ! Turn display (LCD) on and off
661     { KEY_SPELLCHECK               0x1b0 }    ! AL Spell Check
662     { KEY_LOGOFF                   0x1b1 }    ! AL Logoff
663     { KEY_DOLLAR                   0x1b2 }
664     { KEY_EURO                     0x1b3 }
665     { KEY_FRAMEBACK                0x1b4 }    ! Consumer - transport controls
666     { KEY_FRAMEFORWARD             0x1b5 }
667     { KEY_CONTEXT_MENU             0x1b6 }    ! GenDesc - system context menu
668     { KEY_MEDIA_REPEAT             0x1b7 }    ! Consumer - transport control
669     { KEY_10CHANNELSUP             0x1b8 }    ! 10 channels up (10+)
670     { KEY_10CHANNELSDOWN           0x1b9 }    ! 10 channels down (10-)
671     { KEY_IMAGES                   0x1ba }    ! AL Image Browser
672     { KEY_DEL_EOL                  0x1c0 }
673     { KEY_DEL_EOS                  0x1c1 }
674     { KEY_INS_LINE                 0x1c2 }
675     { KEY_DEL_LINE                 0x1c3 }
676     { KEY_FN                       0x1d0 }
677     { KEY_FN_ESC                   0x1d1 }
678     { KEY_FN_F1                    0x1d2 }
679     { KEY_FN_F2                    0x1d3 }
680     { KEY_FN_F3                    0x1d4 }
681     { KEY_FN_F4                    0x1d5 }
682     { KEY_FN_F5                    0x1d6 }
683     { KEY_FN_F6                    0x1d7 }
684     { KEY_FN_F7                    0x1d8 }
685     { KEY_FN_F8                    0x1d9 }
686     { KEY_FN_F9                    0x1da }
687     { KEY_FN_F10                   0x1db }
688     { KEY_FN_F11                   0x1dc }
689     { KEY_FN_F12                   0x1dd }
690     { KEY_FN_1                     0x1de }
691     { KEY_FN_2                     0x1df }
692     { KEY_FN_D                     0x1e0 }
693     { KEY_FN_E                     0x1e1 }
694     { KEY_FN_F                     0x1e2 }
695     { KEY_FN_S                     0x1e3 }
696     { KEY_FN_B                     0x1e4 }
697     { KEY_BRL_DOT1                 0x1f1 }
698     { KEY_BRL_DOT2                 0x1f2 }
699     { KEY_BRL_DOT3                 0x1f3 }
700     { KEY_BRL_DOT4                 0x1f4 }
701     { KEY_BRL_DOT5                 0x1f5 }
702     { KEY_BRL_DOT6                 0x1f6 }
703     { KEY_BRL_DOT7                 0x1f7 }
704     { KEY_BRL_DOT8                 0x1f8 }
705     { KEY_BRL_DOT9                 0x1f9 }
706     { KEY_BRL_DOT10                0x1fa }
707     { KEY_NUMERIC_0                0x200 }    ! used by phones, remote controls,
708     { KEY_NUMERIC_1                0x201 }    ! and other keypads
709     { KEY_NUMERIC_2                0x202 }
710     { KEY_NUMERIC_3                0x203 }
711     { KEY_NUMERIC_4                0x204 }
712     { KEY_NUMERIC_5                0x205 }
713     { KEY_NUMERIC_6                0x206 }
714     { KEY_NUMERIC_7                0x207 }
715     { KEY_NUMERIC_8                0x208 }
716     { KEY_NUMERIC_9                0x209 }
717     { KEY_NUMERIC_STAR             0x20a }
718     { KEY_NUMERIC_POUND            0x20b }
719     { KEY_NUMERIC_A                0x20c }    ! Phone key A - HUT Telephony 0xb9
720     { KEY_NUMERIC_B                0x20d }
721     { KEY_NUMERIC_C                0x20e }
722     { KEY_NUMERIC_D                0x20f }
723     { KEY_CAMERA_FOCUS             0x210 }
724     { KEY_WPS_BUTTON               0x211 }    ! WiFi Protected Setup key
725     { KEY_TOUCHPAD_TOGGLE          0x212 }    ! Request switch touchpad on or off
726     { KEY_TOUCHPAD_ON              0x213 }
727     { KEY_TOUCHPAD_OFF             0x214 }
728     { KEY_CAMERA_ZOOMIN            0x215 }
729     { KEY_CAMERA_ZOOMOUT           0x216 }
730     { KEY_CAMERA_UP                0x217 }
731     { KEY_CAMERA_DOWN              0x218 }
732     { KEY_CAMERA_LEFT              0x219 }
733     { KEY_CAMERA_RIGHT             0x21a }
734     { KEY_ATTENDANT_ON             0x21b }
735     { KEY_ATTENDANT_OFF            0x21c }
736     { KEY_ATTENDANT_TOGGLE         0x21d }    ! Attendant call on or off
737     { KEY_LIGHTS_TOGGLE            0x21e }    ! Reading light on or off
738     { BTN_DPAD_UP                  0x220 }
739     { BTN_DPAD_DOWN                0x221 }
740     { BTN_DPAD_LEFT                0x222 }
741     { BTN_DPAD_RIGHT               0x223 }
742     { KEY_ALS_TOGGLE               0x230 }    ! Ambient light sensor
743     { KEY_ROTATE_LOCK_TOGGLE       0x231 }    ! Display rotation lock
744     { KEY_BUTTONCONFIG             0x240 }    ! AL Button Configuration
745     { KEY_TASKMANAGER              0x241 }    ! AL Task/Project Manager
746     { KEY_JOURNAL                  0x242 }    ! AL Log/Journal/Timecard
747     { KEY_CONTROLPANEL             0x243 }    ! AL Control Panel
748     { KEY_APPSELECT                0x244 }    ! AL Select Task/Application
749     { KEY_SCREENSAVER              0x245 }    ! AL Screen Saver
750     { KEY_VOICECOMMAND             0x246 }    ! Listening Voice Command
751     { KEY_ASSISTANT                0x247 }    ! AL Context-aware desktop assistant
752     { KEY_BRIGHTNESS_MIN           0x250 }    ! Set Brightness to Minimum
753     { KEY_BRIGHTNESS_MAX           0x251 }    ! Set Brightness to Maximum
754     { KEY_KBDINPUTASSIST_PREV      0x260 }
755     { KEY_KBDINPUTASSIST_NEXT      0x261 }
756     { KEY_KBDINPUTASSIST_PREVGROUP 0x262 }
757     { KEY_KBDINPUTASSIST_NEXTGROUP 0x263 }
758     { KEY_KBDINPUTASSIST_ACCEPT    0x264 }
759     { KEY_KBDINPUTASSIST_CANCEL    0x265 }
760 ! Diagonal movement keys
761     { KEY_RIGHT_UP                 0x266 }
762     { KEY_RIGHT_DOWN               0x267 }
763     { KEY_LEFT_UP                  0x268 }
764     { KEY_LEFT_DOWN                0x269 }
765     { KEY_ROOT_MENU                0x26a }    ! Show Device's Root Menu
766 ! Show Top Menu of the Media (e.g. DVD)
767     { KEY_MEDIA_TOP_MENU           0x26b }
768     { KEY_NUMERIC_11               0x26c }
769     { KEY_NUMERIC_12               0x26d }
770 ! Toggle Audio Description: refers to an audio service that helps blind and
771 ! visually impaired consumers understand the action in a program. Note: in
772 ! some countries this is referred to as "Video Description".
773     { KEY_AUDIO_DESC               0x26e }
774     { KEY_3D_MODE                  0x26f }
775     { KEY_NEXT_FAVORITE            0x270 }
776     { KEY_STOP_RECORD              0x271 }
777     { KEY_PAUSE_RECORD             0x272 }
778     { KEY_VOD                      0x273 }    ! Video on Demand
779     { KEY_UNMUTE                   0x274 }
780     { KEY_FASTREVERSE              0x275 }
781     { KEY_SLOWREVERSE              0x276 }
782 ! Control a data application associated with the currently viewed channel,
783 ! e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.)
784     { KEY_DATA                     0x277 }
785     { KEY_ONSCREEN_KEYBOARD        0x278 }
786     { BTN_TRIGGER_HAPPY            0x2c0 }
787     { BTN_TRIGGER_HAPPY1           0x2c0 }
788     { BTN_TRIGGER_HAPPY2           0x2c1 }
789     { BTN_TRIGGER_HAPPY3           0x2c2 }
790     { BTN_TRIGGER_HAPPY4           0x2c3 }
791     { BTN_TRIGGER_HAPPY5           0x2c4 }
792     { BTN_TRIGGER_HAPPY6           0x2c5 }
793     { BTN_TRIGGER_HAPPY7           0x2c6 }
794     { BTN_TRIGGER_HAPPY8           0x2c7 }
795     { BTN_TRIGGER_HAPPY9           0x2c8 }
796     { BTN_TRIGGER_HAPPY10          0x2c9 }
797     { BTN_TRIGGER_HAPPY11          0x2ca }
798     { BTN_TRIGGER_HAPPY12          0x2cb }
799     { BTN_TRIGGER_HAPPY13          0x2cc }
800     { BTN_TRIGGER_HAPPY14          0x2cd }
801     { BTN_TRIGGER_HAPPY15          0x2ce }
802     { BTN_TRIGGER_HAPPY16          0x2cf }
803     { BTN_TRIGGER_HAPPY17          0x2d0 }
804     { BTN_TRIGGER_HAPPY18          0x2d1 }
805     { BTN_TRIGGER_HAPPY19          0x2d2 }
806     { BTN_TRIGGER_HAPPY20          0x2d3 }
807     { BTN_TRIGGER_HAPPY21          0x2d4 }
808     { BTN_TRIGGER_HAPPY22          0x2d5 }
809     { BTN_TRIGGER_HAPPY23          0x2d6 }
810     { BTN_TRIGGER_HAPPY24          0x2d7 }
811     { BTN_TRIGGER_HAPPY25          0x2d8 }
812     { BTN_TRIGGER_HAPPY26          0x2d9 }
813     { BTN_TRIGGER_HAPPY27          0x2da }
814     { BTN_TRIGGER_HAPPY28          0x2db }
815     { BTN_TRIGGER_HAPPY29          0x2dc }
816     { BTN_TRIGGER_HAPPY30          0x2dd }
817     { BTN_TRIGGER_HAPPY31          0x2de }
818     { BTN_TRIGGER_HAPPY32          0x2df }
819     { BTN_TRIGGER_HAPPY33          0x2e0 }
820     { BTN_TRIGGER_HAPPY34          0x2e1 }
821     { BTN_TRIGGER_HAPPY35          0x2e2 }
822     { BTN_TRIGGER_HAPPY36          0x2e3 }
823     { BTN_TRIGGER_HAPPY37          0x2e4 }
824     { BTN_TRIGGER_HAPPY38          0x2e5 }
825     { BTN_TRIGGER_HAPPY39          0x2e6 }
826     { BTN_TRIGGER_HAPPY40          0x2e7 }
827 ! We avoid low common keys in module aliases so they don't get huge.
828     { KEY_MAX                      0x2ff }
829     { KEY_CNT                      0x300 } ;    ! (KEY_MAX+1)
830
831 CONSTANT: BTN_GAMEPAD              0x130
832 CONSTANT: BTN_DIGI                 0x140
833 CONSTANT: KEY_MIN_INTERESTING      KEY_MUTE
834 CONSTANT: KEY_HANGUEL              KEY_HANGEUL
835 CONSTANT: KEY_SCREENLOCK           KEY_COFFEE
836 CONSTANT: KEY_DIRECTION            KEY_ROTATE_DISPLAY
837 CONSTANT: KEY_BRIGHTNESS_ZERO      KEY_BRIGHTNESS_AUTO
838 CONSTANT: KEY_WIMAX                KEY_WWAN
839 CONSTANT: KEY_BRIGHTNESS_TOGGLE    KEY_DISPLAYTOGGLE
840 CONSTANT: BTN_MISC                 0x100
841 CONSTANT: BTN_SOUTH                BTN_A
842 CONSTANT: BTN_EAST                 BTN_B
843 CONSTANT: BTN_NORTH                BTN_X
844 CONSTANT: BTN_WEST                 BTN_Y
845
846 ! Relative axes
847 ! 3rd param
848 ENUM: INPUT_REL
849     { REL_X                        0x00 }
850     { REL_Y                        0x01 }
851     { REL_Z                        0x02 }
852     { REL_RX                       0x03 }
853     { REL_RY                       0x04 }
854     { REL_RZ                       0x05 }
855     { REL_HWHEEL                   0x06 }
856     { REL_DIAL                     0x07 }
857     { REL_WHEEL                    0x08 }
858     { REL_MISC                     0x09 }
859     { REL_RESERVED                 0x0a }
860     { REL_WHEEL_HI_RES             0x0b }
861     { REL_HWHEEL_HI_RES            0x0c }
862     { REL_MAX                      0x0f }
863     { REL_CNT                      0x10 } ;     ! (REL_MAX+1)
864
865 ! Absolute axes
866 ENUM: INPUT_ABS
867     { ABS_X                        0x00 }
868     { ABS_Y                        0x01 }
869     { ABS_Z                        0x02 }
870     { ABS_RX                       0x03 }
871     { ABS_RY                       0x04 }
872     { ABS_RZ                       0x05 }
873     { ABS_THROTTLE                 0x06 }
874     { ABS_RUDDER                   0x07 }
875     { ABS_WHEEL                    0x08 }
876     { ABS_GAS                      0x09 }
877     { ABS_BRAKE                    0x0a }
878     { ABS_HAT0X                    0x10 }
879     { ABS_HAT0Y                    0x11 }
880     { ABS_HAT1X                    0x12 }
881     { ABS_HAT1Y                    0x13 }
882     { ABS_HAT2X                    0x14 }
883     { ABS_HAT2Y                    0x15 }
884     { ABS_HAT3X                    0x16 }
885     { ABS_HAT3Y                    0x17 }
886     { ABS_PRESSURE                 0x18 }
887     { ABS_DISTANCE                 0x19 }
888     { ABS_TILT_X                   0x1a }
889     { ABS_TILT_Y                   0x1b }
890     { ABS_TOOL_WIDTH               0x1c }
891     { ABS_VOLUME                   0x20 }
892     { ABS_MISC                     0x28 }
893     { ABS_MT_SLOT                  0x2f }    ! MT slot being modified
894     { ABS_MT_TOUCH_MAJOR           0x30 }    ! Major axis of touching ellipse
895     { ABS_MT_TOUCH_MINOR           0x31 }    ! Minor axis (omit if circular)
896     { ABS_MT_WIDTH_MAJOR           0x32 }    ! Major axis of approaching ellipse
897     { ABS_MT_WIDTH_MINOR           0x33 }    ! Minor axis (omit if circular)
898     { ABS_MT_ORIENTATION           0x34 }    ! Ellipse orientation
899     { ABS_MT_POSITION_X            0x35 }    ! Center X touch position
900     { ABS_MT_POSITION_Y            0x36 }    ! Center Y touch position
901     { ABS_MT_TOOL_TYPE             0x37 }    ! Type of touching device
902     { ABS_MT_BLOB_ID               0x38 }    ! Group a set of packets as a blob
903     { ABS_MT_TRACKING_ID           0x39 }    ! Unique ID of initiated contact
904     { ABS_MT_PRESSURE              0x3a }    ! Pressure on contact area
905     { ABS_MT_DISTANCE              0x3b }    ! Contact hover distance
906     { ABS_MT_TOOL_X                0x3c }    ! Center X tool position
907     { ABS_MT_TOOL_Y                0x3d }    ! Center Y tool position
908     { ABS_MAX                      0x3f }
909     { ABS_CNT                      0x40 } ;    ! (ABS_MAX+1)
910
911 ! Switch events
912 ENUM: INPUT_SW
913     { SW_LID                       0x00 }    ! set = lid shut
914     { SW_TABLET_MODE               0x01 }    ! set = tablet mode
915     { SW_HEADPHONE_INSERT          0x02 }    ! set = inserted
916     { SW_RFKILL_ALL                0x03 }    ! rfkill master switch, type "any"
917                                              ! set = radio enabled
918     { SW_MICROPHONE_INSERT         0x04 }    ! set = inserted
919     { SW_DOCK                      0x05 }    ! set = plugged into dock
920     { SW_LINEOUT_INSERT            0x06 }    ! set = inserted
921     { SW_JACK_PHYSICAL_INSERT      0x07 }    ! set = mechanical switch set
922     { SW_VIDEOOUT_INSERT           0x08 }    ! set = inserted
923     { SW_CAMERA_LENS_COVER         0x09 }    ! set = lens covered
924     { SW_KEYPAD_SLIDE              0x0a }    ! set = keypad slide out
925     { SW_FRONT_PROXIMITY           0x0b }    ! set = front proximity sensor active
926     { SW_ROTATE_LOCK               0x0c }    ! set = rotate locked/disabled
927     { SW_LINEIN_INSERT             0x0d }    ! set = inserted
928     { SW_MUTE_DEVICE               0x0e }    ! set = device disabled
929     { SW_PEN_INSERTED              0x0f }    ! set = pen inserted
930     { SW_MAX                       0x0f }
931     { SW_CNT                       0x10 } ;  ! (SW_MAX+1)
932
933 CONSTANT: SW_RADIO                     SW_RFKILL_ALL  ! deprecated
934
935 ! Misc events
936 ENUM: INPUT_MSC
937     { MSC_SERIAL                   0x00 }
938     { MSC_PULSELED                 0x01 }
939     { MSC_GESTURE                  0x02 }
940     { MSC_RAW                      0x03 }
941     { MSC_SCAN                     0x04 }
942     { MSC_TIMESTAMP                0x05 }
943     { MSC_MAX                      0x07 }
944     { MSC_CNT                      0x08 } ;  ! (MSC_MAX+1)
945
946 ENUM: SCANCODES
947     { SCANCODE_BTN_LEFT 589825 }
948     { SCANCODE_BTN_RIGHT 589826 }
949     { SCANCODE_BTN_MIDDLE 589827 }
950     { SCANCODE_BTN_SIDE 589828 }
951     { SCANCODE_BTN_EXTRA 589829 } ;
952
953 ! LEDs
954 ENUM: INPUT_LED
955     { LED_NUML                     0x00 }
956     { LED_CAPSL                    0x01 }
957     { LED_SCROLLL                  0x02 }
958     { LED_COMPOSE                  0x03 }
959     { LED_KANA                     0x04 }
960     { LED_SLEEP                    0x05 }
961     { LED_SUSPEND                  0x06 }
962     { LED_MUTE                     0x07 }
963     { LED_MISC                     0x08 }
964     { LED_MAIL                     0x09 }
965     { LED_CHARGING                 0x0a }
966     { LED_MAX                      0x0f }
967     { LED_CNT                      0x10 } ;  ! (LED_MAX+1)
968
969 ! Autorepeat values
970 ENUM: INPUT_REP
971     { REP_DELAY                    0x00 }
972     { REP_PERIOD                   0x01 }
973     { REP_MAX                      0x01 }
974     { REP_CNT                      0x02 } ;  ! (REP_MAX+1)
975
976 ! Sounds
977 ENUM: INPUT_SND
978     { SND_CLICK                    0x00 }
979     { SND_BELL                     0x01 }
980     { SND_TONE                     0x02 }
981     { SND_MAX                      0x07 }
982     { SND_CNT                      0x08 } ;  ! (SND_MAX+1)
983
984 ! Force feedback effect types
985 ENUM: INPUT_FF
986     { FF_RUMBLE 0x50 }
987     { FF_PERIODIC 0x51 }
988     { FF_CONSTANT 0x52 }
989     { FF_SPRING 0x53 }
990     { FF_FRICTION 0x54 }
991     { FF_DAMPER 0x55 }
992     { FF_INERTIA  0x56 }
993     { FF_RAMP   0x57 }
994
995 ! FF_EFFECT_MIN FF_RUMBLE
996 ! FF_EFFECT_MAX FF_RAMP
997
998 ! Force feedback periodic effect types
999
1000     { FF_SQUARE 0x58 }
1001     { FF_TRIANGLE 0x59 }
1002     { FF_SINE   0x5a                                                                                                                      }
1003     { FF_SAW_UP 0x5b }
1004     { FF_SAW_DOWN 0x5c }
1005     { FF_CUSTOM 0x5d }
1006
1007 ! FF_WAVEFORM_MIN FF_SQUARE
1008 ! FF_WAVEFORM_MAX FF_CUSTOM
1009 ! Set ff device properties
1010     { FF_GAIN   0x60 }
1011     { FF_AUTOCENTER 0x61 }
1012
1013 ! ff->playback(effect_id = FF_GAIN) is the first effect_id to
1014 ! cause a collision with another ff method, in this case ff->set_gain().
1015 ! Therefore the greatest safe value for effect_id is FF_GAIN - 1,
1016 ! and thus the total number of effects should never exceed FF_GAIN.
1017
1018 ! FF_MAX_EFFECTS  FF_GAIN
1019     { FF_MAX    0x7f }
1020     { FF_CNT    0x80 } ;
1021
1022 ENUM: FF_STATUS
1023     { FF_STATUS_STOPPED 0x00 }
1024     { FF_STATUS_PLAYING 0x01 }
1025     { FF_STATUS_MAX   0x01 } ;
1026