1#ifndef _INPUT_H
2#define _INPUT_H
3
4
5
6
7
8
9
10
11
12#ifdef __KERNEL__
13#include <linux/time.h>
14#include <linux/list.h>
15#else
16#include <sys/time.h>
17#include <sys/ioctl.h>
18#include <sys/types.h>
19#include <linux/types.h>
20#endif
21
22
23
24
25
26struct input_event {
27 struct timeval time;
28 __u16 type;
29 __u16 code;
30 __s32 value;
31};
32
33
34
35
36
37#define EV_VERSION 0x010001
38
39
40
41
42
43struct input_id {
44 __u16 bustype;
45 __u16 vendor;
46 __u16 product;
47 __u16 version;
48};
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69struct input_absinfo {
70 __s32 value;
71 __s32 minimum;
72 __s32 maximum;
73 __s32 fuzz;
74 __s32 flat;
75 __s32 resolution;
76};
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93struct input_keymap_entry {
94#define INPUT_KEYMAP_BY_INDEX (1 << 0)
95 __u8 flags;
96 __u8 len;
97 __u16 index;
98 __u32 keycode;
99 __u8 scancode[32];
100};
101
102#define EVIOCGVERSION _IOR('E', 0x01, int)
103#define EVIOCGID _IOR('E', 0x02, struct input_id)
104#define EVIOCGREP _IOR('E', 0x03, unsigned int[2])
105#define EVIOCSREP _IOW('E', 0x03, unsigned int[2])
106
107#define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2])
108#define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry)
109#define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2])
110#define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)
111
112#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len)
113#define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len)
114#define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len)
115#define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len)
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141#define EVIOCGMTSLOTS(len) _IOC(_IOC_READ, 'E', 0x0a, len)
142
143#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len)
144#define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len)
145#define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len)
146#define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len)
147
148#define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + (ev), len)
149#define EVIOCGABS(abs) _IOR('E', 0x40 + (abs), struct input_absinfo)
150#define EVIOCSABS(abs) _IOW('E', 0xc0 + (abs), struct input_absinfo)
151
152#define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect))
153#define EVIOCRMFF _IOW('E', 0x81, int)
154#define EVIOCGEFFECTS _IOR('E', 0x84, int)
155
156#define EVIOCGRAB _IOW('E', 0x90, int)
157
158#define EVIOCSCLOCKID _IOW('E', 0xa0, int)
159
160
161
162
163
164#define INPUT_PROP_POINTER 0x00
165#define INPUT_PROP_DIRECT 0x01
166#define INPUT_PROP_BUTTONPAD 0x02
167#define INPUT_PROP_SEMI_MT 0x03
168
169#define INPUT_PROP_MAX 0x1f
170#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
171
172
173
174
175
176#define EV_SYN 0x00
177#define EV_KEY 0x01
178#define EV_REL 0x02
179#define EV_ABS 0x03
180#define EV_MSC 0x04
181#define EV_SW 0x05
182#define EV_LED 0x11
183#define EV_SND 0x12
184#define EV_REP 0x14
185#define EV_FF 0x15
186#define EV_PWR 0x16
187#define EV_FF_STATUS 0x17
188#define EV_MAX 0x1f
189#define EV_CNT (EV_MAX+1)
190
191
192
193
194
195#define SYN_REPORT 0
196#define SYN_CONFIG 1
197#define SYN_MT_REPORT 2
198#define SYN_DROPPED 3
199
200
201
202
203
204
205
206
207
208
209
210
211#define KEY_RESERVED 0
212#define KEY_ESC 1
213#define KEY_1 2
214#define KEY_2 3
215#define KEY_3 4
216#define KEY_4 5
217#define KEY_5 6
218#define KEY_6 7
219#define KEY_7 8
220#define KEY_8 9
221#define KEY_9 10
222#define KEY_0 11
223#define KEY_MINUS 12
224#define KEY_EQUAL 13
225#define KEY_BACKSPACE 14
226#define KEY_TAB 15
227#define KEY_Q 16
228#define KEY_W 17
229#define KEY_E 18
230#define KEY_R 19
231#define KEY_T 20
232#define KEY_Y 21
233#define KEY_U 22
234#define KEY_I 23
235#define KEY_O 24
236#define KEY_P 25
237#define KEY_LEFTBRACE 26
238#define KEY_RIGHTBRACE 27
239#define KEY_ENTER 28
240#define KEY_LEFTCTRL 29
241#define KEY_A 30
242#define KEY_S 31
243#define KEY_D 32
244#define KEY_F 33
245#define KEY_G 34
246#define KEY_H 35
247#define KEY_J 36
248#define KEY_K 37
249#define KEY_L 38
250#define KEY_SEMICOLON 39
251#define KEY_APOSTROPHE 40
252#define KEY_GRAVE 41
253#define KEY_LEFTSHIFT 42
254#define KEY_BACKSLASH 43
255#define KEY_Z 44
256#define KEY_X 45
257#define KEY_C 46
258#define KEY_V 47
259#define KEY_B 48
260#define KEY_N 49
261#define KEY_M 50
262#define KEY_COMMA 51
263#define KEY_DOT 52
264#define KEY_SLASH 53
265#define KEY_RIGHTSHIFT 54
266#define KEY_KPASTERISK 55
267#define KEY_LEFTALT 56
268#define KEY_SPACE 57
269#define KEY_CAPSLOCK 58
270#define KEY_F1 59
271#define KEY_F2 60
272#define KEY_F3 61
273#define KEY_F4 62
274#define KEY_F5 63
275#define KEY_F6 64
276#define KEY_F7 65
277#define KEY_F8 66
278#define KEY_F9 67
279#define KEY_F10 68
280#define KEY_NUMLOCK 69
281#define KEY_SCROLLLOCK 70
282#define KEY_KP7 71
283#define KEY_KP8 72
284#define KEY_KP9 73
285#define KEY_KPMINUS 74
286#define KEY_KP4 75
287#define KEY_KP5 76
288#define KEY_KP6 77
289#define KEY_KPPLUS 78
290#define KEY_KP1 79
291#define KEY_KP2 80
292#define KEY_KP3 81
293#define KEY_KP0 82
294#define KEY_KPDOT 83
295
296#define KEY_ZENKAKUHANKAKU 85
297#define KEY_102ND 86
298#define KEY_F11 87
299#define KEY_F12 88
300#define KEY_RO 89
301#define KEY_KATAKANA 90
302#define KEY_HIRAGANA 91
303#define KEY_HENKAN 92
304#define KEY_KATAKANAHIRAGANA 93
305#define KEY_MUHENKAN 94
306#define KEY_KPJPCOMMA 95
307#define KEY_KPENTER 96
308#define KEY_RIGHTCTRL 97
309#define KEY_KPSLASH 98
310#define KEY_SYSRQ 99
311#define KEY_RIGHTALT 100
312#define KEY_LINEFEED 101
313#define KEY_HOME 102
314#define KEY_UP 103
315#define KEY_PAGEUP 104
316#define KEY_LEFT 105
317#define KEY_RIGHT 106
318#define KEY_END 107
319#define KEY_DOWN 108
320#define KEY_PAGEDOWN 109
321#define KEY_INSERT 110
322#define KEY_DELETE 111
323#define KEY_MACRO 112
324#define KEY_MUTE 113
325#define KEY_VOLUMEDOWN 114
326#define KEY_VOLUMEUP 115
327#define KEY_POWER 116
328#define KEY_KPEQUAL 117
329#define KEY_KPPLUSMINUS 118
330#define KEY_PAUSE 119
331#define KEY_SCALE 120
332
333#define KEY_KPCOMMA 121
334#define KEY_HANGEUL 122
335#define KEY_HANGUEL KEY_HANGEUL
336#define KEY_HANJA 123
337#define KEY_YEN 124
338#define KEY_LEFTMETA 125
339#define KEY_RIGHTMETA 126
340#define KEY_COMPOSE 127
341
342#define KEY_STOP 128
343#define KEY_AGAIN 129
344#define KEY_PROPS 130
345#define KEY_UNDO 131
346#define KEY_FRONT 132
347#define KEY_COPY 133
348#define KEY_OPEN 134
349#define KEY_PASTE 135
350#define KEY_FIND 136
351#define KEY_CUT 137
352#define KEY_HELP 138
353#define KEY_MENU 139
354#define KEY_CALC 140
355#define KEY_SETUP 141
356#define KEY_SLEEP 142
357#define KEY_WAKEUP 143
358#define KEY_FILE 144
359#define KEY_SENDFILE 145
360#define KEY_DELETEFILE 146
361#define KEY_XFER 147
362#define KEY_PROG1 148
363#define KEY_PROG2 149
364#define KEY_WWW 150
365#define KEY_MSDOS 151
366#define KEY_COFFEE 152
367#define KEY_SCREENLOCK KEY_COFFEE
368#define KEY_DIRECTION 153
369#define KEY_CYCLEWINDOWS 154
370#define KEY_MAIL 155
371#define KEY_BOOKMARKS 156
372#define KEY_COMPUTER 157
373#define KEY_BACK 158
374#define KEY_FORWARD 159
375#define KEY_CLOSECD 160
376#define KEY_EJECTCD 161
377#define KEY_EJECTCLOSECD 162
378#define KEY_NEXTSONG 163
379#define KEY_PLAYPAUSE 164
380#define KEY_PREVIOUSSONG 165
381#define KEY_STOPCD 166
382#define KEY_RECORD 167
383#define KEY_REWIND 168
384#define KEY_PHONE 169
385#define KEY_ISO 170
386#define KEY_CONFIG 171
387#define KEY_HOMEPAGE 172
388#define KEY_REFRESH 173
389#define KEY_EXIT 174
390#define KEY_MOVE 175
391#define KEY_EDIT 176
392#define KEY_SCROLLUP 177
393#define KEY_SCROLLDOWN 178
394#define KEY_KPLEFTPAREN 179
395#define KEY_KPRIGHTPAREN 180
396#define KEY_NEW 181
397#define KEY_REDO 182
398
399#define KEY_F13 183
400#define KEY_F14 184
401#define KEY_F15 185
402#define KEY_F16 186
403#define KEY_F17 187
404#define KEY_F18 188
405#define KEY_F19 189
406#define KEY_F20 190
407#define KEY_F21 191
408#define KEY_F22 192
409#define KEY_F23 193
410#define KEY_F24 194
411
412#define KEY_PLAYCD 200
413#define KEY_PAUSECD 201
414#define KEY_PROG3 202
415#define KEY_PROG4 203
416#define KEY_DASHBOARD 204
417#define KEY_SUSPEND 205
418#define KEY_CLOSE 206
419#define KEY_PLAY 207
420#define KEY_FASTFORWARD 208
421#define KEY_BASSBOOST 209
422#define KEY_PRINT 210
423#define KEY_HP 211
424#define KEY_CAMERA 212
425#define KEY_SOUND 213
426#define KEY_QUESTION 214
427#define KEY_EMAIL 215
428#define KEY_CHAT 216
429#define KEY_SEARCH 217
430#define KEY_CONNECT 218
431#define KEY_FINANCE 219
432#define KEY_SPORT 220
433#define KEY_SHOP 221
434#define KEY_ALTERASE 222
435#define KEY_CANCEL 223
436#define KEY_BRIGHTNESSDOWN 224
437#define KEY_BRIGHTNESSUP 225
438#define KEY_MEDIA 226
439
440#define KEY_SWITCHVIDEOMODE 227
441
442#define KEY_KBDILLUMTOGGLE 228
443#define KEY_KBDILLUMDOWN 229
444#define KEY_KBDILLUMUP 230
445
446#define KEY_SEND 231
447#define KEY_REPLY 232
448#define KEY_FORWARDMAIL 233
449#define KEY_SAVE 234
450#define KEY_DOCUMENTS 235
451
452#define KEY_BATTERY 236
453
454#define KEY_BLUETOOTH 237
455#define KEY_WLAN 238
456#define KEY_UWB 239
457
458#define KEY_UNKNOWN 240
459
460#define KEY_VIDEO_NEXT 241
461#define KEY_VIDEO_PREV 242
462#define KEY_BRIGHTNESS_CYCLE 243
463#define KEY_BRIGHTNESS_ZERO 244
464#define KEY_DISPLAY_OFF 245
465
466#define KEY_WIMAX 246
467#define KEY_RFKILL 247
468
469#define KEY_MICMUTE 248
470
471
472
473#define BTN_MISC 0x100
474#define BTN_0 0x100
475#define BTN_1 0x101
476#define BTN_2 0x102
477#define BTN_3 0x103
478#define BTN_4 0x104
479#define BTN_5 0x105
480#define BTN_6 0x106
481#define BTN_7 0x107
482#define BTN_8 0x108
483#define BTN_9 0x109
484
485#define BTN_MOUSE 0x110
486#define BTN_LEFT 0x110
487#define BTN_RIGHT 0x111
488#define BTN_MIDDLE 0x112
489#define BTN_SIDE 0x113
490#define BTN_EXTRA 0x114
491#define BTN_FORWARD 0x115
492#define BTN_BACK 0x116
493#define BTN_TASK 0x117
494
495#define BTN_JOYSTICK 0x120
496#define BTN_TRIGGER 0x120
497#define BTN_THUMB 0x121
498#define BTN_THUMB2 0x122
499#define BTN_TOP 0x123
500#define BTN_TOP2 0x124
501#define BTN_PINKIE 0x125
502#define BTN_BASE 0x126
503#define BTN_BASE2 0x127
504#define BTN_BASE3 0x128
505#define BTN_BASE4 0x129
506#define BTN_BASE5 0x12a
507#define BTN_BASE6 0x12b
508#define BTN_DEAD 0x12f
509
510#define BTN_GAMEPAD 0x130
511#define BTN_A 0x130
512#define BTN_B 0x131
513#define BTN_C 0x132
514#define BTN_X 0x133
515#define BTN_Y 0x134
516#define BTN_Z 0x135
517#define BTN_TL 0x136
518#define BTN_TR 0x137
519#define BTN_TL2 0x138
520#define BTN_TR2 0x139
521#define BTN_SELECT 0x13a
522#define BTN_START 0x13b
523#define BTN_MODE 0x13c
524#define BTN_THUMBL 0x13d
525#define BTN_THUMBR 0x13e
526
527#define BTN_DIGI 0x140
528#define BTN_TOOL_PEN 0x140
529#define BTN_TOOL_RUBBER 0x141
530#define BTN_TOOL_BRUSH 0x142
531#define BTN_TOOL_PENCIL 0x143
532#define BTN_TOOL_AIRBRUSH 0x144
533#define BTN_TOOL_FINGER 0x145
534#define BTN_TOOL_MOUSE 0x146
535#define BTN_TOOL_LENS 0x147
536#define BTN_TOOL_QUINTTAP 0x148
537#define BTN_TOUCH 0x14a
538#define BTN_STYLUS 0x14b
539#define BTN_STYLUS2 0x14c
540#define BTN_TOOL_DOUBLETAP 0x14d
541#define BTN_TOOL_TRIPLETAP 0x14e
542#define BTN_TOOL_QUADTAP 0x14f
543
544#define BTN_WHEEL 0x150
545#define BTN_GEAR_DOWN 0x150
546#define BTN_GEAR_UP 0x151
547
548#define KEY_OK 0x160
549#define KEY_SELECT 0x161
550#define KEY_GOTO 0x162
551#define KEY_CLEAR 0x163
552#define KEY_POWER2 0x164
553#define KEY_OPTION 0x165
554#define KEY_INFO 0x166
555#define KEY_TIME 0x167
556#define KEY_VENDOR 0x168
557#define KEY_ARCHIVE 0x169
558#define KEY_PROGRAM 0x16a
559#define KEY_CHANNEL 0x16b
560#define KEY_FAVORITES 0x16c
561#define KEY_EPG 0x16d
562#define KEY_PVR 0x16e
563#define KEY_MHP 0x16f
564#define KEY_LANGUAGE 0x170
565#define KEY_TITLE 0x171
566#define KEY_SUBTITLE 0x172
567#define KEY_ANGLE 0x173
568#define KEY_ZOOM 0x174
569#define KEY_MODE 0x175
570#define KEY_KEYBOARD 0x176
571#define KEY_SCREEN 0x177
572#define KEY_PC 0x178
573#define KEY_TV 0x179
574#define KEY_TV2 0x17a
575#define KEY_VCR 0x17b
576#define KEY_VCR2 0x17c
577#define KEY_SAT 0x17d
578#define KEY_SAT2 0x17e
579#define KEY_CD 0x17f
580#define KEY_TAPE 0x180
581#define KEY_RADIO 0x181
582#define KEY_TUNER 0x182
583#define KEY_PLAYER 0x183
584#define KEY_TEXT 0x184
585#define KEY_DVD 0x185
586#define KEY_AUX 0x186
587#define KEY_MP3 0x187
588#define KEY_AUDIO 0x188
589#define KEY_VIDEO 0x189
590#define KEY_DIRECTORY 0x18a
591#define KEY_LIST 0x18b
592#define KEY_MEMO 0x18c
593#define KEY_CALENDAR 0x18d
594#define KEY_RED 0x18e
595#define KEY_GREEN 0x18f
596#define KEY_YELLOW 0x190
597#define KEY_BLUE 0x191
598#define KEY_CHANNELUP 0x192
599#define KEY_CHANNELDOWN 0x193
600#define KEY_FIRST 0x194
601#define KEY_LAST 0x195
602#define KEY_AB 0x196
603#define KEY_NEXT 0x197
604#define KEY_RESTART 0x198
605#define KEY_SLOW 0x199
606#define KEY_SHUFFLE 0x19a
607#define KEY_BREAK 0x19b
608#define KEY_PREVIOUS 0x19c
609#define KEY_DIGITS 0x19d
610#define KEY_TEEN 0x19e
611#define KEY_TWEN 0x19f
612#define KEY_VIDEOPHONE 0x1a0
613#define KEY_GAMES 0x1a1
614#define KEY_ZOOMIN 0x1a2
615#define KEY_ZOOMOUT 0x1a3
616#define KEY_ZOOMRESET 0x1a4
617#define KEY_WORDPROCESSOR 0x1a5
618#define KEY_EDITOR 0x1a6
619#define KEY_SPREADSHEET 0x1a7
620#define KEY_GRAPHICSEDITOR 0x1a8
621#define KEY_PRESENTATION 0x1a9
622#define KEY_DATABASE 0x1aa
623#define KEY_NEWS 0x1ab
624#define KEY_VOICEMAIL 0x1ac
625#define KEY_ADDRESSBOOK 0x1ad
626#define KEY_MESSENGER 0x1ae
627#define KEY_DISPLAYTOGGLE 0x1af
628#define KEY_SPELLCHECK 0x1b0
629#define KEY_LOGOFF 0x1b1
630
631#define KEY_DOLLAR 0x1b2
632#define KEY_EURO 0x1b3
633
634#define KEY_FRAMEBACK 0x1b4
635#define KEY_FRAMEFORWARD 0x1b5
636#define KEY_CONTEXT_MENU 0x1b6
637#define KEY_MEDIA_REPEAT 0x1b7
638#define KEY_10CHANNELSUP 0x1b8
639#define KEY_10CHANNELSDOWN 0x1b9
640#define KEY_IMAGES 0x1ba
641
642#define KEY_DEL_EOL 0x1c0
643#define KEY_DEL_EOS 0x1c1
644#define KEY_INS_LINE 0x1c2
645#define KEY_DEL_LINE 0x1c3
646
647#define KEY_FN 0x1d0
648#define KEY_FN_ESC 0x1d1
649#define KEY_FN_F1 0x1d2
650#define KEY_FN_F2 0x1d3
651#define KEY_FN_F3 0x1d4
652#define KEY_FN_F4 0x1d5
653#define KEY_FN_F5 0x1d6
654#define KEY_FN_F6 0x1d7
655#define KEY_FN_F7 0x1d8
656#define KEY_FN_F8 0x1d9
657#define KEY_FN_F9 0x1da
658#define KEY_FN_F10 0x1db
659#define KEY_FN_F11 0x1dc
660#define KEY_FN_F12 0x1dd
661#define KEY_FN_1 0x1de
662#define KEY_FN_2 0x1df
663#define KEY_FN_D 0x1e0
664#define KEY_FN_E 0x1e1
665#define KEY_FN_F 0x1e2
666#define KEY_FN_S 0x1e3
667#define KEY_FN_B 0x1e4
668
669#define KEY_BRL_DOT1 0x1f1
670#define KEY_BRL_DOT2 0x1f2
671#define KEY_BRL_DOT3 0x1f3
672#define KEY_BRL_DOT4 0x1f4
673#define KEY_BRL_DOT5 0x1f5
674#define KEY_BRL_DOT6 0x1f6
675#define KEY_BRL_DOT7 0x1f7
676#define KEY_BRL_DOT8 0x1f8
677#define KEY_BRL_DOT9 0x1f9
678#define KEY_BRL_DOT10 0x1fa
679
680#define KEY_NUMERIC_0 0x200
681#define KEY_NUMERIC_1 0x201
682#define KEY_NUMERIC_2 0x202
683#define KEY_NUMERIC_3 0x203
684#define KEY_NUMERIC_4 0x204
685#define KEY_NUMERIC_5 0x205
686#define KEY_NUMERIC_6 0x206
687#define KEY_NUMERIC_7 0x207
688#define KEY_NUMERIC_8 0x208
689#define KEY_NUMERIC_9 0x209
690#define KEY_NUMERIC_STAR 0x20a
691#define KEY_NUMERIC_POUND 0x20b
692
693#define KEY_CAMERA_FOCUS 0x210
694#define KEY_WPS_BUTTON 0x211
695
696#define KEY_TOUCHPAD_TOGGLE 0x212
697#define KEY_TOUCHPAD_ON 0x213
698#define KEY_TOUCHPAD_OFF 0x214
699
700#define KEY_CAMERA_ZOOMIN 0x215
701#define KEY_CAMERA_ZOOMOUT 0x216
702#define KEY_CAMERA_UP 0x217
703#define KEY_CAMERA_DOWN 0x218
704#define KEY_CAMERA_LEFT 0x219
705#define KEY_CAMERA_RIGHT 0x21a
706
707#define BTN_TRIGGER_HAPPY 0x2c0
708#define BTN_TRIGGER_HAPPY1 0x2c0
709#define BTN_TRIGGER_HAPPY2 0x2c1
710#define BTN_TRIGGER_HAPPY3 0x2c2
711#define BTN_TRIGGER_HAPPY4 0x2c3
712#define BTN_TRIGGER_HAPPY5 0x2c4
713#define BTN_TRIGGER_HAPPY6 0x2c5
714#define BTN_TRIGGER_HAPPY7 0x2c6
715#define BTN_TRIGGER_HAPPY8 0x2c7
716#define BTN_TRIGGER_HAPPY9 0x2c8
717#define BTN_TRIGGER_HAPPY10 0x2c9
718#define BTN_TRIGGER_HAPPY11 0x2ca
719#define BTN_TRIGGER_HAPPY12 0x2cb
720#define BTN_TRIGGER_HAPPY13 0x2cc
721#define BTN_TRIGGER_HAPPY14 0x2cd
722#define BTN_TRIGGER_HAPPY15 0x2ce
723#define BTN_TRIGGER_HAPPY16 0x2cf
724#define BTN_TRIGGER_HAPPY17 0x2d0
725#define BTN_TRIGGER_HAPPY18 0x2d1
726#define BTN_TRIGGER_HAPPY19 0x2d2
727#define BTN_TRIGGER_HAPPY20 0x2d3
728#define BTN_TRIGGER_HAPPY21 0x2d4
729#define BTN_TRIGGER_HAPPY22 0x2d5
730#define BTN_TRIGGER_HAPPY23 0x2d6
731#define BTN_TRIGGER_HAPPY24 0x2d7
732#define BTN_TRIGGER_HAPPY25 0x2d8
733#define BTN_TRIGGER_HAPPY26 0x2d9
734#define BTN_TRIGGER_HAPPY27 0x2da
735#define BTN_TRIGGER_HAPPY28 0x2db
736#define BTN_TRIGGER_HAPPY29 0x2dc
737#define BTN_TRIGGER_HAPPY30 0x2dd
738#define BTN_TRIGGER_HAPPY31 0x2de
739#define BTN_TRIGGER_HAPPY32 0x2df
740#define BTN_TRIGGER_HAPPY33 0x2e0
741#define BTN_TRIGGER_HAPPY34 0x2e1
742#define BTN_TRIGGER_HAPPY35 0x2e2
743#define BTN_TRIGGER_HAPPY36 0x2e3
744#define BTN_TRIGGER_HAPPY37 0x2e4
745#define BTN_TRIGGER_HAPPY38 0x2e5
746#define BTN_TRIGGER_HAPPY39 0x2e6
747#define BTN_TRIGGER_HAPPY40 0x2e7
748
749
750#define KEY_MIN_INTERESTING KEY_MUTE
751#define KEY_MAX 0x2ff
752#define KEY_CNT (KEY_MAX+1)
753
754
755
756
757
758#define REL_X 0x00
759#define REL_Y 0x01
760#define REL_Z 0x02
761#define REL_RX 0x03
762#define REL_RY 0x04
763#define REL_RZ 0x05
764#define REL_HWHEEL 0x06
765#define REL_DIAL 0x07
766#define REL_WHEEL 0x08
767#define REL_MISC 0x09
768#define REL_MAX 0x0f
769#define REL_CNT (REL_MAX+1)
770
771
772
773
774
775#define ABS_X 0x00
776#define ABS_Y 0x01
777#define ABS_Z 0x02
778#define ABS_RX 0x03
779#define ABS_RY 0x04
780#define ABS_RZ 0x05
781#define ABS_THROTTLE 0x06
782#define ABS_RUDDER 0x07
783#define ABS_WHEEL 0x08
784#define ABS_GAS 0x09
785#define ABS_BRAKE 0x0a
786#define ABS_HAT0X 0x10
787#define ABS_HAT0Y 0x11
788#define ABS_HAT1X 0x12
789#define ABS_HAT1Y 0x13
790#define ABS_HAT2X 0x14
791#define ABS_HAT2Y 0x15
792#define ABS_HAT3X 0x16
793#define ABS_HAT3Y 0x17
794#define ABS_PRESSURE 0x18
795#define ABS_DISTANCE 0x19
796#define ABS_TILT_X 0x1a
797#define ABS_TILT_Y 0x1b
798#define ABS_TOOL_WIDTH 0x1c
799
800#define ABS_VOLUME 0x20
801
802#define ABS_MISC 0x28
803
804#define ABS_MT_SLOT 0x2f
805#define ABS_MT_TOUCH_MAJOR 0x30
806#define ABS_MT_TOUCH_MINOR 0x31
807#define ABS_MT_WIDTH_MAJOR 0x32
808#define ABS_MT_WIDTH_MINOR 0x33
809#define ABS_MT_ORIENTATION 0x34
810#define ABS_MT_POSITION_X 0x35
811#define ABS_MT_POSITION_Y 0x36
812#define ABS_MT_TOOL_TYPE 0x37
813#define ABS_MT_BLOB_ID 0x38
814#define ABS_MT_TRACKING_ID 0x39
815#define ABS_MT_PRESSURE 0x3a
816#define ABS_MT_DISTANCE 0x3b
817#define ABS_MT_TOOL_X 0x3c
818#define ABS_MT_TOOL_Y 0x3d
819
820#ifdef __KERNEL__
821
822#define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR
823#define ABS_MT_LAST ABS_MT_TOOL_Y
824#endif
825
826#define ABS_MAX 0x3f
827#define ABS_CNT (ABS_MAX+1)
828
829
830
831
832
833#define SW_LID 0x00
834#define SW_TABLET_MODE 0x01
835#define SW_HEADPHONE_INSERT 0x02
836#define SW_RFKILL_ALL 0x03
837
838#define SW_RADIO SW_RFKILL_ALL
839#define SW_MICROPHONE_INSERT 0x04
840#define SW_DOCK 0x05
841#define SW_LINEOUT_INSERT 0x06
842#define SW_JACK_PHYSICAL_INSERT 0x07
843#define SW_VIDEOOUT_INSERT 0x08
844#define SW_CAMERA_LENS_COVER 0x09
845#define SW_KEYPAD_SLIDE 0x0a
846#define SW_FRONT_PROXIMITY 0x0b
847#define SW_ROTATE_LOCK 0x0c
848#define SW_LINEIN_INSERT 0x0d
849#define SW_MAX 0x0f
850#define SW_CNT (SW_MAX+1)
851
852
853
854
855
856#define MSC_SERIAL 0x00
857#define MSC_PULSELED 0x01
858#define MSC_GESTURE 0x02
859#define MSC_RAW 0x03
860#define MSC_SCAN 0x04
861#define MSC_MAX 0x07
862#define MSC_CNT (MSC_MAX+1)
863
864
865
866
867
868#define LED_NUML 0x00
869#define LED_CAPSL 0x01
870#define LED_SCROLLL 0x02
871#define LED_COMPOSE 0x03
872#define LED_KANA 0x04
873#define LED_SLEEP 0x05
874#define LED_SUSPEND 0x06
875#define LED_MUTE 0x07
876#define LED_MISC 0x08
877#define LED_MAIL 0x09
878#define LED_CHARGING 0x0a
879#define LED_MAX 0x0f
880#define LED_CNT (LED_MAX+1)
881
882
883
884
885
886#define REP_DELAY 0x00
887#define REP_PERIOD 0x01
888#define REP_MAX 0x01
889#define REP_CNT (REP_MAX+1)
890
891
892
893
894
895#define SND_CLICK 0x00
896#define SND_BELL 0x01
897#define SND_TONE 0x02
898#define SND_MAX 0x07
899#define SND_CNT (SND_MAX+1)
900
901
902
903
904
905#define ID_BUS 0
906#define ID_VENDOR 1
907#define ID_PRODUCT 2
908#define ID_VERSION 3
909
910#define BUS_PCI 0x01
911#define BUS_ISAPNP 0x02
912#define BUS_USB 0x03
913#define BUS_HIL 0x04
914#define BUS_BLUETOOTH 0x05
915#define BUS_VIRTUAL 0x06
916
917#define BUS_ISA 0x10
918#define BUS_I8042 0x11
919#define BUS_XTKBD 0x12
920#define BUS_RS232 0x13
921#define BUS_GAMEPORT 0x14
922#define BUS_PARPORT 0x15
923#define BUS_AMIGA 0x16
924#define BUS_ADB 0x17
925#define BUS_I2C 0x18
926#define BUS_HOST 0x19
927#define BUS_GSC 0x1A
928#define BUS_ATARI 0x1B
929#define BUS_SPI 0x1C
930
931
932
933
934#define MT_TOOL_FINGER 0
935#define MT_TOOL_PEN 1
936#define MT_TOOL_MAX 1
937
938
939
940
941#define FF_STATUS_STOPPED 0x00
942#define FF_STATUS_PLAYING 0x01
943#define FF_STATUS_MAX 0x01
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960struct ff_replay {
961 __u16 length;
962 __u16 delay;
963};
964
965
966
967
968
969
970struct ff_trigger {
971 __u16 button;
972 __u16 interval;
973};
974
975
976
977
978
979
980
981
982
983
984
985
986
987struct ff_envelope {
988 __u16 attack_length;
989 __u16 attack_level;
990 __u16 fade_length;
991 __u16 fade_level;
992};
993
994
995
996
997
998
999struct ff_constant_effect {
1000 __s16 level;
1001 struct ff_envelope envelope;
1002};
1003
1004
1005
1006
1007
1008
1009
1010struct ff_ramp_effect {
1011 __s16 start_level;
1012 __s16 end_level;
1013 struct ff_envelope envelope;
1014};
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026struct ff_condition_effect {
1027 __u16 right_saturation;
1028 __u16 left_saturation;
1029
1030 __s16 right_coeff;
1031 __s16 left_coeff;
1032
1033 __u16 deadband;
1034 __s16 center;
1035};
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055struct ff_periodic_effect {
1056 __u16 waveform;
1057 __u16 period;
1058 __s16 magnitude;
1059 __s16 offset;
1060 __u16 phase;
1061
1062 struct ff_envelope envelope;
1063
1064 __u32 custom_len;
1065 __s16 __user *custom_data;
1066};
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076struct ff_rumble_effect {
1077 __u16 strong_magnitude;
1078 __u16 weak_magnitude;
1079};
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104struct ff_effect {
1105 __u16 type;
1106 __s16 id;
1107 __u16 direction;
1108 struct ff_trigger trigger;
1109 struct ff_replay replay;
1110
1111 union {
1112 struct ff_constant_effect constant;
1113 struct ff_ramp_effect ramp;
1114 struct ff_periodic_effect periodic;
1115 struct ff_condition_effect condition[2];
1116 struct ff_rumble_effect rumble;
1117 } u;
1118};
1119
1120
1121
1122
1123
1124#define FF_RUMBLE 0x50
1125#define FF_PERIODIC 0x51
1126#define FF_CONSTANT 0x52
1127#define FF_SPRING 0x53
1128#define FF_FRICTION 0x54
1129#define FF_DAMPER 0x55
1130#define FF_INERTIA 0x56
1131#define FF_RAMP 0x57
1132
1133#define FF_EFFECT_MIN FF_RUMBLE
1134#define FF_EFFECT_MAX FF_RAMP
1135
1136
1137
1138
1139
1140#define FF_SQUARE 0x58
1141#define FF_TRIANGLE 0x59
1142#define FF_SINE 0x5a
1143#define FF_SAW_UP 0x5b
1144#define FF_SAW_DOWN 0x5c
1145#define FF_CUSTOM 0x5d
1146
1147#define FF_WAVEFORM_MIN FF_SQUARE
1148#define FF_WAVEFORM_MAX FF_CUSTOM
1149
1150
1151
1152
1153
1154#define FF_GAIN 0x60
1155#define FF_AUTOCENTER 0x61
1156
1157#define FF_MAX 0x7f
1158#define FF_CNT (FF_MAX+1)
1159
1160#ifdef __KERNEL__
1161
1162
1163
1164
1165
1166#include <linux/device.h>
1167#include <linux/fs.h>
1168#include <linux/timer.h>
1169#include <linux/mod_devicetable.h>
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253struct input_dev {
1254 const char *name;
1255 const char *phys;
1256 const char *uniq;
1257 struct input_id id;
1258
1259 unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
1260
1261 unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
1262 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
1263 unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
1264 unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
1265 unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
1266 unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
1267 unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
1268 unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
1269 unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
1270
1271 unsigned int hint_events_per_packet;
1272
1273 unsigned int keycodemax;
1274 unsigned int keycodesize;
1275 void *keycode;
1276
1277 int (*setkeycode)(struct input_dev *dev,
1278 const struct input_keymap_entry *ke,
1279 unsigned int *old_keycode);
1280 int (*getkeycode)(struct input_dev *dev,
1281 struct input_keymap_entry *ke);
1282
1283 struct ff_device *ff;
1284
1285 unsigned int repeat_key;
1286 struct timer_list timer;
1287
1288 int rep[REP_CNT];
1289
1290 struct input_mt_slot *mt;
1291 int mtsize;
1292 int slot;
1293 int trkid;
1294
1295 struct input_absinfo *absinfo;
1296
1297 unsigned long key[BITS_TO_LONGS(KEY_CNT)];
1298 unsigned long led[BITS_TO_LONGS(LED_CNT)];
1299 unsigned long snd[BITS_TO_LONGS(SND_CNT)];
1300 unsigned long sw[BITS_TO_LONGS(SW_CNT)];
1301
1302 int (*open)(struct input_dev *dev);
1303 void (*close)(struct input_dev *dev);
1304 int (*flush)(struct input_dev *dev, struct file *file);
1305 int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
1306
1307 struct input_handle __rcu *grab;
1308
1309 spinlock_t event_lock;
1310 struct mutex mutex;
1311
1312 unsigned int users;
1313 bool going_away;
1314
1315 bool sync;
1316
1317 struct device dev;
1318
1319 struct list_head h_list;
1320 struct list_head node;
1321};
1322#define to_input_dev(d) container_of(d, struct input_dev, dev)
1323
1324
1325
1326
1327
1328#if EV_MAX != INPUT_DEVICE_ID_EV_MAX
1329#error "EV_MAX and INPUT_DEVICE_ID_EV_MAX do not match"
1330#endif
1331
1332#if KEY_MIN_INTERESTING != INPUT_DEVICE_ID_KEY_MIN_INTERESTING
1333#error "KEY_MIN_INTERESTING and INPUT_DEVICE_ID_KEY_MIN_INTERESTING do not match"
1334#endif
1335
1336#if KEY_MAX != INPUT_DEVICE_ID_KEY_MAX
1337#error "KEY_MAX and INPUT_DEVICE_ID_KEY_MAX do not match"
1338#endif
1339
1340#if REL_MAX != INPUT_DEVICE_ID_REL_MAX
1341#error "REL_MAX and INPUT_DEVICE_ID_REL_MAX do not match"
1342#endif
1343
1344#if ABS_MAX != INPUT_DEVICE_ID_ABS_MAX
1345#error "ABS_MAX and INPUT_DEVICE_ID_ABS_MAX do not match"
1346#endif
1347
1348#if MSC_MAX != INPUT_DEVICE_ID_MSC_MAX
1349#error "MSC_MAX and INPUT_DEVICE_ID_MSC_MAX do not match"
1350#endif
1351
1352#if LED_MAX != INPUT_DEVICE_ID_LED_MAX
1353#error "LED_MAX and INPUT_DEVICE_ID_LED_MAX do not match"
1354#endif
1355
1356#if SND_MAX != INPUT_DEVICE_ID_SND_MAX
1357#error "SND_MAX and INPUT_DEVICE_ID_SND_MAX do not match"
1358#endif
1359
1360#if FF_MAX != INPUT_DEVICE_ID_FF_MAX
1361#error "FF_MAX and INPUT_DEVICE_ID_FF_MAX do not match"
1362#endif
1363
1364#if SW_MAX != INPUT_DEVICE_ID_SW_MAX
1365#error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match"
1366#endif
1367
1368#define INPUT_DEVICE_ID_MATCH_DEVICE \
1369 (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT)
1370#define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \
1371 (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION)
1372
1373struct input_handle;
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412struct input_handler {
1413
1414 void *private;
1415
1416 void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
1417 bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
1418 bool (*match)(struct input_handler *handler, struct input_dev *dev);
1419 int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
1420 void (*disconnect)(struct input_handle *handle);
1421 void (*start)(struct input_handle *handle);
1422
1423 const struct file_operations *fops;
1424 int minor;
1425 const char *name;
1426
1427 const struct input_device_id *id_table;
1428
1429 struct list_head h_list;
1430 struct list_head node;
1431};
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445struct input_handle {
1446
1447 void *private;
1448
1449 int open;
1450 const char *name;
1451
1452 struct input_dev *dev;
1453 struct input_handler *handler;
1454
1455 struct list_head d_node;
1456 struct list_head h_node;
1457};
1458
1459struct input_dev *input_allocate_device(void);
1460void input_free_device(struct input_dev *dev);
1461
1462static inline struct input_dev *input_get_device(struct input_dev *dev)
1463{
1464 return dev ? to_input_dev(get_device(&dev->dev)) : NULL;
1465}
1466
1467static inline void input_put_device(struct input_dev *dev)
1468{
1469 if (dev)
1470 put_device(&dev->dev);
1471}
1472
1473static inline void *input_get_drvdata(struct input_dev *dev)
1474{
1475 return dev_get_drvdata(&dev->dev);
1476}
1477
1478static inline void input_set_drvdata(struct input_dev *dev, void *data)
1479{
1480 dev_set_drvdata(&dev->dev, data);
1481}
1482
1483int __must_check input_register_device(struct input_dev *);
1484void input_unregister_device(struct input_dev *);
1485
1486void input_reset_device(struct input_dev *);
1487
1488int __must_check input_register_handler(struct input_handler *);
1489void input_unregister_handler(struct input_handler *);
1490
1491int input_handler_for_each_handle(struct input_handler *, void *data,
1492 int (*fn)(struct input_handle *, void *));
1493
1494int input_register_handle(struct input_handle *);
1495void input_unregister_handle(struct input_handle *);
1496
1497int input_grab_device(struct input_handle *);
1498void input_release_device(struct input_handle *);
1499
1500int input_open_device(struct input_handle *);
1501void input_close_device(struct input_handle *);
1502
1503int input_flush_device(struct input_handle *handle, struct file *file);
1504
1505void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
1506void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value);
1507
1508static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
1509{
1510 input_event(dev, EV_KEY, code, !!value);
1511}
1512
1513static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value)
1514{
1515 input_event(dev, EV_REL, code, value);
1516}
1517
1518static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)
1519{
1520 input_event(dev, EV_ABS, code, value);
1521}
1522
1523static inline void input_report_ff_status(struct input_dev *dev, unsigned int code, int value)
1524{
1525 input_event(dev, EV_FF_STATUS, code, value);
1526}
1527
1528static inline void input_report_switch(struct input_dev *dev, unsigned int code, int value)
1529{
1530 input_event(dev, EV_SW, code, !!value);
1531}
1532
1533static inline void input_sync(struct input_dev *dev)
1534{
1535 input_event(dev, EV_SYN, SYN_REPORT, 0);
1536}
1537
1538static inline void input_mt_sync(struct input_dev *dev)
1539{
1540 input_event(dev, EV_SYN, SYN_MT_REPORT, 0);
1541}
1542
1543void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code);
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555static inline void input_set_events_per_packet(struct input_dev *dev, int n_events)
1556{
1557 dev->hint_events_per_packet = n_events;
1558}
1559
1560void input_alloc_absinfo(struct input_dev *dev);
1561void input_set_abs_params(struct input_dev *dev, unsigned int axis,
1562 int min, int max, int fuzz, int flat);
1563
1564#define INPUT_GENERATE_ABS_ACCESSORS(_suffix, _item) \
1565static inline int input_abs_get_##_suffix(struct input_dev *dev, \
1566 unsigned int axis) \
1567{ \
1568 return dev->absinfo ? dev->absinfo[axis]._item : 0; \
1569} \
1570 \
1571static inline void input_abs_set_##_suffix(struct input_dev *dev, \
1572 unsigned int axis, int val) \
1573{ \
1574 input_alloc_absinfo(dev); \
1575 if (dev->absinfo) \
1576 dev->absinfo[axis]._item = val; \
1577}
1578
1579INPUT_GENERATE_ABS_ACCESSORS(val, value)
1580INPUT_GENERATE_ABS_ACCESSORS(min, minimum)
1581INPUT_GENERATE_ABS_ACCESSORS(max, maximum)
1582INPUT_GENERATE_ABS_ACCESSORS(fuzz, fuzz)
1583INPUT_GENERATE_ABS_ACCESSORS(flat, flat)
1584INPUT_GENERATE_ABS_ACCESSORS(res, resolution)
1585
1586int input_scancode_to_scalar(const struct input_keymap_entry *ke,
1587 unsigned int *scancode);
1588
1589int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke);
1590int input_set_keycode(struct input_dev *dev,
1591 const struct input_keymap_entry *ke);
1592
1593extern struct class input_class;
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622struct ff_device {
1623 int (*upload)(struct input_dev *dev, struct ff_effect *effect,
1624 struct ff_effect *old);
1625 int (*erase)(struct input_dev *dev, int effect_id);
1626
1627 int (*playback)(struct input_dev *dev, int effect_id, int value);
1628 void (*set_gain)(struct input_dev *dev, u16 gain);
1629 void (*set_autocenter)(struct input_dev *dev, u16 magnitude);
1630
1631 void (*destroy)(struct ff_device *);
1632
1633 void *private;
1634
1635 unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
1636
1637 struct mutex mutex;
1638
1639 int max_effects;
1640 struct ff_effect *effects;
1641 struct file *effect_owners[];
1642};
1643
1644int input_ff_create(struct input_dev *dev, unsigned int max_effects);
1645void input_ff_destroy(struct input_dev *dev);
1646
1647int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
1648
1649int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, struct file *file);
1650int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file);
1651
1652int input_ff_create_memless(struct input_dev *dev, void *data,
1653 int (*play_effect)(struct input_dev *, void *, struct ff_effect *));
1654
1655#endif
1656#endif
1657