blob: 3a7dec0c9fe61f97795beb46da53be2e5a544b25 [file] [log] [blame]
David Herrmannfb51b442011-07-05 13:45:08 +02001/*
2 * HID driver for Nintendo Wiimote devices
3 * Copyright (c) 2011 David Herrmann
4 */
5
6/*
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 */
12
David Herrmann672bc4e2011-07-05 13:45:11 +020013#include <linux/device.h>
David Herrmann02fb72a2011-07-05 13:45:09 +020014#include <linux/hid.h>
David Herrmann672bc4e2011-07-05 13:45:11 +020015#include <linux/input.h>
David Herrmann23a5a4a2011-08-17 11:43:22 +020016#include <linux/leds.h>
David Herrmannfb51b442011-07-05 13:45:08 +020017#include <linux/module.h>
David Herrmann23c063c2011-07-05 13:45:14 +020018#include <linux/spinlock.h>
David Herrmann02fb72a2011-07-05 13:45:09 +020019#include "hid-ids.h"
David Herrmannfb51b442011-07-05 13:45:08 +020020
21#define WIIMOTE_VERSION "0.1"
22#define WIIMOTE_NAME "Nintendo Wii Remote"
David Herrmann23c063c2011-07-05 13:45:14 +020023#define WIIMOTE_BUFSIZE 32
24
25struct wiimote_buf {
26 __u8 data[HID_MAX_BUFFER_SIZE];
27 size_t size;
28};
David Herrmannfb51b442011-07-05 13:45:08 +020029
David Herrmann32a0d9a2011-07-05 13:45:18 +020030struct wiimote_state {
31 spinlock_t lock;
32 __u8 flags;
David Herrmannefcf9182011-09-06 13:50:29 +020033 __u8 accel_split[2];
David Herrmann32a0d9a2011-07-05 13:45:18 +020034};
35
David Herrmanne894d0e2011-07-05 13:45:10 +020036struct wiimote_data {
37 struct hid_device *hdev;
David Herrmann672bc4e2011-07-05 13:45:11 +020038 struct input_dev *input;
David Herrmann23a5a4a2011-08-17 11:43:22 +020039 struct led_classdev *leds[4];
David Herrmann98a558a2011-09-06 13:50:28 +020040 struct input_dev *accel;
David Herrmannf363e4f2011-09-06 13:50:30 +020041 struct input_dev *ir;
David Herrmann23c063c2011-07-05 13:45:14 +020042
43 spinlock_t qlock;
44 __u8 head;
45 __u8 tail;
46 struct wiimote_buf outq[WIIMOTE_BUFSIZE];
47 struct work_struct worker;
David Herrmann32a0d9a2011-07-05 13:45:18 +020048
49 struct wiimote_state state;
David Herrmanne894d0e2011-07-05 13:45:10 +020050};
51
David Herrmannc003ec22011-09-06 13:50:26 +020052#define WIIPROTO_FLAG_LED1 0x01
53#define WIIPROTO_FLAG_LED2 0x02
54#define WIIPROTO_FLAG_LED3 0x04
55#define WIIPROTO_FLAG_LED4 0x08
56#define WIIPROTO_FLAG_RUMBLE 0x10
David Herrmann98a558a2011-09-06 13:50:28 +020057#define WIIPROTO_FLAG_ACCEL 0x20
David Herrmannf363e4f2011-09-06 13:50:30 +020058#define WIIPROTO_FLAG_IR_BASIC 0x40
59#define WIIPROTO_FLAG_IR_EXT 0x80
60#define WIIPROTO_FLAG_IR_FULL 0xc0 /* IR_BASIC | IR_EXT */
David Herrmann32a0d9a2011-07-05 13:45:18 +020061#define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
62 WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)
David Herrmannf363e4f2011-09-06 13:50:30 +020063#define WIIPROTO_FLAGS_IR (WIIPROTO_FLAG_IR_BASIC | WIIPROTO_FLAG_IR_EXT | \
64 WIIPROTO_FLAG_IR_FULL)
David Herrmanndb308342011-07-05 13:45:17 +020065
David Herrmann23a5a4a2011-08-17 11:43:22 +020066/* return flag for led \num */
67#define WIIPROTO_FLAG_LED(num) (WIIPROTO_FLAG_LED1 << (num - 1))
68
David Herrmann1abb9ad2011-07-05 13:45:16 +020069enum wiiproto_reqs {
David Herrmann2cb5e4b2011-08-17 11:43:23 +020070 WIIPROTO_REQ_NULL = 0x0,
David Herrmannc003ec22011-09-06 13:50:26 +020071 WIIPROTO_REQ_RUMBLE = 0x10,
David Herrmanndb308342011-07-05 13:45:17 +020072 WIIPROTO_REQ_LED = 0x11,
David Herrmann2cb5e4b2011-08-17 11:43:23 +020073 WIIPROTO_REQ_DRM = 0x12,
David Herrmannc87019e2011-08-17 11:43:24 +020074 WIIPROTO_REQ_STATUS = 0x20,
75 WIIPROTO_REQ_RETURN = 0x22,
David Herrmann1abb9ad2011-07-05 13:45:16 +020076 WIIPROTO_REQ_DRM_K = 0x30,
David Herrmannefcf9182011-09-06 13:50:29 +020077 WIIPROTO_REQ_DRM_KA = 0x31,
78 WIIPROTO_REQ_DRM_KAI = 0x33,
79 WIIPROTO_REQ_DRM_KAE = 0x35,
David Herrmannf363e4f2011-09-06 13:50:30 +020080 WIIPROTO_REQ_DRM_KIE = 0x36,
David Herrmannefcf9182011-09-06 13:50:29 +020081 WIIPROTO_REQ_DRM_KAIE = 0x37,
82 WIIPROTO_REQ_DRM_SKAI1 = 0x3e,
83 WIIPROTO_REQ_DRM_SKAI2 = 0x3f,
David Herrmann1abb9ad2011-07-05 13:45:16 +020084};
85
86enum wiiproto_keys {
87 WIIPROTO_KEY_LEFT,
88 WIIPROTO_KEY_RIGHT,
89 WIIPROTO_KEY_UP,
90 WIIPROTO_KEY_DOWN,
91 WIIPROTO_KEY_PLUS,
92 WIIPROTO_KEY_MINUS,
93 WIIPROTO_KEY_ONE,
94 WIIPROTO_KEY_TWO,
95 WIIPROTO_KEY_A,
96 WIIPROTO_KEY_B,
97 WIIPROTO_KEY_HOME,
98 WIIPROTO_KEY_COUNT
99};
100
101static __u16 wiiproto_keymap[] = {
102 KEY_LEFT, /* WIIPROTO_KEY_LEFT */
103 KEY_RIGHT, /* WIIPROTO_KEY_RIGHT */
104 KEY_UP, /* WIIPROTO_KEY_UP */
105 KEY_DOWN, /* WIIPROTO_KEY_DOWN */
106 KEY_NEXT, /* WIIPROTO_KEY_PLUS */
107 KEY_PREVIOUS, /* WIIPROTO_KEY_MINUS */
108 BTN_1, /* WIIPROTO_KEY_ONE */
109 BTN_2, /* WIIPROTO_KEY_TWO */
110 BTN_A, /* WIIPROTO_KEY_A */
111 BTN_B, /* WIIPROTO_KEY_B */
112 BTN_MODE, /* WIIPROTO_KEY_HOME */
113};
114
David Herrmann0c218f12011-07-05 13:45:13 +0200115static ssize_t wiimote_hid_send(struct hid_device *hdev, __u8 *buffer,
116 size_t count)
117{
118 __u8 *buf;
119 ssize_t ret;
120
121 if (!hdev->hid_output_raw_report)
122 return -ENODEV;
123
124 buf = kmemdup(buffer, count, GFP_KERNEL);
125 if (!buf)
126 return -ENOMEM;
127
128 ret = hdev->hid_output_raw_report(hdev, buf, count, HID_OUTPUT_REPORT);
129
130 kfree(buf);
131 return ret;
132}
133
David Herrmann23c063c2011-07-05 13:45:14 +0200134static void wiimote_worker(struct work_struct *work)
135{
136 struct wiimote_data *wdata = container_of(work, struct wiimote_data,
137 worker);
138 unsigned long flags;
139
140 spin_lock_irqsave(&wdata->qlock, flags);
141
142 while (wdata->head != wdata->tail) {
143 spin_unlock_irqrestore(&wdata->qlock, flags);
144 wiimote_hid_send(wdata->hdev, wdata->outq[wdata->tail].data,
145 wdata->outq[wdata->tail].size);
146 spin_lock_irqsave(&wdata->qlock, flags);
147
148 wdata->tail = (wdata->tail + 1) % WIIMOTE_BUFSIZE;
149 }
150
151 spin_unlock_irqrestore(&wdata->qlock, flags);
152}
153
154static void wiimote_queue(struct wiimote_data *wdata, const __u8 *buffer,
155 size_t count)
156{
157 unsigned long flags;
158 __u8 newhead;
159
160 if (count > HID_MAX_BUFFER_SIZE) {
161 hid_warn(wdata->hdev, "Sending too large output report\n");
162 return;
163 }
164
165 /*
166 * Copy new request into our output queue and check whether the
167 * queue is full. If it is full, discard this request.
168 * If it is empty we need to start a new worker that will
169 * send out the buffer to the hid device.
170 * If the queue is not empty, then there must be a worker
171 * that is currently sending out our buffer and this worker
172 * will reschedule itself until the queue is empty.
173 */
174
175 spin_lock_irqsave(&wdata->qlock, flags);
176
177 memcpy(wdata->outq[wdata->head].data, buffer, count);
178 wdata->outq[wdata->head].size = count;
179 newhead = (wdata->head + 1) % WIIMOTE_BUFSIZE;
180
181 if (wdata->head == wdata->tail) {
182 wdata->head = newhead;
183 schedule_work(&wdata->worker);
184 } else if (newhead != wdata->tail) {
185 wdata->head = newhead;
186 } else {
187 hid_warn(wdata->hdev, "Output queue is full");
188 }
189
190 spin_unlock_irqrestore(&wdata->qlock, flags);
191}
192
David Herrmannc003ec22011-09-06 13:50:26 +0200193/*
194 * This sets the rumble bit on the given output report if rumble is
195 * currently enabled.
196 * \cmd1 must point to the second byte in the output report => &cmd[1]
197 * This must be called on nearly every output report before passing it
198 * into the output queue!
199 */
200static inline void wiiproto_keep_rumble(struct wiimote_data *wdata, __u8 *cmd1)
201{
202 if (wdata->state.flags & WIIPROTO_FLAG_RUMBLE)
203 *cmd1 |= 0x01;
204}
205
206static void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble)
207{
208 __u8 cmd[2];
209
210 rumble = !!rumble;
211 if (rumble == !!(wdata->state.flags & WIIPROTO_FLAG_RUMBLE))
212 return;
213
214 if (rumble)
215 wdata->state.flags |= WIIPROTO_FLAG_RUMBLE;
216 else
217 wdata->state.flags &= ~WIIPROTO_FLAG_RUMBLE;
218
219 cmd[0] = WIIPROTO_REQ_RUMBLE;
220 cmd[1] = 0;
221
222 wiiproto_keep_rumble(wdata, &cmd[1]);
223 wiimote_queue(wdata, cmd, sizeof(cmd));
224}
225
David Herrmanndb308342011-07-05 13:45:17 +0200226static void wiiproto_req_leds(struct wiimote_data *wdata, int leds)
227{
228 __u8 cmd[2];
229
David Herrmann32a0d9a2011-07-05 13:45:18 +0200230 leds &= WIIPROTO_FLAGS_LEDS;
231 if ((wdata->state.flags & WIIPROTO_FLAGS_LEDS) == leds)
232 return;
233 wdata->state.flags = (wdata->state.flags & ~WIIPROTO_FLAGS_LEDS) | leds;
234
David Herrmanndb308342011-07-05 13:45:17 +0200235 cmd[0] = WIIPROTO_REQ_LED;
236 cmd[1] = 0;
237
238 if (leds & WIIPROTO_FLAG_LED1)
239 cmd[1] |= 0x10;
240 if (leds & WIIPROTO_FLAG_LED2)
241 cmd[1] |= 0x20;
242 if (leds & WIIPROTO_FLAG_LED3)
243 cmd[1] |= 0x40;
244 if (leds & WIIPROTO_FLAG_LED4)
245 cmd[1] |= 0x80;
246
David Herrmannc003ec22011-09-06 13:50:26 +0200247 wiiproto_keep_rumble(wdata, &cmd[1]);
David Herrmanndb308342011-07-05 13:45:17 +0200248 wiimote_queue(wdata, cmd, sizeof(cmd));
249}
250
David Herrmann2cb5e4b2011-08-17 11:43:23 +0200251/*
252 * Check what peripherals of the wiimote are currently
253 * active and select a proper DRM that supports all of
254 * the requested data inputs.
255 */
256static __u8 select_drm(struct wiimote_data *wdata)
257{
David Herrmannf363e4f2011-09-06 13:50:30 +0200258 __u8 ir = wdata->state.flags & WIIPROTO_FLAGS_IR;
259
260 if (ir == WIIPROTO_FLAG_IR_BASIC) {
261 if (wdata->state.flags & WIIPROTO_FLAG_ACCEL)
262 return WIIPROTO_REQ_DRM_KAIE;
263 else
264 return WIIPROTO_REQ_DRM_KIE;
265 } else if (ir == WIIPROTO_FLAG_IR_EXT) {
266 return WIIPROTO_REQ_DRM_KAI;
267 } else if (ir == WIIPROTO_FLAG_IR_FULL) {
268 return WIIPROTO_REQ_DRM_SKAI1;
269 } else {
270 if (wdata->state.flags & WIIPROTO_FLAG_ACCEL)
271 return WIIPROTO_REQ_DRM_KA;
272 else
273 return WIIPROTO_REQ_DRM_K;
274 }
David Herrmann2cb5e4b2011-08-17 11:43:23 +0200275}
276
277static void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm)
278{
279 __u8 cmd[3];
280
281 if (drm == WIIPROTO_REQ_NULL)
282 drm = select_drm(wdata);
283
284 cmd[0] = WIIPROTO_REQ_DRM;
285 cmd[1] = 0;
286 cmd[2] = drm;
287
David Herrmannc003ec22011-09-06 13:50:26 +0200288 wiiproto_keep_rumble(wdata, &cmd[1]);
David Herrmann2cb5e4b2011-08-17 11:43:23 +0200289 wiimote_queue(wdata, cmd, sizeof(cmd));
290}
291
David Herrmann98a558a2011-09-06 13:50:28 +0200292static void wiiproto_req_accel(struct wiimote_data *wdata, __u8 accel)
293{
294 accel = !!accel;
295 if (accel == !!(wdata->state.flags & WIIPROTO_FLAG_ACCEL))
296 return;
297
298 if (accel)
299 wdata->state.flags |= WIIPROTO_FLAG_ACCEL;
300 else
301 wdata->state.flags &= ~WIIPROTO_FLAG_ACCEL;
302
303 wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
304}
305
David Herrmann23a5a4a2011-08-17 11:43:22 +0200306static enum led_brightness wiimote_leds_get(struct led_classdev *led_dev)
307{
308 struct wiimote_data *wdata;
309 struct device *dev = led_dev->dev->parent;
310 int i;
311 unsigned long flags;
312 bool value = false;
David Herrmann3c1c2fc2011-07-05 13:45:19 +0200313
David Herrmann23a5a4a2011-08-17 11:43:22 +0200314 wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
315
316 for (i = 0; i < 4; ++i) {
317 if (wdata->leds[i] == led_dev) {
318 spin_lock_irqsave(&wdata->state.lock, flags);
319 value = wdata->state.flags & WIIPROTO_FLAG_LED(i + 1);
320 spin_unlock_irqrestore(&wdata->state.lock, flags);
321 break;
322 }
323 }
324
325 return value ? LED_FULL : LED_OFF;
326}
327
328static void wiimote_leds_set(struct led_classdev *led_dev,
329 enum led_brightness value)
330{
331 struct wiimote_data *wdata;
332 struct device *dev = led_dev->dev->parent;
333 int i;
334 unsigned long flags;
335 __u8 state, flag;
336
337 wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev));
338
339 for (i = 0; i < 4; ++i) {
340 if (wdata->leds[i] == led_dev) {
341 flag = WIIPROTO_FLAG_LED(i + 1);
342 spin_lock_irqsave(&wdata->state.lock, flags);
343 state = wdata->state.flags;
344 if (value == LED_OFF)
345 wiiproto_req_leds(wdata, state & ~flag);
346 else
347 wiiproto_req_leds(wdata, state | flag);
348 spin_unlock_irqrestore(&wdata->state.lock, flags);
349 break;
350 }
351 }
352}
David Herrmann3c1c2fc2011-07-05 13:45:19 +0200353
David Herrmannd020be92011-09-06 13:50:27 +0200354static int wiimote_ff_play(struct input_dev *dev, void *data,
355 struct ff_effect *eff)
David Herrmann672bc4e2011-07-05 13:45:11 +0200356{
David Herrmannd020be92011-09-06 13:50:27 +0200357 struct wiimote_data *wdata = input_get_drvdata(dev);
358 __u8 value;
359 unsigned long flags;
360
361 /*
362 * The wiimote supports only a single rumble motor so if any magnitude
363 * is set to non-zero then we start the rumble motor. If both are set to
364 * zero, we stop the rumble motor.
365 */
366
367 if (eff->u.rumble.strong_magnitude || eff->u.rumble.weak_magnitude)
368 value = 1;
369 else
370 value = 0;
371
372 spin_lock_irqsave(&wdata->state.lock, flags);
373 wiiproto_req_rumble(wdata, value);
374 spin_unlock_irqrestore(&wdata->state.lock, flags);
375
David Herrmann672bc4e2011-07-05 13:45:11 +0200376 return 0;
377}
378
David Herrmann26af1742011-08-17 11:43:21 +0200379static int wiimote_input_open(struct input_dev *dev)
380{
381 struct wiimote_data *wdata = input_get_drvdata(dev);
382
383 return hid_hw_open(wdata->hdev);
384}
385
386static void wiimote_input_close(struct input_dev *dev)
387{
388 struct wiimote_data *wdata = input_get_drvdata(dev);
389
390 hid_hw_close(wdata->hdev);
391}
392
David Herrmann98a558a2011-09-06 13:50:28 +0200393static int wiimote_accel_open(struct input_dev *dev)
394{
395 struct wiimote_data *wdata = input_get_drvdata(dev);
396 int ret;
397 unsigned long flags;
398
399 ret = hid_hw_open(wdata->hdev);
400 if (ret)
401 return ret;
402
403 spin_lock_irqsave(&wdata->state.lock, flags);
404 wiiproto_req_accel(wdata, true);
405 spin_unlock_irqrestore(&wdata->state.lock, flags);
406
407 return 0;
408}
409
410static void wiimote_accel_close(struct input_dev *dev)
411{
412 struct wiimote_data *wdata = input_get_drvdata(dev);
413 unsigned long flags;
414
415 spin_lock_irqsave(&wdata->state.lock, flags);
416 wiiproto_req_accel(wdata, false);
417 spin_unlock_irqrestore(&wdata->state.lock, flags);
418
419 hid_hw_close(wdata->hdev);
420}
421
David Herrmann1abb9ad2011-07-05 13:45:16 +0200422static void handler_keys(struct wiimote_data *wdata, const __u8 *payload)
423{
424 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_LEFT],
425 !!(payload[0] & 0x01));
426 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_RIGHT],
427 !!(payload[0] & 0x02));
428 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_DOWN],
429 !!(payload[0] & 0x04));
430 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_UP],
431 !!(payload[0] & 0x08));
432 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_PLUS],
433 !!(payload[0] & 0x10));
434 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_TWO],
435 !!(payload[1] & 0x01));
436 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_ONE],
437 !!(payload[1] & 0x02));
438 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_B],
439 !!(payload[1] & 0x04));
440 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_A],
441 !!(payload[1] & 0x08));
442 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_MINUS],
443 !!(payload[1] & 0x10));
444 input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_HOME],
445 !!(payload[1] & 0x80));
446 input_sync(wdata->input);
447}
448
David Herrmannefcf9182011-09-06 13:50:29 +0200449static void handler_accel(struct wiimote_data *wdata, const __u8 *payload)
450{
451 __u16 x, y, z;
452
453 if (!(wdata->state.flags & WIIPROTO_FLAG_ACCEL))
454 return;
455
456 /*
457 * payload is: BB BB XX YY ZZ
458 * Accelerometer data is encoded into 3 10bit values. XX, YY and ZZ
459 * contain the upper 8 bits of each value. The lower 2 bits are
460 * contained in the buttons data BB BB.
461 * Bits 6 and 7 of the first buttons byte BB is the lower 2 bits of the
462 * X accel value. Bit 5 of the second buttons byte is the 2nd bit of Y
463 * accel value and bit 6 is the second bit of the Z value.
464 * The first bit of Y and Z values is not available and always set to 0.
465 * 0x200 is returned on no movement.
466 */
467
468 x = payload[2] << 2;
469 y = payload[3] << 2;
470 z = payload[4] << 2;
471
472 x |= (payload[0] >> 5) & 0x3;
473 y |= (payload[1] >> 4) & 0x2;
474 z |= (payload[1] >> 5) & 0x2;
475
476 input_report_abs(wdata->accel, ABS_RX, x - 0x200);
477 input_report_abs(wdata->accel, ABS_RY, y - 0x200);
478 input_report_abs(wdata->accel, ABS_RZ, z - 0x200);
479 input_sync(wdata->accel);
480}
481
David Herrmanneac39e72011-09-06 13:50:31 +0200482#define ir_to_input0(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
483 ABS_HAT0X, ABS_HAT0Y)
484#define ir_to_input1(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
485 ABS_HAT1X, ABS_HAT1Y)
486#define ir_to_input2(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
487 ABS_HAT2X, ABS_HAT2Y)
488#define ir_to_input3(wdata, ir, packed) __ir_to_input((wdata), (ir), (packed), \
489 ABS_HAT3X, ABS_HAT3Y)
490
491static void __ir_to_input(struct wiimote_data *wdata, const __u8 *ir,
492 bool packed, __u8 xid, __u8 yid)
493{
494 __u16 x, y;
495
496 if (!(wdata->state.flags & WIIPROTO_FLAGS_IR))
497 return;
498
499 /*
500 * Basic IR data is encoded into 3 bytes. The first two bytes are the
501 * upper 8 bit of the X/Y data, the 3rd byte contains the lower 2 bits
502 * of both.
503 * If data is packed, then the 3rd byte is put first and slightly
504 * reordered. This allows to interleave packed and non-packed data to
505 * have two IR sets in 5 bytes instead of 6.
506 * The resulting 10bit X/Y values are passed to the ABS_HATXY input dev.
507 */
508
509 if (packed) {
510 x = ir[1] << 2;
511 y = ir[2] << 2;
512
513 x |= ir[0] & 0x3;
514 y |= (ir[0] >> 2) & 0x3;
515 } else {
516 x = ir[0] << 2;
517 y = ir[1] << 2;
518
519 x |= (ir[2] >> 4) & 0x3;
520 y |= (ir[2] >> 6) & 0x3;
521 }
522
523 input_report_abs(wdata->ir, xid, x);
524 input_report_abs(wdata->ir, yid, y);
525}
David Herrmannefcf9182011-09-06 13:50:29 +0200526
David Herrmannc87019e2011-08-17 11:43:24 +0200527static void handler_status(struct wiimote_data *wdata, const __u8 *payload)
528{
529 handler_keys(wdata, payload);
530
531 /* on status reports the drm is reset so we need to resend the drm */
532 wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL);
533}
534
535static void handler_return(struct wiimote_data *wdata, const __u8 *payload)
536{
537 __u8 err = payload[3];
538 __u8 cmd = payload[2];
539
540 handler_keys(wdata, payload);
541
542 if (err)
543 hid_warn(wdata->hdev, "Remote error %hhu on req %hhu\n", err,
544 cmd);
545}
546
David Herrmannefcf9182011-09-06 13:50:29 +0200547static void handler_drm_KA(struct wiimote_data *wdata, const __u8 *payload)
548{
549 handler_keys(wdata, payload);
550 handler_accel(wdata, payload);
551}
552
553static void handler_drm_KAI(struct wiimote_data *wdata, const __u8 *payload)
554{
555 handler_keys(wdata, payload);
556 handler_accel(wdata, payload);
David Herrmanneac39e72011-09-06 13:50:31 +0200557 ir_to_input0(wdata, &payload[5], false);
558 ir_to_input1(wdata, &payload[8], false);
559 ir_to_input2(wdata, &payload[11], false);
560 ir_to_input3(wdata, &payload[14], false);
561 input_sync(wdata->ir);
562}
563
564static void handler_drm_KIE(struct wiimote_data *wdata, const __u8 *payload)
565{
566 handler_keys(wdata, payload);
567 ir_to_input0(wdata, &payload[2], false);
568 ir_to_input1(wdata, &payload[4], true);
569 ir_to_input2(wdata, &payload[7], false);
570 ir_to_input3(wdata, &payload[9], true);
571 input_sync(wdata->ir);
David Herrmannefcf9182011-09-06 13:50:29 +0200572}
573
574static void handler_drm_KAE(struct wiimote_data *wdata, const __u8 *payload)
575{
576 handler_keys(wdata, payload);
577 handler_accel(wdata, payload);
578}
579
580static void handler_drm_KAIE(struct wiimote_data *wdata, const __u8 *payload)
581{
582 handler_keys(wdata, payload);
583 handler_accel(wdata, payload);
David Herrmanneac39e72011-09-06 13:50:31 +0200584 ir_to_input0(wdata, &payload[5], false);
585 ir_to_input1(wdata, &payload[7], true);
586 ir_to_input2(wdata, &payload[10], false);
587 ir_to_input3(wdata, &payload[12], true);
588 input_sync(wdata->ir);
David Herrmannefcf9182011-09-06 13:50:29 +0200589}
590
591static void handler_drm_SKAI1(struct wiimote_data *wdata, const __u8 *payload)
592{
593 handler_keys(wdata, payload);
594
595 wdata->state.accel_split[0] = payload[2];
596 wdata->state.accel_split[1] = (payload[0] >> 1) & (0x10 | 0x20);
597 wdata->state.accel_split[1] |= (payload[1] << 1) & (0x40 | 0x80);
David Herrmanneac39e72011-09-06 13:50:31 +0200598
599 ir_to_input0(wdata, &payload[3], false);
600 ir_to_input1(wdata, &payload[12], false);
601 input_sync(wdata->ir);
David Herrmannefcf9182011-09-06 13:50:29 +0200602}
603
604static void handler_drm_SKAI2(struct wiimote_data *wdata, const __u8 *payload)
605{
606 __u8 buf[5];
607
608 handler_keys(wdata, payload);
609
610 wdata->state.accel_split[1] |= (payload[0] >> 5) & (0x01 | 0x02);
611 wdata->state.accel_split[1] |= (payload[1] >> 3) & (0x04 | 0x08);
612
613 buf[0] = 0;
614 buf[1] = 0;
615 buf[2] = wdata->state.accel_split[0];
616 buf[3] = payload[2];
617 buf[4] = wdata->state.accel_split[1];
618 handler_accel(wdata, buf);
David Herrmanneac39e72011-09-06 13:50:31 +0200619
620 ir_to_input2(wdata, &payload[3], false);
621 ir_to_input3(wdata, &payload[12], false);
622 input_sync(wdata->ir);
David Herrmannefcf9182011-09-06 13:50:29 +0200623}
624
David Herrmanna4d19192011-07-05 13:45:15 +0200625struct wiiproto_handler {
626 __u8 id;
627 size_t size;
628 void (*func)(struct wiimote_data *wdata, const __u8 *payload);
629};
630
631static struct wiiproto_handler handlers[] = {
David Herrmannc87019e2011-08-17 11:43:24 +0200632 { .id = WIIPROTO_REQ_STATUS, .size = 6, .func = handler_status },
633 { .id = WIIPROTO_REQ_RETURN, .size = 4, .func = handler_return },
David Herrmann1abb9ad2011-07-05 13:45:16 +0200634 { .id = WIIPROTO_REQ_DRM_K, .size = 2, .func = handler_keys },
David Herrmannefcf9182011-09-06 13:50:29 +0200635 { .id = WIIPROTO_REQ_DRM_KA, .size = 5, .func = handler_drm_KA },
636 { .id = WIIPROTO_REQ_DRM_KAI, .size = 17, .func = handler_drm_KAI },
637 { .id = WIIPROTO_REQ_DRM_KAE, .size = 21, .func = handler_drm_KAE },
David Herrmanneac39e72011-09-06 13:50:31 +0200638 { .id = WIIPROTO_REQ_DRM_KIE, .size = 21, .func = handler_drm_KIE },
David Herrmannefcf9182011-09-06 13:50:29 +0200639 { .id = WIIPROTO_REQ_DRM_KAIE, .size = 21, .func = handler_drm_KAIE },
640 { .id = WIIPROTO_REQ_DRM_SKAI1, .size = 21, .func = handler_drm_SKAI1 },
641 { .id = WIIPROTO_REQ_DRM_SKAI2, .size = 21, .func = handler_drm_SKAI2 },
David Herrmanna4d19192011-07-05 13:45:15 +0200642 { .id = 0 }
643};
644
David Herrmann02fb72a2011-07-05 13:45:09 +0200645static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
646 u8 *raw_data, int size)
647{
David Herrmann4d36e972011-07-05 13:45:12 +0200648 struct wiimote_data *wdata = hid_get_drvdata(hdev);
David Herrmanna4d19192011-07-05 13:45:15 +0200649 struct wiiproto_handler *h;
650 int i;
David Herrmann32a0d9a2011-07-05 13:45:18 +0200651 unsigned long flags;
David Herrmann4d36e972011-07-05 13:45:12 +0200652
David Herrmann02fb72a2011-07-05 13:45:09 +0200653 if (size < 1)
654 return -EINVAL;
655
David Herrmann32a0d9a2011-07-05 13:45:18 +0200656 spin_lock_irqsave(&wdata->state.lock, flags);
657
David Herrmanna4d19192011-07-05 13:45:15 +0200658 for (i = 0; handlers[i].id; ++i) {
659 h = &handlers[i];
660 if (h->id == raw_data[0] && h->size < size)
661 h->func(wdata, &raw_data[1]);
662 }
663
David Herrmann32a0d9a2011-07-05 13:45:18 +0200664 spin_unlock_irqrestore(&wdata->state.lock, flags);
665
David Herrmann02fb72a2011-07-05 13:45:09 +0200666 return 0;
667}
668
David Herrmann23a5a4a2011-08-17 11:43:22 +0200669static void wiimote_leds_destroy(struct wiimote_data *wdata)
670{
671 int i;
672 struct led_classdev *led;
673
674 for (i = 0; i < 4; ++i) {
675 if (wdata->leds[i]) {
676 led = wdata->leds[i];
677 wdata->leds[i] = NULL;
678 led_classdev_unregister(led);
679 kfree(led);
680 }
681 }
682}
683
684static int wiimote_leds_create(struct wiimote_data *wdata)
685{
686 int i, ret;
687 struct device *dev = &wdata->hdev->dev;
688 size_t namesz = strlen(dev_name(dev)) + 9;
689 struct led_classdev *led;
690 char *name;
691
692 for (i = 0; i < 4; ++i) {
693 led = kzalloc(sizeof(struct led_classdev) + namesz, GFP_KERNEL);
694 if (!led) {
695 ret = -ENOMEM;
696 goto err;
697 }
698 name = (void*)&led[1];
699 snprintf(name, namesz, "%s:blue:p%d", dev_name(dev), i);
700 led->name = name;
701 led->brightness = 0;
702 led->max_brightness = 1;
703 led->brightness_get = wiimote_leds_get;
704 led->brightness_set = wiimote_leds_set;
705
706 ret = led_classdev_register(dev, led);
707 if (ret) {
708 kfree(led);
709 goto err;
710 }
711 wdata->leds[i] = led;
712 }
713
714 return 0;
715
716err:
717 wiimote_leds_destroy(wdata);
718 return ret;
719}
720
David Herrmanne894d0e2011-07-05 13:45:10 +0200721static struct wiimote_data *wiimote_create(struct hid_device *hdev)
722{
723 struct wiimote_data *wdata;
David Herrmann1abb9ad2011-07-05 13:45:16 +0200724 int i;
David Herrmanne894d0e2011-07-05 13:45:10 +0200725
726 wdata = kzalloc(sizeof(*wdata), GFP_KERNEL);
727 if (!wdata)
728 return NULL;
729
David Herrmann672bc4e2011-07-05 13:45:11 +0200730 wdata->input = input_allocate_device();
David Herrmann98a558a2011-09-06 13:50:28 +0200731 if (!wdata->input)
732 goto err;
David Herrmann672bc4e2011-07-05 13:45:11 +0200733
David Herrmanne894d0e2011-07-05 13:45:10 +0200734 wdata->hdev = hdev;
735 hid_set_drvdata(hdev, wdata);
736
David Herrmann672bc4e2011-07-05 13:45:11 +0200737 input_set_drvdata(wdata->input, wdata);
David Herrmann26af1742011-08-17 11:43:21 +0200738 wdata->input->open = wiimote_input_open;
739 wdata->input->close = wiimote_input_close;
David Herrmann672bc4e2011-07-05 13:45:11 +0200740 wdata->input->dev.parent = &wdata->hdev->dev;
741 wdata->input->id.bustype = wdata->hdev->bus;
742 wdata->input->id.vendor = wdata->hdev->vendor;
743 wdata->input->id.product = wdata->hdev->product;
744 wdata->input->id.version = wdata->hdev->version;
745 wdata->input->name = WIIMOTE_NAME;
746
David Herrmann1abb9ad2011-07-05 13:45:16 +0200747 set_bit(EV_KEY, wdata->input->evbit);
748 for (i = 0; i < WIIPROTO_KEY_COUNT; ++i)
749 set_bit(wiiproto_keymap[i], wdata->input->keybit);
750
David Herrmannd020be92011-09-06 13:50:27 +0200751 set_bit(FF_RUMBLE, wdata->input->ffbit);
David Herrmann98a558a2011-09-06 13:50:28 +0200752 if (input_ff_create_memless(wdata->input, NULL, wiimote_ff_play))
753 goto err_input;
754
755 wdata->accel = input_allocate_device();
756 if (!wdata->accel)
757 goto err_input;
758
759 input_set_drvdata(wdata->accel, wdata);
760 wdata->accel->open = wiimote_accel_open;
761 wdata->accel->close = wiimote_accel_close;
762 wdata->accel->dev.parent = &wdata->hdev->dev;
763 wdata->accel->id.bustype = wdata->hdev->bus;
764 wdata->accel->id.vendor = wdata->hdev->vendor;
765 wdata->accel->id.product = wdata->hdev->product;
766 wdata->accel->id.version = wdata->hdev->version;
767 wdata->accel->name = WIIMOTE_NAME " Accelerometer";
768
769 set_bit(EV_ABS, wdata->accel->evbit);
770 set_bit(ABS_RX, wdata->accel->absbit);
771 set_bit(ABS_RY, wdata->accel->absbit);
772 set_bit(ABS_RZ, wdata->accel->absbit);
773 input_set_abs_params(wdata->accel, ABS_RX, -500, 500, 2, 4);
774 input_set_abs_params(wdata->accel, ABS_RY, -500, 500, 2, 4);
775 input_set_abs_params(wdata->accel, ABS_RZ, -500, 500, 2, 4);
David Herrmannd020be92011-09-06 13:50:27 +0200776
David Herrmannf363e4f2011-09-06 13:50:30 +0200777 wdata->ir = input_allocate_device();
778 if (!wdata->ir)
779 goto err_ir;
780
781 input_set_drvdata(wdata->ir, wdata);
782 wdata->ir->dev.parent = &wdata->hdev->dev;
783 wdata->ir->id.bustype = wdata->hdev->bus;
784 wdata->ir->id.vendor = wdata->hdev->vendor;
785 wdata->ir->id.product = wdata->hdev->product;
786 wdata->ir->id.version = wdata->hdev->version;
787 wdata->ir->name = WIIMOTE_NAME " IR";
788
789 set_bit(EV_ABS, wdata->ir->evbit);
790 set_bit(ABS_HAT0X, wdata->ir->absbit);
791 set_bit(ABS_HAT0Y, wdata->ir->absbit);
792 set_bit(ABS_HAT1X, wdata->ir->absbit);
793 set_bit(ABS_HAT1Y, wdata->ir->absbit);
794 set_bit(ABS_HAT2X, wdata->ir->absbit);
795 set_bit(ABS_HAT2Y, wdata->ir->absbit);
796 set_bit(ABS_HAT3X, wdata->ir->absbit);
797 set_bit(ABS_HAT3Y, wdata->ir->absbit);
798 input_set_abs_params(wdata->ir, ABS_HAT0X, 0, 1023, 2, 4);
799 input_set_abs_params(wdata->ir, ABS_HAT0Y, 0, 767, 2, 4);
800 input_set_abs_params(wdata->ir, ABS_HAT1X, 0, 1023, 2, 4);
801 input_set_abs_params(wdata->ir, ABS_HAT1Y, 0, 767, 2, 4);
802 input_set_abs_params(wdata->ir, ABS_HAT2X, 0, 1023, 2, 4);
803 input_set_abs_params(wdata->ir, ABS_HAT2Y, 0, 767, 2, 4);
804 input_set_abs_params(wdata->ir, ABS_HAT3X, 0, 1023, 2, 4);
805 input_set_abs_params(wdata->ir, ABS_HAT3Y, 0, 767, 2, 4);
806
David Herrmann23c063c2011-07-05 13:45:14 +0200807 spin_lock_init(&wdata->qlock);
808 INIT_WORK(&wdata->worker, wiimote_worker);
809
David Herrmann32a0d9a2011-07-05 13:45:18 +0200810 spin_lock_init(&wdata->state.lock);
811
David Herrmanne894d0e2011-07-05 13:45:10 +0200812 return wdata;
David Herrmann98a558a2011-09-06 13:50:28 +0200813
David Herrmannf363e4f2011-09-06 13:50:30 +0200814err_ir:
815 input_free_device(wdata->accel);
David Herrmann98a558a2011-09-06 13:50:28 +0200816err_input:
817 input_free_device(wdata->input);
818err:
819 kfree(wdata);
820 return NULL;
David Herrmanne894d0e2011-07-05 13:45:10 +0200821}
822
823static void wiimote_destroy(struct wiimote_data *wdata)
824{
David Herrmann23a5a4a2011-08-17 11:43:22 +0200825 wiimote_leds_destroy(wdata);
David Herrmann3989ef62011-08-17 11:43:20 +0200826
David Herrmann98a558a2011-09-06 13:50:28 +0200827 input_unregister_device(wdata->accel);
David Herrmannf363e4f2011-09-06 13:50:30 +0200828 input_unregister_device(wdata->ir);
David Herrmann3989ef62011-08-17 11:43:20 +0200829 input_unregister_device(wdata->input);
830 cancel_work_sync(&wdata->worker);
831 hid_hw_stop(wdata->hdev);
832
David Herrmanne894d0e2011-07-05 13:45:10 +0200833 kfree(wdata);
834}
835
David Herrmann02fb72a2011-07-05 13:45:09 +0200836static int wiimote_hid_probe(struct hid_device *hdev,
837 const struct hid_device_id *id)
838{
David Herrmanne894d0e2011-07-05 13:45:10 +0200839 struct wiimote_data *wdata;
David Herrmann02fb72a2011-07-05 13:45:09 +0200840 int ret;
841
David Herrmanne894d0e2011-07-05 13:45:10 +0200842 wdata = wiimote_create(hdev);
843 if (!wdata) {
844 hid_err(hdev, "Can't alloc device\n");
845 return -ENOMEM;
846 }
847
David Herrmann02fb72a2011-07-05 13:45:09 +0200848 ret = hid_parse(hdev);
849 if (ret) {
850 hid_err(hdev, "HID parse failed\n");
David Herrmanne894d0e2011-07-05 13:45:10 +0200851 goto err;
David Herrmann02fb72a2011-07-05 13:45:09 +0200852 }
853
854 ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
855 if (ret) {
856 hid_err(hdev, "HW start failed\n");
David Herrmanne894d0e2011-07-05 13:45:10 +0200857 goto err;
David Herrmann02fb72a2011-07-05 13:45:09 +0200858 }
859
David Herrmann98a558a2011-09-06 13:50:28 +0200860 ret = input_register_device(wdata->accel);
David Herrmann672bc4e2011-07-05 13:45:11 +0200861 if (ret) {
862 hid_err(hdev, "Cannot register input device\n");
863 goto err_stop;
864 }
865
David Herrmannf363e4f2011-09-06 13:50:30 +0200866 ret = input_register_device(wdata->ir);
867 if (ret) {
868 hid_err(hdev, "Cannot register input device\n");
869 goto err_ir;
870 }
871
David Herrmann98a558a2011-09-06 13:50:28 +0200872 ret = input_register_device(wdata->input);
873 if (ret) {
874 hid_err(hdev, "Cannot register input device\n");
875 goto err_input;
876 }
877
David Herrmann23a5a4a2011-08-17 11:43:22 +0200878 ret = wiimote_leds_create(wdata);
David Herrmann3989ef62011-08-17 11:43:20 +0200879 if (ret)
880 goto err_free;
881
David Herrmann02fb72a2011-07-05 13:45:09 +0200882 hid_info(hdev, "New device registered\n");
David Herrmann32a0d9a2011-07-05 13:45:18 +0200883
884 /* by default set led1 after device initialization */
885 spin_lock_irq(&wdata->state.lock);
David Herrmanndb308342011-07-05 13:45:17 +0200886 wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
David Herrmann32a0d9a2011-07-05 13:45:18 +0200887 spin_unlock_irq(&wdata->state.lock);
888
David Herrmann02fb72a2011-07-05 13:45:09 +0200889 return 0;
David Herrmanne894d0e2011-07-05 13:45:10 +0200890
David Herrmann3989ef62011-08-17 11:43:20 +0200891err_free:
892 wiimote_destroy(wdata);
893 return ret;
894
David Herrmann98a558a2011-09-06 13:50:28 +0200895err_input:
David Herrmannf363e4f2011-09-06 13:50:30 +0200896 input_unregister_device(wdata->ir);
897 wdata->ir = NULL;
898err_ir:
David Herrmann98a558a2011-09-06 13:50:28 +0200899 input_unregister_device(wdata->accel);
900 wdata->accel = NULL;
David Herrmann672bc4e2011-07-05 13:45:11 +0200901err_stop:
902 hid_hw_stop(hdev);
David Herrmanne894d0e2011-07-05 13:45:10 +0200903err:
David Herrmannf363e4f2011-09-06 13:50:30 +0200904 input_free_device(wdata->ir);
David Herrmann98a558a2011-09-06 13:50:28 +0200905 input_free_device(wdata->accel);
David Herrmann672bc4e2011-07-05 13:45:11 +0200906 input_free_device(wdata->input);
David Herrmann3989ef62011-08-17 11:43:20 +0200907 kfree(wdata);
David Herrmanne894d0e2011-07-05 13:45:10 +0200908 return ret;
David Herrmann02fb72a2011-07-05 13:45:09 +0200909}
910
911static void wiimote_hid_remove(struct hid_device *hdev)
912{
David Herrmanne894d0e2011-07-05 13:45:10 +0200913 struct wiimote_data *wdata = hid_get_drvdata(hdev);
914
David Herrmann02fb72a2011-07-05 13:45:09 +0200915 hid_info(hdev, "Device removed\n");
David Herrmanne894d0e2011-07-05 13:45:10 +0200916 wiimote_destroy(wdata);
David Herrmann02fb72a2011-07-05 13:45:09 +0200917}
918
919static const struct hid_device_id wiimote_hid_devices[] = {
920 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO,
921 USB_DEVICE_ID_NINTENDO_WIIMOTE) },
922 { }
923};
924MODULE_DEVICE_TABLE(hid, wiimote_hid_devices);
925
926static struct hid_driver wiimote_hid_driver = {
927 .name = "wiimote",
928 .id_table = wiimote_hid_devices,
929 .probe = wiimote_hid_probe,
930 .remove = wiimote_hid_remove,
931 .raw_event = wiimote_hid_event,
932};
933
David Herrmannfb51b442011-07-05 13:45:08 +0200934static int __init wiimote_init(void)
935{
David Herrmann02fb72a2011-07-05 13:45:09 +0200936 int ret;
937
938 ret = hid_register_driver(&wiimote_hid_driver);
939 if (ret)
940 pr_err("Can't register wiimote hid driver\n");
941
942 return ret;
David Herrmannfb51b442011-07-05 13:45:08 +0200943}
944
945static void __exit wiimote_exit(void)
946{
David Herrmann02fb72a2011-07-05 13:45:09 +0200947 hid_unregister_driver(&wiimote_hid_driver);
David Herrmannfb51b442011-07-05 13:45:08 +0200948}
949
950module_init(wiimote_init);
951module_exit(wiimote_exit);
952MODULE_LICENSE("GPL");
953MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>");
954MODULE_DESCRIPTION(WIIMOTE_NAME " Device Driver");
955MODULE_VERSION(WIIMOTE_VERSION);