aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
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 /include/linux
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 'include/linux')
-rw-r--r--include/linux/hid.h5
-rw-r--r--include/linux/hidraw.h86
2 files changed, 91 insertions, 0 deletions
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 898103b401f1..0ac2b5260b26 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -403,6 +403,7 @@ struct hid_control_fifo {
403 403
404#define HID_CLAIMED_INPUT 1 404#define HID_CLAIMED_INPUT 1
405#define HID_CLAIMED_HIDDEV 2 405#define HID_CLAIMED_HIDDEV 2
406#define HID_CLAIMED_HIDRAW 4
406 407
407#define HID_CTRL_RUNNING 1 408#define HID_CTRL_RUNNING 1
408#define HID_OUT_RUNNING 2 409#define HID_OUT_RUNNING 2
@@ -438,6 +439,7 @@ struct hid_device { /* device report descriptor */
438 439
439 struct list_head inputs; /* The list of inputs */ 440 struct list_head inputs; /* The list of inputs */
440 void *hiddev; /* The hiddev structure */ 441 void *hiddev; /* The hiddev structure */
442 void *hidraw;
441 int minor; /* Hiddev minor number */ 443 int minor; /* Hiddev minor number */
442 444
443 wait_queue_head_t wait; /* For sleeping */ 445 wait_queue_head_t wait; /* For sleeping */
@@ -458,6 +460,9 @@ struct hid_device { /* device report descriptor */
458 void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field, 460 void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field,
459 struct hid_usage *, __s32); 461 struct hid_usage *, __s32);
460 void (*hiddev_report_event) (struct hid_device *, struct hid_report *); 462 void (*hiddev_report_event) (struct hid_device *, struct hid_report *);
463
464 /* handler for raw output data, used by hidraw */
465 int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t);
461#ifdef CONFIG_USB_HIDINPUT_POWERBOOK 466#ifdef CONFIG_USB_HIDINPUT_POWERBOOK
462 unsigned long pb_pressed_fn[NBITS(KEY_MAX)]; 467 unsigned long pb_pressed_fn[NBITS(KEY_MAX)];
463 unsigned long pb_pressed_numlock[NBITS(KEY_MAX)]; 468 unsigned long pb_pressed_numlock[NBITS(KEY_MAX)];
diff --git a/include/linux/hidraw.h b/include/linux/hidraw.h
new file mode 100644
index 000000000000..6676cd5e9954
--- /dev/null
+++ b/include/linux/hidraw.h
@@ -0,0 +1,86 @@
1#ifndef _HIDRAW_H
2#define _HIDRAW_H
3
4/*
5 * Copyright (c) 2007 Jiri Kosina
6 */
7
8/*
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms and conditions of the GNU General Public License,
11 * version 2, as published by the Free Software Foundation.
12 *
13 * You should have received a copy of the GNU General Public License along with
14 * this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
18struct hidraw_report_descriptor {
19 __u32 size;
20 __u8 *value;
21};
22
23struct hidraw_devinfo {
24 __u32 bustype;
25 __s16 vendor;
26 __s16 product;
27};
28
29/* ioctl interface */
30#define HIDIOCGRDESCSIZE _IOR('H', 0x01, int)
31#define HIDIOCGRDESC _IOR('H', 0x02, struct hidraw_report_descriptor)
32#define HIDIOCGRAWINFO _IOR('H', 0x03, struct hidraw_devinfo)
33
34#define HIDRAW_FIRST_MINOR 0
35#define HIDRAW_MAX_DEVICES 64
36/* number of reports to buffer */
37#define HIDRAW_BUFFER_SIZE 64
38
39
40/* kernel-only API declarations */
41#ifdef __KERNEL__
42
43#include <linux/hid.h>
44
45struct hidraw {
46 unsigned int minor;
47 int exist;
48 int open;
49 wait_queue_head_t wait;
50 struct hid_device *hid;
51 struct device *dev;
52 struct list_head list;
53};
54
55struct hidraw_report {
56 __u8 *value;
57 int len;
58};
59
60struct hidraw_list {
61 struct hidraw_report buffer[HIDRAW_BUFFER_SIZE];
62 int head;
63 int tail;
64 struct fasync_struct *fasync;
65 struct hidraw *hidraw;
66 struct list_head node;
67 struct mutex read_mutex;
68};
69
70#ifdef CONFIG_HIDRAW
71int hidraw_init(void);
72void hidraw_exit(void);
73void hidraw_report_event(struct hid_device *, u8 *, int);
74int hidraw_connect(struct hid_device *);
75void hidraw_disconnect(struct hid_device *);
76#else
77static inline int hidraw_init(void) { return 0; }
78static inline void hidraw_exit(void) { }
79static inline void hidraw_report_event(struct hid_device *hid, u8 *data, int len) { }
80static inline int hidraw_connect(struct hid_device *hid) { return -1; }
81static inline void hidraw_disconnect(struct hid_device *hid) { }
82#endif
83
84#endif
85
86#endif