1 /* 2 * User level driver support for input subsystem 3 * 4 * Heavily based on evdev.c by Vojtech Pavlik 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 * Author: Aristeu Sergio Rozanski Filho <aris@cathedrallabs.org> 21 * 22 * Changes/Revisions: 23 * 0.3 24/05/2006 (Anssi Hannula <anssi.hannulagmail.com>) 24 * - update ff support for the changes in kernel interface 25 * - add UINPUT_VERSION 26 * 0.2 16/10/2004 (Micah Dowty <micah@navi.cx>) 27 * - added force feedback support 28 * - added UI_SET_PHYS 29 * 0.1 20/06/2002 30 * - first public version 31 */ 32 #ifndef _UAPI__UINPUT_H_ 33 #define _UAPI__UINPUT_H_ 34 35 #include <linux/types.h> 36 #include <linux/input.h> 37 38 #define UINPUT_VERSION 3 39 40 41 struct uinput_ff_upload { 42 __u32 request_id; 43 __s32 retval; 44 struct ff_effect effect; 45 struct ff_effect old; 46 }; 47 48 struct uinput_ff_erase { 49 __u32 request_id; 50 __s32 retval; 51 __u32 effect_id; 52 }; 53 54 /* ioctl */ 55 #define UINPUT_IOCTL_BASE 'U' 56 #define UI_DEV_CREATE _IO(UINPUT_IOCTL_BASE, 1) 57 #define UI_DEV_DESTROY _IO(UINPUT_IOCTL_BASE, 2) 58 59 #define UI_SET_EVBIT _IOW(UINPUT_IOCTL_BASE, 100, int) 60 #define UI_SET_KEYBIT _IOW(UINPUT_IOCTL_BASE, 101, int) 61 #define UI_SET_RELBIT _IOW(UINPUT_IOCTL_BASE, 102, int) 62 #define UI_SET_ABSBIT _IOW(UINPUT_IOCTL_BASE, 103, int) 63 #define UI_SET_MSCBIT _IOW(UINPUT_IOCTL_BASE, 104, int) 64 #define UI_SET_LEDBIT _IOW(UINPUT_IOCTL_BASE, 105, int) 65 #define UI_SET_SNDBIT _IOW(UINPUT_IOCTL_BASE, 106, int) 66 #define UI_SET_FFBIT _IOW(UINPUT_IOCTL_BASE, 107, int) 67 #define UI_SET_PHYS _IOW(UINPUT_IOCTL_BASE, 108, char*) 68 #define UI_SET_SWBIT _IOW(UINPUT_IOCTL_BASE, 109, int) 69 #define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int) 70 71 #define UI_BEGIN_FF_UPLOAD _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload) 72 #define UI_END_FF_UPLOAD _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload) 73 #define UI_BEGIN_FF_ERASE _IOWR(UINPUT_IOCTL_BASE, 202, struct uinput_ff_erase) 74 #define UI_END_FF_ERASE _IOW(UINPUT_IOCTL_BASE, 203, struct uinput_ff_erase) 75 76 /* 77 * To write a force-feedback-capable driver, the upload_effect 78 * and erase_effect callbacks in input_dev must be implemented. 79 * The uinput driver will generate a fake input event when one of 80 * these callbacks are invoked. The userspace code then uses 81 * ioctls to retrieve additional parameters and send the return code. 82 * The callback blocks until this return code is sent. 83 * 84 * The described callback mechanism is only used if ff_effects_max 85 * is set. 86 * 87 * To implement upload_effect(): 88 * 1. Wait for an event with type == EV_UINPUT and code == UI_FF_UPLOAD. 89 * A request ID will be given in 'value'. 90 * 2. Allocate a uinput_ff_upload struct, fill in request_id with 91 * the 'value' from the EV_UINPUT event. 92 * 3. Issue a UI_BEGIN_FF_UPLOAD ioctl, giving it the 93 * uinput_ff_upload struct. It will be filled in with the 94 * ff_effects passed to upload_effect(). 95 * 4. Perform the effect upload, and place a return code back into 96 the uinput_ff_upload struct. 97 * 5. Issue a UI_END_FF_UPLOAD ioctl, also giving it the 98 * uinput_ff_upload_effect struct. This will complete execution 99 * of our upload_effect() handler. 100 * 101 * To implement erase_effect(): 102 * 1. Wait for an event with type == EV_UINPUT and code == UI_FF_ERASE. 103 * A request ID will be given in 'value'. 104 * 2. Allocate a uinput_ff_erase struct, fill in request_id with 105 * the 'value' from the EV_UINPUT event. 106 * 3. Issue a UI_BEGIN_FF_ERASE ioctl, giving it the 107 * uinput_ff_erase struct. It will be filled in with the 108 * effect ID passed to erase_effect(). 109 * 4. Perform the effect erasure, and place a return code back 110 * into the uinput_ff_erase struct. 111 * 5. Issue a UI_END_FF_ERASE ioctl, also giving it the 112 * uinput_ff_erase_effect struct. This will complete execution 113 * of our erase_effect() handler. 114 */ 115 116 /* 117 * This is the new event type, used only by uinput. 118 * 'code' is UI_FF_UPLOAD or UI_FF_ERASE, and 'value' 119 * is the unique request ID. This number was picked 120 * arbitrarily, above EV_MAX (since the input system 121 * never sees it) but in the range of a 16-bit int. 122 */ 123 #define EV_UINPUT 0x0101 124 #define UI_FF_UPLOAD 1 125 #define UI_FF_ERASE 2 126 127 #define UINPUT_MAX_NAME_SIZE 80 128 struct uinput_user_dev { 129 char name[UINPUT_MAX_NAME_SIZE]; 130 struct input_id id; 131 __u32 ff_effects_max; 132 __s32 absmax[ABS_CNT]; 133 __s32 absmin[ABS_CNT]; 134 __s32 absfuzz[ABS_CNT]; 135 __s32 absflat[ABS_CNT]; 136 }; 137 #endif /* _UAPI__UINPUT_H_ */ 138