14 #include <linux/device.h>
16 #include <linux/hid.h>
17 #include <linux/input.h>
19 #include <linux/module.h>
21 #include <linux/poll.h>
22 #include <linux/sched.h>
25 #include <linux/wait.h>
27 #define UHID_NAME "uhid"
28 #define UHID_BUFSIZE 32
61 if (newhead != uhid->
tail) {
84 spin_unlock_irqrestore(&uhid->
qlock, flags);
89 static int uhid_hid_start(
struct hid_device *hid)
108 return uhid_queue_event(uhid,
UHID_OPEN);
118 static int uhid_hid_input(
struct input_dev *
input,
unsigned int type,
121 struct hid_device *hid = input_get_drvdata(input);
136 uhid_queue(uhid, ev);
137 spin_unlock_irqrestore(&uhid->
qlock, flags);
142 static int uhid_hid_parse(
struct hid_device *hid)
149 static int uhid_hid_get_raw(
struct hid_device *hid,
unsigned char rnum,
194 uhid_queue(uhid, ev);
195 spin_unlock_irqrestore(&uhid->
qlock, flags);
207 }
else if (ret < 0) {
222 spin_unlock_irqrestore(&uhid->
qlock, flags);
229 return ret ? ret :
len;
232 static int uhid_hid_output_raw(
struct hid_device *hid,
__u8 *buf,
size_t count,
233 unsigned char report_type)
240 switch (report_type) {
264 uhid_queue(uhid, ev);
265 spin_unlock_irqrestore(&uhid->
qlock, flags);
271 .start = uhid_hid_start,
272 .stop = uhid_hid_stop,
273 .open = uhid_hid_open,
274 .close = uhid_hid_close,
275 .hidinput_input_event = uhid_hid_input,
276 .parse = uhid_hid_parse,
279 static int uhid_dev_create(
struct uhid_device *uhid,
324 hid->
dev.parent = uhid_misc.this_device;
331 hid_err(hid,
"Cannot register HID device\n");
346 static int uhid_dev_destroy(
struct uhid_device *uhid)
369 min_t(
size_t, ev->
u.
input.size, UHID_DATA_MAX), 0);
374 static int uhid_dev_feature_answer(
struct uhid_device *uhid,
395 spin_unlock_irqrestore(&uhid->
qlock, flags);
421 static int uhid_char_release(
struct inode *inode,
struct file *file)
426 uhid_dev_destroy(uhid);
436 static ssize_t uhid_char_read(
struct file *file,
char __user *
buffer,
437 size_t count, loff_t *ppos)
445 if (count <
sizeof(
__u32))
467 len =
min(count,
sizeof(**uhid->
outq));
475 uhid->
tail = (uhid->
tail + 1) % UHID_BUFSIZE;
476 spin_unlock_irqrestore(&uhid->
qlock, flags);
481 return ret ? ret : len;
484 static ssize_t uhid_char_write(
struct file *file,
const char __user *buffer,
485 size_t count, loff_t *ppos)
492 if (count <
sizeof(
__u32))
508 ret = uhid_dev_create(uhid, &uhid->
input_buf);
511 ret = uhid_dev_destroy(uhid);
514 ret = uhid_dev_input(uhid, &uhid->
input_buf);
517 ret = uhid_dev_feature_answer(uhid, &uhid->
input_buf);
527 return ret ? ret :
count;
530 static unsigned int uhid_char_poll(
struct file *file,
poll_table *
wait)
534 poll_wait(file, &uhid->
waitq, wait);
544 .open = uhid_char_open,
545 .release = uhid_char_release,
546 .read = uhid_char_read,
547 .write = uhid_char_write,
548 .poll = uhid_char_poll,
558 static int __init uhid_init(
void)
563 static void __exit uhid_exit(
void)