aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-core.c
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2007-05-14 03:57:40 -0400
committerJiri Kosina <jkosina@suse.cz>2007-10-14 08:47:26 -0400
commit86166b7bcda0bcb53525114fa1c87ac432be478e (patch)
tree1f6afc4c1c1d7a6dd88236f3c11fde61c1885b14 /drivers/hid/hid-core.c
parentefc493f9d5463d933a64a2758fbe6d9bb8300cbb (diff)
HID: add hidraw interface
hidraw is an interface that is going to obsolete hiddev one day. Many userland applications are using libusb instead of using kernel-provided hiddev interface. This is caused by various reasons - the HID parser in kernel doesn't handle all the HID hardware on the planet properly, some devices might require its own specific quirks/drivers, etc. hiddev interface tries to do its best to parse all the received reports properly, and presents only parsed usages into userspace. This is however often not enough, and that's the reason why many userland applications just don't use hiddev at all, and rather use libusb to read raw USB events and process them on their own. Another drawback of hiddev is that it is USB-specific. hidraw interface provides userspace readers with really raw HID reports, no matter what the low-level transport layer is (USB/BT), and gives the userland applications all the freedom to process the HID reports in a way they wish to. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-core.c')
-rw-r--r--drivers/hid/hid-core.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 317cf8a7b63..2884b036495 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -30,6 +30,7 @@
30#include <linux/hid.h> 30#include <linux/hid.h>
31#include <linux/hiddev.h> 31#include <linux/hiddev.h>
32#include <linux/hid-debug.h> 32#include <linux/hid-debug.h>
33#include <linux/hidraw.h>
33 34
34/* 35/*
35 * Version Information 36 * Version Information
@@ -979,6 +980,8 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
979 980
980 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) 981 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
981 hid->hiddev_report_event(hid, report); 982 hid->hiddev_report_event(hid, report);
983 if (hid->claimed & HID_CLAIMED_HIDRAW)
984 hidraw_report_event(hid, data, size);
982 985
983 for (n = 0; n < report->maxfield; n++) 986 for (n = 0; n < report->maxfield; n++)
984 hid_input_field(hid, report->field[n], data, interrupt); 987 hid_input_field(hid, report->field[n], data, interrupt);
@@ -990,5 +993,18 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
990} 993}
991EXPORT_SYMBOL_GPL(hid_input_report); 994EXPORT_SYMBOL_GPL(hid_input_report);
992 995
996static int __init hid_init(void)
997{
998 return hidraw_init();
999}
1000
1001static void __exit hid_exit(void)
1002{
1003 hidraw_exit();
1004}
1005
1006module_init(hid_init);
1007module_exit(hid_exit);
1008
993MODULE_LICENSE(DRIVER_LICENSE); 1009MODULE_LICENSE(DRIVER_LICENSE);
994 1010