Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/hid/hid-ezkey.c
15111 views
1
/*
2
* HID driver for some ezkey "special" devices
3
*
4
* Copyright (c) 1999 Andreas Gal
5
* Copyright (c) 2000-2005 Vojtech Pavlik <[email protected]>
6
* Copyright (c) 2005 Michael Haboustak <[email protected]> for Concept2, Inc
7
* Copyright (c) 2006-2007 Jiri Kosina
8
* Copyright (c) 2007 Paul Walmsley
9
* Copyright (c) 2008 Jiri Slaby
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 ez_map_rel(c) hid_map_usage(hi, usage, bit, max, EV_REL, (c))
27
#define ez_map_key(c) hid_map_usage(hi, usage, bit, max, EV_KEY, (c))
28
29
static int ez_input_mapping(struct hid_device *hdev, struct hid_input *hi,
30
struct hid_field *field, struct hid_usage *usage,
31
unsigned long **bit, int *max)
32
{
33
if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
34
return 0;
35
36
switch (usage->hid & HID_USAGE) {
37
case 0x230: ez_map_key(BTN_MOUSE); break;
38
case 0x231: ez_map_rel(REL_WHEEL); break;
39
/*
40
* this keyboard has a scrollwheel implemented in
41
* totally broken way. We map this usage temporarily
42
* to HWHEEL and handle it in the event quirk handler
43
*/
44
case 0x232: ez_map_rel(REL_HWHEEL); break;
45
default:
46
return 0;
47
}
48
return 1;
49
}
50
51
static int ez_event(struct hid_device *hdev, struct hid_field *field,
52
struct hid_usage *usage, __s32 value)
53
{
54
if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput ||
55
!usage->type)
56
return 0;
57
58
/* handle the temporary quirky mapping to HWHEEL */
59
if (usage->type == EV_REL && usage->code == REL_HWHEEL) {
60
struct input_dev *input = field->hidinput->input;
61
input_event(input, usage->type, REL_WHEEL, -value);
62
return 1;
63
}
64
65
return 0;
66
}
67
68
static const struct hid_device_id ez_devices[] = {
69
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
70
{ }
71
};
72
MODULE_DEVICE_TABLE(hid, ez_devices);
73
74
static struct hid_driver ez_driver = {
75
.name = "ezkey",
76
.id_table = ez_devices,
77
.input_mapping = ez_input_mapping,
78
.event = ez_event,
79
};
80
81
static int __init ez_init(void)
82
{
83
return hid_register_driver(&ez_driver);
84
}
85
86
static void __exit ez_exit(void)
87
{
88
hid_unregister_driver(&ez_driver);
89
}
90
91
module_init(ez_init);
92
module_exit(ez_exit);
93
MODULE_LICENSE("GPL");
94
95