HID: wiimote: Register wiimote hid driver stub
authorDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 5 Jul 2011 11:45:09 +0000 (13:45 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 11 Jul 2011 12:30:22 +0000 (14:30 +0200)
The wiimote uses a fake HID protocol. Hence, we need to prevent
HIDINPUT and HIDDEV from parsing wiimote data and instead parse
raw hid events.
Add VID/PID to hid-core so the special driver is loaded on new
wiimotes.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-wiimote.c

index 6f3289a5788812ef573561482f581d04ca6524cc..eccaf8ad26c149ddbded4a974f76670c0744af26 100644 (file)
@@ -1504,6 +1504,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
 
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) },
        { }
 };
 
index a756ee6c7df59389c3f79b8a7f06a2343a28aed8..dfe25289693233a48da2d9c3b97b827ee19ed216 100644 (file)
 #define USB_VENDOR_ID_NEXTWINDOW       0x1926
 #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN   0x0003
 
+#define USB_VENDOR_ID_NINTENDO         0x057e
+#define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306
+
 #define USB_VENDOR_ID_NTRIG            0x1b96
 #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN   0x0001
 #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1   0x0003
index 8a770e62a8b4e5fb3d01f14e498d8eda99e8a6a4..ed4fe18c7fb546a46adf12162014401e17f84b7e 100644 (file)
  * any later version.
  */
 
+#include <linux/hid.h>
 #include <linux/module.h>
+#include "hid-ids.h"
 
 #define WIIMOTE_VERSION "0.1"
 #define WIIMOTE_NAME "Nintendo Wii Remote"
 
-static int __init wiimote_init(void)
+static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
+                                                       u8 *raw_data, int size)
+{
+       if (size < 1)
+               return -EINVAL;
+
+       return 0;
+}
+
+static int wiimote_hid_probe(struct hid_device *hdev,
+                               const struct hid_device_id *id)
 {
+       int ret;
+
+       ret = hid_parse(hdev);
+       if (ret) {
+               hid_err(hdev, "HID parse failed\n");
+               return ret;
+       }
+
+       ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
+       if (ret) {
+               hid_err(hdev, "HW start failed\n");
+               return ret;
+       }
+
+       hid_info(hdev, "New device registered\n");
        return 0;
 }
 
+static void wiimote_hid_remove(struct hid_device *hdev)
+{
+       hid_info(hdev, "Device removed\n");
+       hid_hw_stop(hdev);
+}
+
+static const struct hid_device_id wiimote_hid_devices[] = {
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO,
+                               USB_DEVICE_ID_NINTENDO_WIIMOTE) },
+       { }
+};
+MODULE_DEVICE_TABLE(hid, wiimote_hid_devices);
+
+static struct hid_driver wiimote_hid_driver = {
+       .name = "wiimote",
+       .id_table = wiimote_hid_devices,
+       .probe = wiimote_hid_probe,
+       .remove = wiimote_hid_remove,
+       .raw_event = wiimote_hid_event,
+};
+
+static int __init wiimote_init(void)
+{
+       int ret;
+
+       ret = hid_register_driver(&wiimote_hid_driver);
+       if (ret)
+               pr_err("Can't register wiimote hid driver\n");
+
+       return ret;
+}
+
 static void __exit wiimote_exit(void)
 {
+       hid_unregister_driver(&wiimote_hid_driver);
 }
 
 module_init(wiimote_init);