root/drivers/hid/hid-wiimote.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. wiidebug_init
  2. wiidebug_deinit
  3. wiimote_cmd_pending
  4. wiimote_cmd_complete
  5. wiimote_cmd_abort
  6. wiimote_cmd_acquire
  7. wiimote_cmd_acquire_noint
  8. wiimote_cmd_set
  9. wiimote_cmd_release
  10. wiimote_cmd_wait
  11. wiimote_cmd_wait_noint

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 #ifndef __HID_WIIMOTE_H
   3 #define __HID_WIIMOTE_H
   4 
   5 /*
   6  * HID driver for Nintendo Wii / Wii U peripherals
   7  * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
   8  */
   9 
  10 /*
  11  */
  12 
  13 #include <linux/completion.h>
  14 #include <linux/device.h>
  15 #include <linux/hid.h>
  16 #include <linux/input.h>
  17 #include <linux/leds.h>
  18 #include <linux/module.h>
  19 #include <linux/mutex.h>
  20 #include <linux/power_supply.h>
  21 #include <linux/spinlock.h>
  22 #include <linux/timer.h>
  23 
  24 #define WIIMOTE_NAME "Nintendo Wii Remote"
  25 #define WIIMOTE_BUFSIZE 32
  26 
  27 #define WIIPROTO_FLAG_LED1              0x01
  28 #define WIIPROTO_FLAG_LED2              0x02
  29 #define WIIPROTO_FLAG_LED3              0x04
  30 #define WIIPROTO_FLAG_LED4              0x08
  31 #define WIIPROTO_FLAG_RUMBLE            0x10
  32 #define WIIPROTO_FLAG_ACCEL             0x20
  33 #define WIIPROTO_FLAG_IR_BASIC          0x40
  34 #define WIIPROTO_FLAG_IR_EXT            0x80
  35 #define WIIPROTO_FLAG_IR_FULL           0xc0 /* IR_BASIC | IR_EXT */
  36 #define WIIPROTO_FLAG_EXT_PLUGGED       0x0100
  37 #define WIIPROTO_FLAG_EXT_USED          0x0200
  38 #define WIIPROTO_FLAG_EXT_ACTIVE        0x0400
  39 #define WIIPROTO_FLAG_MP_PLUGGED        0x0800
  40 #define WIIPROTO_FLAG_MP_USED           0x1000
  41 #define WIIPROTO_FLAG_MP_ACTIVE         0x2000
  42 #define WIIPROTO_FLAG_EXITING           0x4000
  43 #define WIIPROTO_FLAG_DRM_LOCKED        0x8000
  44 #define WIIPROTO_FLAG_BUILTIN_MP        0x010000
  45 #define WIIPROTO_FLAG_NO_MP             0x020000
  46 #define WIIPROTO_FLAG_PRO_CALIB_DONE    0x040000
  47 
  48 #define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
  49                                         WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)
  50 #define WIIPROTO_FLAGS_IR (WIIPROTO_FLAG_IR_BASIC | WIIPROTO_FLAG_IR_EXT | \
  51                                                         WIIPROTO_FLAG_IR_FULL)
  52 
  53 /* return flag for led \num */
  54 #define WIIPROTO_FLAG_LED(num) (WIIPROTO_FLAG_LED1 << (num - 1))
  55 
  56 enum wiiproto_keys {
  57         WIIPROTO_KEY_LEFT,
  58         WIIPROTO_KEY_RIGHT,
  59         WIIPROTO_KEY_UP,
  60         WIIPROTO_KEY_DOWN,
  61         WIIPROTO_KEY_PLUS,
  62         WIIPROTO_KEY_MINUS,
  63         WIIPROTO_KEY_ONE,
  64         WIIPROTO_KEY_TWO,
  65         WIIPROTO_KEY_A,
  66         WIIPROTO_KEY_B,
  67         WIIPROTO_KEY_HOME,
  68         WIIPROTO_KEY_COUNT
  69 };
  70 
  71 enum wiimote_devtype {
  72         WIIMOTE_DEV_PENDING,
  73         WIIMOTE_DEV_UNKNOWN,
  74         WIIMOTE_DEV_GENERIC,
  75         WIIMOTE_DEV_GEN10,
  76         WIIMOTE_DEV_GEN20,
  77         WIIMOTE_DEV_BALANCE_BOARD,
  78         WIIMOTE_DEV_PRO_CONTROLLER,
  79         WIIMOTE_DEV_NUM,
  80 };
  81 
  82 enum wiimote_exttype {
  83         WIIMOTE_EXT_NONE,
  84         WIIMOTE_EXT_UNKNOWN,
  85         WIIMOTE_EXT_NUNCHUK,
  86         WIIMOTE_EXT_CLASSIC_CONTROLLER,
  87         WIIMOTE_EXT_BALANCE_BOARD,
  88         WIIMOTE_EXT_PRO_CONTROLLER,
  89         WIIMOTE_EXT_DRUMS,
  90         WIIMOTE_EXT_GUITAR,
  91         WIIMOTE_EXT_NUM,
  92 };
  93 
  94 enum wiimote_mptype {
  95         WIIMOTE_MP_NONE,
  96         WIIMOTE_MP_UNKNOWN,
  97         WIIMOTE_MP_SINGLE,
  98         WIIMOTE_MP_PASSTHROUGH_NUNCHUK,
  99         WIIMOTE_MP_PASSTHROUGH_CLASSIC,
 100 };
 101 
 102 struct wiimote_buf {
 103         __u8 data[HID_MAX_BUFFER_SIZE];
 104         size_t size;
 105 };
 106 
 107 struct wiimote_queue {
 108         spinlock_t lock;
 109         struct work_struct worker;
 110         __u8 head;
 111         __u8 tail;
 112         struct wiimote_buf outq[WIIMOTE_BUFSIZE];
 113 };
 114 
 115 struct wiimote_state {
 116         spinlock_t lock;
 117         __u32 flags;
 118         __u8 accel_split[2];
 119         __u8 drm;
 120         __u8 devtype;
 121         __u8 exttype;
 122         __u8 mp;
 123 
 124         /* synchronous cmd requests */
 125         struct mutex sync;
 126         struct completion ready;
 127         int cmd;
 128         __u32 opt;
 129 
 130         /* results of synchronous requests */
 131         __u8 cmd_battery;
 132         __u8 cmd_err;
 133         __u8 *cmd_read_buf;
 134         __u8 cmd_read_size;
 135 
 136         /* calibration/cache data */
 137         __u16 calib_bboard[4][3];
 138         __s16 calib_pro_sticks[4];
 139         __u8 pressure_drums[7];
 140         __u8 cache_rumble;
 141 };
 142 
 143 struct wiimote_data {
 144         struct hid_device *hdev;
 145         struct input_dev *input;
 146         struct work_struct rumble_worker;
 147         struct led_classdev *leds[4];
 148         struct input_dev *accel;
 149         struct input_dev *ir;
 150         struct power_supply *battery;
 151         struct power_supply_desc battery_desc;
 152         struct input_dev *mp;
 153         struct timer_list timer;
 154         struct wiimote_debug *debug;
 155 
 156         union {
 157                 struct input_dev *input;
 158         } extension;
 159 
 160         struct wiimote_queue queue;
 161         struct wiimote_state state;
 162         struct work_struct init_worker;
 163 };
 164 
 165 /* wiimote modules */
 166 
 167 enum wiimod_module {
 168         WIIMOD_KEYS,
 169         WIIMOD_RUMBLE,
 170         WIIMOD_BATTERY,
 171         WIIMOD_LED1,
 172         WIIMOD_LED2,
 173         WIIMOD_LED3,
 174         WIIMOD_LED4,
 175         WIIMOD_ACCEL,
 176         WIIMOD_IR,
 177         WIIMOD_BUILTIN_MP,
 178         WIIMOD_NO_MP,
 179         WIIMOD_NUM,
 180         WIIMOD_NULL = WIIMOD_NUM,
 181 };
 182 
 183 #define WIIMOD_FLAG_INPUT               0x0001
 184 #define WIIMOD_FLAG_EXT8                0x0002
 185 #define WIIMOD_FLAG_EXT16               0x0004
 186 
 187 struct wiimod_ops {
 188         __u16 flags;
 189         unsigned long arg;
 190         int (*probe) (const struct wiimod_ops *ops,
 191                       struct wiimote_data *wdata);
 192         void (*remove) (const struct wiimod_ops *ops,
 193                         struct wiimote_data *wdata);
 194 
 195         void (*in_keys) (struct wiimote_data *wdata, const __u8 *keys);
 196         void (*in_accel) (struct wiimote_data *wdata, const __u8 *accel);
 197         void (*in_ir) (struct wiimote_data *wdata, const __u8 *ir, bool packed,
 198                        unsigned int id);
 199         void (*in_mp) (struct wiimote_data *wdata, const __u8 *mp);
 200         void (*in_ext) (struct wiimote_data *wdata, const __u8 *ext);
 201 };
 202 
 203 extern const struct wiimod_ops *wiimod_table[WIIMOD_NUM];
 204 extern const struct wiimod_ops *wiimod_ext_table[WIIMOTE_EXT_NUM];
 205 extern const struct wiimod_ops wiimod_mp;
 206 
 207 /* wiimote requests */
 208 
 209 enum wiiproto_reqs {
 210         WIIPROTO_REQ_NULL = 0x0,
 211         WIIPROTO_REQ_RUMBLE = 0x10,
 212         WIIPROTO_REQ_LED = 0x11,
 213         WIIPROTO_REQ_DRM = 0x12,
 214         WIIPROTO_REQ_IR1 = 0x13,
 215         WIIPROTO_REQ_SREQ = 0x15,
 216         WIIPROTO_REQ_WMEM = 0x16,
 217         WIIPROTO_REQ_RMEM = 0x17,
 218         WIIPROTO_REQ_IR2 = 0x1a,
 219         WIIPROTO_REQ_STATUS = 0x20,
 220         WIIPROTO_REQ_DATA = 0x21,
 221         WIIPROTO_REQ_RETURN = 0x22,
 222 
 223         /* DRM_K: BB*2 */
 224         WIIPROTO_REQ_DRM_K = 0x30,
 225 
 226         /* DRM_KA: BB*2 AA*3 */
 227         WIIPROTO_REQ_DRM_KA = 0x31,
 228 
 229         /* DRM_KE: BB*2 EE*8 */
 230         WIIPROTO_REQ_DRM_KE = 0x32,
 231 
 232         /* DRM_KAI: BB*2 AA*3 II*12 */
 233         WIIPROTO_REQ_DRM_KAI = 0x33,
 234 
 235         /* DRM_KEE: BB*2 EE*19 */
 236         WIIPROTO_REQ_DRM_KEE = 0x34,
 237 
 238         /* DRM_KAE: BB*2 AA*3 EE*16 */
 239         WIIPROTO_REQ_DRM_KAE = 0x35,
 240 
 241         /* DRM_KIE: BB*2 II*10 EE*9 */
 242         WIIPROTO_REQ_DRM_KIE = 0x36,
 243 
 244         /* DRM_KAIE: BB*2 AA*3 II*10 EE*6 */
 245         WIIPROTO_REQ_DRM_KAIE = 0x37,
 246 
 247         /* DRM_E: EE*21 */
 248         WIIPROTO_REQ_DRM_E = 0x3d,
 249 
 250         /* DRM_SKAI1: BB*2 AA*1 II*18 */
 251         WIIPROTO_REQ_DRM_SKAI1 = 0x3e,
 252 
 253         /* DRM_SKAI2: BB*2 AA*1 II*18 */
 254         WIIPROTO_REQ_DRM_SKAI2 = 0x3f,
 255 
 256         WIIPROTO_REQ_MAX
 257 };
 258 
 259 #define dev_to_wii(pdev) hid_get_drvdata(to_hid_device(pdev))
 260 
 261 void __wiimote_schedule(struct wiimote_data *wdata);
 262 
 263 extern void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm);
 264 extern void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble);
 265 extern void wiiproto_req_leds(struct wiimote_data *wdata, int leds);
 266 extern void wiiproto_req_status(struct wiimote_data *wdata);
 267 extern void wiiproto_req_accel(struct wiimote_data *wdata, __u8 accel);
 268 extern void wiiproto_req_ir1(struct wiimote_data *wdata, __u8 flags);
 269 extern void wiiproto_req_ir2(struct wiimote_data *wdata, __u8 flags);
 270 extern int wiimote_cmd_write(struct wiimote_data *wdata, __u32 offset,
 271                                                 const __u8 *wmem, __u8 size);
 272 extern ssize_t wiimote_cmd_read(struct wiimote_data *wdata, __u32 offset,
 273                                                         __u8 *rmem, __u8 size);
 274 
 275 #define wiiproto_req_rreg(wdata, os, sz) \
 276                                 wiiproto_req_rmem((wdata), false, (os), (sz))
 277 #define wiiproto_req_reeprom(wdata, os, sz) \
 278                                 wiiproto_req_rmem((wdata), true, (os), (sz))
 279 extern void wiiproto_req_rmem(struct wiimote_data *wdata, bool eeprom,
 280                                                 __u32 offset, __u16 size);
 281 
 282 #ifdef CONFIG_DEBUG_FS
 283 
 284 extern int wiidebug_init(struct wiimote_data *wdata);
 285 extern void wiidebug_deinit(struct wiimote_data *wdata);
 286 
 287 #else
 288 
 289 static inline int wiidebug_init(void *u) { return 0; }
 290 static inline void wiidebug_deinit(void *u) { }
 291 
 292 #endif
 293 
 294 /* requires the state.lock spinlock to be held */
 295 static inline bool wiimote_cmd_pending(struct wiimote_data *wdata, int cmd,
 296                                                                 __u32 opt)
 297 {
 298         return wdata->state.cmd == cmd && wdata->state.opt == opt;
 299 }
 300 
 301 /* requires the state.lock spinlock to be held */
 302 static inline void wiimote_cmd_complete(struct wiimote_data *wdata)
 303 {
 304         wdata->state.cmd = WIIPROTO_REQ_NULL;
 305         complete(&wdata->state.ready);
 306 }
 307 
 308 /* requires the state.lock spinlock to be held */
 309 static inline void wiimote_cmd_abort(struct wiimote_data *wdata)
 310 {
 311         /* Abort synchronous request by waking up the sleeping caller. But
 312          * reset the state.cmd field to an invalid value so no further event
 313          * handlers will work with it. */
 314         wdata->state.cmd = WIIPROTO_REQ_MAX;
 315         complete(&wdata->state.ready);
 316 }
 317 
 318 static inline int wiimote_cmd_acquire(struct wiimote_data *wdata)
 319 {
 320         return mutex_lock_interruptible(&wdata->state.sync) ? -ERESTARTSYS : 0;
 321 }
 322 
 323 static inline void wiimote_cmd_acquire_noint(struct wiimote_data *wdata)
 324 {
 325         mutex_lock(&wdata->state.sync);
 326 }
 327 
 328 /* requires the state.lock spinlock to be held */
 329 static inline void wiimote_cmd_set(struct wiimote_data *wdata, int cmd,
 330                                                                 __u32 opt)
 331 {
 332         reinit_completion(&wdata->state.ready);
 333         wdata->state.cmd = cmd;
 334         wdata->state.opt = opt;
 335 }
 336 
 337 static inline void wiimote_cmd_release(struct wiimote_data *wdata)
 338 {
 339         mutex_unlock(&wdata->state.sync);
 340 }
 341 
 342 static inline int wiimote_cmd_wait(struct wiimote_data *wdata)
 343 {
 344         int ret;
 345 
 346         /* The completion acts as implicit memory barrier so we can safely
 347          * assume that state.cmd is set on success/failure and isn't accessed
 348          * by any other thread, anymore. */
 349 
 350         ret = wait_for_completion_interruptible_timeout(&wdata->state.ready, HZ);
 351         if (ret < 0)
 352                 return -ERESTARTSYS;
 353         else if (ret == 0)
 354                 return -EIO;
 355         else if (wdata->state.cmd != WIIPROTO_REQ_NULL)
 356                 return -EIO;
 357         else
 358                 return 0;
 359 }
 360 
 361 static inline int wiimote_cmd_wait_noint(struct wiimote_data *wdata)
 362 {
 363         unsigned long ret;
 364 
 365         /* no locking needed; see wiimote_cmd_wait() */
 366         ret = wait_for_completion_timeout(&wdata->state.ready, HZ);
 367         if (!ret)
 368                 return -EIO;
 369         else if (wdata->state.cmd != WIIPROTO_REQ_NULL)
 370                 return -EIO;
 371         else
 372                 return 0;
 373 }
 374 
 375 #endif

/* [<][>][^][v][top][bottom][index][help] */