home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / uinput.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  5.7 KB  |  168 lines

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