hid-wiimote.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. /*
  2. * HID driver for Nintendo Wiimote devices
  3. * Copyright (c) 2011 David Herrmann
  4. */
  5. /*
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the Free
  8. * Software Foundation; either version 2 of the License, or (at your option)
  9. * any later version.
  10. */
  11. #include <linux/atomic.h>
  12. #include <linux/device.h>
  13. #include <linux/hid.h>
  14. #include <linux/input.h>
  15. #include <linux/module.h>
  16. #include <linux/spinlock.h>
  17. #include "hid-ids.h"
  18. #define WIIMOTE_VERSION "0.1"
  19. #define WIIMOTE_NAME "Nintendo Wii Remote"
  20. #define WIIMOTE_BUFSIZE 32
  21. struct wiimote_buf {
  22. __u8 data[HID_MAX_BUFFER_SIZE];
  23. size_t size;
  24. };
  25. struct wiimote_data {
  26. atomic_t ready;
  27. struct hid_device *hdev;
  28. struct input_dev *input;
  29. spinlock_t qlock;
  30. __u8 head;
  31. __u8 tail;
  32. struct wiimote_buf outq[WIIMOTE_BUFSIZE];
  33. struct work_struct worker;
  34. };
  35. #define WIIPROTO_FLAG_LED1 0x01
  36. #define WIIPROTO_FLAG_LED2 0x02
  37. #define WIIPROTO_FLAG_LED3 0x04
  38. #define WIIPROTO_FLAG_LED4 0x08
  39. enum wiiproto_reqs {
  40. WIIPROTO_REQ_LED = 0x11,
  41. WIIPROTO_REQ_DRM_K = 0x30,
  42. };
  43. enum wiiproto_keys {
  44. WIIPROTO_KEY_LEFT,
  45. WIIPROTO_KEY_RIGHT,
  46. WIIPROTO_KEY_UP,
  47. WIIPROTO_KEY_DOWN,
  48. WIIPROTO_KEY_PLUS,
  49. WIIPROTO_KEY_MINUS,
  50. WIIPROTO_KEY_ONE,
  51. WIIPROTO_KEY_TWO,
  52. WIIPROTO_KEY_A,
  53. WIIPROTO_KEY_B,
  54. WIIPROTO_KEY_HOME,
  55. WIIPROTO_KEY_COUNT
  56. };
  57. static __u16 wiiproto_keymap[] = {
  58. KEY_LEFT, /* WIIPROTO_KEY_LEFT */
  59. KEY_RIGHT, /* WIIPROTO_KEY_RIGHT */
  60. KEY_UP, /* WIIPROTO_KEY_UP */
  61. KEY_DOWN, /* WIIPROTO_KEY_DOWN */
  62. KEY_NEXT, /* WIIPROTO_KEY_PLUS */
  63. KEY_PREVIOUS, /* WIIPROTO_KEY_MINUS */
  64. BTN_1, /* WIIPROTO_KEY_ONE */
  65. BTN_2, /* WIIPROTO_KEY_TWO */
  66. BTN_A, /* WIIPROTO_KEY_A */
  67. BTN_B, /* WIIPROTO_KEY_B */
  68. BTN_MODE, /* WIIPROTO_KEY_HOME */
  69. };
  70. static ssize_t wiimote_hid_send(struct hid_device *hdev, __u8 *buffer,
  71. size_t count)
  72. {
  73. __u8 *buf;
  74. ssize_t ret;
  75. if (!hdev->hid_output_raw_report)
  76. return -ENODEV;
  77. buf = kmemdup(buffer, count, GFP_KERNEL);
  78. if (!buf)
  79. return -ENOMEM;
  80. ret = hdev->hid_output_raw_report(hdev, buf, count, HID_OUTPUT_REPORT);
  81. kfree(buf);
  82. return ret;
  83. }
  84. static void wiimote_worker(struct work_struct *work)
  85. {
  86. struct wiimote_data *wdata = container_of(work, struct wiimote_data,
  87. worker);
  88. unsigned long flags;
  89. spin_lock_irqsave(&wdata->qlock, flags);
  90. while (wdata->head != wdata->tail) {
  91. spin_unlock_irqrestore(&wdata->qlock, flags);
  92. wiimote_hid_send(wdata->hdev, wdata->outq[wdata->tail].data,
  93. wdata->outq[wdata->tail].size);
  94. spin_lock_irqsave(&wdata->qlock, flags);
  95. wdata->tail = (wdata->tail + 1) % WIIMOTE_BUFSIZE;
  96. }
  97. spin_unlock_irqrestore(&wdata->qlock, flags);
  98. }
  99. static void wiimote_queue(struct wiimote_data *wdata, const __u8 *buffer,
  100. size_t count)
  101. {
  102. unsigned long flags;
  103. __u8 newhead;
  104. if (count > HID_MAX_BUFFER_SIZE) {
  105. hid_warn(wdata->hdev, "Sending too large output report\n");
  106. return;
  107. }
  108. /*
  109. * Copy new request into our output queue and check whether the
  110. * queue is full. If it is full, discard this request.
  111. * If it is empty we need to start a new worker that will
  112. * send out the buffer to the hid device.
  113. * If the queue is not empty, then there must be a worker
  114. * that is currently sending out our buffer and this worker
  115. * will reschedule itself until the queue is empty.
  116. */
  117. spin_lock_irqsave(&wdata->qlock, flags);
  118. memcpy(wdata->outq[wdata->head].data, buffer, count);
  119. wdata->outq[wdata->head].size = count;
  120. newhead = (wdata->head + 1) % WIIMOTE_BUFSIZE;
  121. if (wdata->head == wdata->tail) {
  122. wdata->head = newhead;
  123. schedule_work(&wdata->worker);
  124. } else if (newhead != wdata->tail) {
  125. wdata->head = newhead;
  126. } else {
  127. hid_warn(wdata->hdev, "Output queue is full");
  128. }
  129. spin_unlock_irqrestore(&wdata->qlock, flags);
  130. }
  131. static void wiiproto_req_leds(struct wiimote_data *wdata, int leds)
  132. {
  133. __u8 cmd[2];
  134. cmd[0] = WIIPROTO_REQ_LED;
  135. cmd[1] = 0;
  136. if (leds & WIIPROTO_FLAG_LED1)
  137. cmd[1] |= 0x10;
  138. if (leds & WIIPROTO_FLAG_LED2)
  139. cmd[1] |= 0x20;
  140. if (leds & WIIPROTO_FLAG_LED3)
  141. cmd[1] |= 0x40;
  142. if (leds & WIIPROTO_FLAG_LED4)
  143. cmd[1] |= 0x80;
  144. wiimote_queue(wdata, cmd, sizeof(cmd));
  145. }
  146. static int wiimote_input_event(struct input_dev *dev, unsigned int type,
  147. unsigned int code, int value)
  148. {
  149. struct wiimote_data *wdata = input_get_drvdata(dev);
  150. if (!atomic_read(&wdata->ready))
  151. return -EBUSY;
  152. /* smp_rmb: Make sure wdata->xy is available when wdata->ready is 1 */
  153. smp_rmb();
  154. return 0;
  155. }
  156. static void handler_keys(struct wiimote_data *wdata, const __u8 *payload)
  157. {
  158. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_LEFT],
  159. !!(payload[0] & 0x01));
  160. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_RIGHT],
  161. !!(payload[0] & 0x02));
  162. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_DOWN],
  163. !!(payload[0] & 0x04));
  164. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_UP],
  165. !!(payload[0] & 0x08));
  166. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_PLUS],
  167. !!(payload[0] & 0x10));
  168. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_TWO],
  169. !!(payload[1] & 0x01));
  170. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_ONE],
  171. !!(payload[1] & 0x02));
  172. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_B],
  173. !!(payload[1] & 0x04));
  174. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_A],
  175. !!(payload[1] & 0x08));
  176. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_MINUS],
  177. !!(payload[1] & 0x10));
  178. input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_HOME],
  179. !!(payload[1] & 0x80));
  180. input_sync(wdata->input);
  181. }
  182. struct wiiproto_handler {
  183. __u8 id;
  184. size_t size;
  185. void (*func)(struct wiimote_data *wdata, const __u8 *payload);
  186. };
  187. static struct wiiproto_handler handlers[] = {
  188. { .id = WIIPROTO_REQ_DRM_K, .size = 2, .func = handler_keys },
  189. { .id = 0 }
  190. };
  191. static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
  192. u8 *raw_data, int size)
  193. {
  194. struct wiimote_data *wdata = hid_get_drvdata(hdev);
  195. struct wiiproto_handler *h;
  196. int i;
  197. if (!atomic_read(&wdata->ready))
  198. return -EBUSY;
  199. /* smp_rmb: Make sure wdata->xy is available when wdata->ready is 1 */
  200. smp_rmb();
  201. if (size < 1)
  202. return -EINVAL;
  203. for (i = 0; handlers[i].id; ++i) {
  204. h = &handlers[i];
  205. if (h->id == raw_data[0] && h->size < size)
  206. h->func(wdata, &raw_data[1]);
  207. }
  208. return 0;
  209. }
  210. static struct wiimote_data *wiimote_create(struct hid_device *hdev)
  211. {
  212. struct wiimote_data *wdata;
  213. int i;
  214. wdata = kzalloc(sizeof(*wdata), GFP_KERNEL);
  215. if (!wdata)
  216. return NULL;
  217. wdata->input = input_allocate_device();
  218. if (!wdata->input) {
  219. kfree(wdata);
  220. return NULL;
  221. }
  222. wdata->hdev = hdev;
  223. hid_set_drvdata(hdev, wdata);
  224. input_set_drvdata(wdata->input, wdata);
  225. wdata->input->event = wiimote_input_event;
  226. wdata->input->dev.parent = &wdata->hdev->dev;
  227. wdata->input->id.bustype = wdata->hdev->bus;
  228. wdata->input->id.vendor = wdata->hdev->vendor;
  229. wdata->input->id.product = wdata->hdev->product;
  230. wdata->input->id.version = wdata->hdev->version;
  231. wdata->input->name = WIIMOTE_NAME;
  232. set_bit(EV_KEY, wdata->input->evbit);
  233. for (i = 0; i < WIIPROTO_KEY_COUNT; ++i)
  234. set_bit(wiiproto_keymap[i], wdata->input->keybit);
  235. spin_lock_init(&wdata->qlock);
  236. INIT_WORK(&wdata->worker, wiimote_worker);
  237. return wdata;
  238. }
  239. static void wiimote_destroy(struct wiimote_data *wdata)
  240. {
  241. kfree(wdata);
  242. }
  243. static int wiimote_hid_probe(struct hid_device *hdev,
  244. const struct hid_device_id *id)
  245. {
  246. struct wiimote_data *wdata;
  247. int ret;
  248. wdata = wiimote_create(hdev);
  249. if (!wdata) {
  250. hid_err(hdev, "Can't alloc device\n");
  251. return -ENOMEM;
  252. }
  253. ret = hid_parse(hdev);
  254. if (ret) {
  255. hid_err(hdev, "HID parse failed\n");
  256. goto err;
  257. }
  258. ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
  259. if (ret) {
  260. hid_err(hdev, "HW start failed\n");
  261. goto err;
  262. }
  263. ret = input_register_device(wdata->input);
  264. if (ret) {
  265. hid_err(hdev, "Cannot register input device\n");
  266. goto err_stop;
  267. }
  268. /* smp_wmb: Write wdata->xy first before wdata->ready is set to 1 */
  269. smp_wmb();
  270. atomic_set(&wdata->ready, 1);
  271. hid_info(hdev, "New device registered\n");
  272. wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
  273. return 0;
  274. err_stop:
  275. hid_hw_stop(hdev);
  276. err:
  277. input_free_device(wdata->input);
  278. wiimote_destroy(wdata);
  279. return ret;
  280. }
  281. static void wiimote_hid_remove(struct hid_device *hdev)
  282. {
  283. struct wiimote_data *wdata = hid_get_drvdata(hdev);
  284. hid_info(hdev, "Device removed\n");
  285. hid_hw_stop(hdev);
  286. input_unregister_device(wdata->input);
  287. cancel_work_sync(&wdata->worker);
  288. wiimote_destroy(wdata);
  289. }
  290. static const struct hid_device_id wiimote_hid_devices[] = {
  291. { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO,
  292. USB_DEVICE_ID_NINTENDO_WIIMOTE) },
  293. { }
  294. };
  295. MODULE_DEVICE_TABLE(hid, wiimote_hid_devices);
  296. static struct hid_driver wiimote_hid_driver = {
  297. .name = "wiimote",
  298. .id_table = wiimote_hid_devices,
  299. .probe = wiimote_hid_probe,
  300. .remove = wiimote_hid_remove,
  301. .raw_event = wiimote_hid_event,
  302. };
  303. static int __init wiimote_init(void)
  304. {
  305. int ret;
  306. ret = hid_register_driver(&wiimote_hid_driver);
  307. if (ret)
  308. pr_err("Can't register wiimote hid driver\n");
  309. return ret;
  310. }
  311. static void __exit wiimote_exit(void)
  312. {
  313. hid_unregister_driver(&wiimote_hid_driver);
  314. }
  315. module_init(wiimote_init);
  316. module_exit(wiimote_exit);
  317. MODULE_LICENSE("GPL");
  318. MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>");
  319. MODULE_DESCRIPTION(WIIMOTE_NAME " Device Driver");
  320. MODULE_VERSION(WIIMOTE_VERSION);