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