Commit | Line | Data |
---|---|---|
949f8fef JS |
1 | /* |
2 | * HID driver for some gyration "special" devices | |
3 | * | |
4 | * Copyright (c) 1999 Andreas Gal | |
5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> | |
6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc | |
949f8fef JS |
7 | * Copyright (c) 2007 Paul Walmsley |
8 | * Copyright (c) 2008 Jiri Slaby | |
1e093206 | 9 | * Copyright (c) 2006-2008 Jiri Kosina |
949f8fef JS |
10 | */ |
11 | ||
12 | /* | |
13 | * This program is free software; you can redistribute it and/or modify it | |
14 | * under the terms of the GNU General Public License as published by the Free | |
15 | * Software Foundation; either version 2 of the License, or (at your option) | |
16 | * any later version. | |
17 | */ | |
18 | ||
19 | #include <linux/device.h> | |
20 | #include <linux/input.h> | |
21 | #include <linux/hid.h> | |
22 | #include <linux/module.h> | |
23 | ||
24 | #include "hid-ids.h" | |
25 | ||
26 | #define gy_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ | |
27 | EV_KEY, (c)) | |
28 | static int gyration_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |
29 | struct hid_field *field, struct hid_usage *usage, | |
30 | unsigned long **bit, int *max) | |
31 | { | |
32 | if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) | |
33 | return 0; | |
34 | ||
35 | set_bit(EV_REP, hi->input->evbit); | |
36 | switch (usage->hid & HID_USAGE) { | |
37 | /* Reported on Gyration MCE Remote */ | |
38 | case 0x00d: gy_map_key_clear(KEY_HOME); break; | |
39 | case 0x024: gy_map_key_clear(KEY_DVD); break; | |
40 | case 0x025: gy_map_key_clear(KEY_PVR); break; | |
41 | case 0x046: gy_map_key_clear(KEY_MEDIA); break; | |
42 | case 0x047: gy_map_key_clear(KEY_MP3); break; | |
1e093206 | 43 | case 0x048: gy_map_key_clear(KEY_MEDIA); break; |
949f8fef JS |
44 | case 0x049: gy_map_key_clear(KEY_CAMERA); break; |
45 | case 0x04a: gy_map_key_clear(KEY_VIDEO); break; | |
46 | ||
47 | default: | |
48 | return 0; | |
49 | } | |
50 | return 1; | |
51 | } | |
52 | ||
53 | static int gyration_event(struct hid_device *hdev, struct hid_field *field, | |
54 | struct hid_usage *usage, __s32 value) | |
55 | { | |
56 | struct input_dev *input = field->hidinput->input; | |
57 | ||
58 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK && | |
59 | (usage->hid & 0xff) == 0x82) { | |
60 | input_event(input, usage->type, usage->code, 1); | |
61 | input_sync(input); | |
62 | input_event(input, usage->type, usage->code, 0); | |
63 | input_sync(input); | |
64 | return 1; | |
65 | } | |
66 | ||
67 | return 0; | |
68 | } | |
69 | ||
70 | static const struct hid_device_id gyration_devices[] = { | |
71 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | |
1e093206 | 72 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, |
949f8fef JS |
73 | { } |
74 | }; | |
75 | MODULE_DEVICE_TABLE(hid, gyration_devices); | |
76 | ||
77 | static struct hid_driver gyration_driver = { | |
78 | .name = "gyration", | |
79 | .id_table = gyration_devices, | |
80 | .input_mapping = gyration_input_mapping, | |
81 | .event = gyration_event, | |
82 | }; | |
83 | ||
84 | static int gyration_init(void) | |
85 | { | |
86 | return hid_register_driver(&gyration_driver); | |
87 | } | |
88 | ||
89 | static void gyration_exit(void) | |
90 | { | |
91 | hid_unregister_driver(&gyration_driver); | |
92 | } | |
93 | ||
94 | module_init(gyration_init); | |
95 | module_exit(gyration_exit); | |
96 | MODULE_LICENSE("GPL"); |