2 * User-space I/O driver support for HID subsystem
3 * Copyright (c) 2012 David Herrmann
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
13 #include <linux/atomic.h>
14 #include <linux/compat.h>
15 #include <linux/device.h>
17 #include <linux/hid.h>
18 #include <linux/input.h>
19 #include <linux/miscdevice.h>
20 #include <linux/module.h>
21 #include <linux/mutex.h>
22 #include <linux/poll.h>
23 #include <linux/sched.h>
24 #include <linux/spinlock.h>
25 #include <linux/uhid.h>
26 #include <linux/wait.h>
28 #define UHID_NAME "uhid"
29 #define UHID_BUFSIZE 32
38 struct hid_device
*hid
;
39 struct uhid_event input_buf
;
41 wait_queue_head_t waitq
;
45 struct uhid_event
*outq
[UHID_BUFSIZE
];
47 struct mutex report_lock
;
48 wait_queue_head_t report_wait
;
51 struct uhid_event report_buf
;
54 static struct miscdevice uhid_misc
;
56 static void uhid_queue(struct uhid_device
*uhid
, struct uhid_event
*ev
)
60 newhead
= (uhid
->head
+ 1) % UHID_BUFSIZE
;
62 if (newhead
!= uhid
->tail
) {
63 uhid
->outq
[uhid
->head
] = ev
;
65 wake_up_interruptible(&uhid
->waitq
);
67 hid_warn(uhid
->hid
, "Output queue is full\n");
72 static int uhid_queue_event(struct uhid_device
*uhid
, __u32 event
)
75 struct uhid_event
*ev
;
77 ev
= kzalloc(sizeof(*ev
), GFP_KERNEL
);
83 spin_lock_irqsave(&uhid
->qlock
, flags
);
85 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
90 static int uhid_hid_start(struct hid_device
*hid
)
92 struct uhid_device
*uhid
= hid
->driver_data
;
94 return uhid_queue_event(uhid
, UHID_START
);
97 static void uhid_hid_stop(struct hid_device
*hid
)
99 struct uhid_device
*uhid
= hid
->driver_data
;
102 uhid_queue_event(uhid
, UHID_STOP
);
105 static int uhid_hid_open(struct hid_device
*hid
)
107 struct uhid_device
*uhid
= hid
->driver_data
;
109 return uhid_queue_event(uhid
, UHID_OPEN
);
112 static void uhid_hid_close(struct hid_device
*hid
)
114 struct uhid_device
*uhid
= hid
->driver_data
;
116 uhid_queue_event(uhid
, UHID_CLOSE
);
119 static int uhid_hid_parse(struct hid_device
*hid
)
121 struct uhid_device
*uhid
= hid
->driver_data
;
123 return hid_parse_report(hid
, uhid
->rd_data
, uhid
->rd_size
);
126 static int uhid_hid_get_raw(struct hid_device
*hid
, unsigned char rnum
,
127 __u8
*buf
, size_t count
, unsigned char rtype
)
129 struct uhid_device
*uhid
= hid
->driver_data
;
131 struct uhid_event
*ev
;
134 size_t uninitialized_var(len
);
135 struct uhid_feature_answer_req
*req
;
141 case HID_FEATURE_REPORT
:
142 report_type
= UHID_FEATURE_REPORT
;
144 case HID_OUTPUT_REPORT
:
145 report_type
= UHID_OUTPUT_REPORT
;
147 case HID_INPUT_REPORT
:
148 report_type
= UHID_INPUT_REPORT
;
154 ret
= mutex_lock_interruptible(&uhid
->report_lock
);
158 ev
= kzalloc(sizeof(*ev
), GFP_KERNEL
);
164 spin_lock_irqsave(&uhid
->qlock
, flags
);
165 ev
->type
= UHID_FEATURE
;
166 ev
->u
.feature
.id
= atomic_inc_return(&uhid
->report_id
);
167 ev
->u
.feature
.rnum
= rnum
;
168 ev
->u
.feature
.rtype
= report_type
;
170 atomic_set(&uhid
->report_done
, 0);
171 uhid_queue(uhid
, ev
);
172 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
174 ret
= wait_event_interruptible_timeout(uhid
->report_wait
,
175 atomic_read(&uhid
->report_done
), 5 * HZ
);
178 * Make sure "uhid->running" is cleared on shutdown before
179 * "uhid->report_done" is set.
182 if (!ret
|| !uhid
->running
) {
184 } else if (ret
< 0) {
187 spin_lock_irqsave(&uhid
->qlock
, flags
);
188 req
= &uhid
->report_buf
.u
.feature_answer
;
195 min_t(size_t, req
->size
, UHID_DATA_MAX
));
196 memcpy(buf
, req
->data
, len
);
199 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
202 atomic_set(&uhid
->report_done
, 1);
205 mutex_unlock(&uhid
->report_lock
);
206 return ret
? ret
: len
;
209 static int uhid_hid_output_raw(struct hid_device
*hid
, __u8
*buf
, size_t count
,
210 unsigned char report_type
)
212 struct uhid_device
*uhid
= hid
->driver_data
;
215 struct uhid_event
*ev
;
217 switch (report_type
) {
218 case HID_FEATURE_REPORT
:
219 rtype
= UHID_FEATURE_REPORT
;
221 case HID_OUTPUT_REPORT
:
222 rtype
= UHID_OUTPUT_REPORT
;
228 if (count
< 1 || count
> UHID_DATA_MAX
)
231 ev
= kzalloc(sizeof(*ev
), GFP_KERNEL
);
235 ev
->type
= UHID_OUTPUT
;
236 ev
->u
.output
.size
= count
;
237 ev
->u
.output
.rtype
= rtype
;
238 memcpy(ev
->u
.output
.data
, buf
, count
);
240 spin_lock_irqsave(&uhid
->qlock
, flags
);
241 uhid_queue(uhid
, ev
);
242 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
247 static struct hid_ll_driver uhid_hid_driver
= {
248 .start
= uhid_hid_start
,
249 .stop
= uhid_hid_stop
,
250 .open
= uhid_hid_open
,
251 .close
= uhid_hid_close
,
252 .parse
= uhid_hid_parse
,
257 /* Apparently we haven't stepped on these rakes enough times yet. */
258 struct uhid_create_req_compat
{
263 compat_uptr_t rd_data
;
271 } __attribute__((__packed__
));
273 static int uhid_event_from_user(const char __user
*buffer
, size_t len
,
274 struct uhid_event
*event
)
276 if (is_compat_task()) {
279 if (get_user(type
, buffer
))
282 if (type
== UHID_CREATE
) {
284 * This is our messed up request with compat pointer.
285 * It is largish (more than 256 bytes) so we better
286 * allocate it from the heap.
288 struct uhid_create_req_compat
*compat
;
290 compat
= kzalloc(sizeof(*compat
), GFP_KERNEL
);
294 buffer
+= sizeof(type
);
296 if (copy_from_user(compat
, buffer
,
297 min(len
, sizeof(*compat
)))) {
302 /* Shuffle the data over to proper structure */
305 memcpy(event
->u
.create
.name
, compat
->name
,
306 sizeof(compat
->name
));
307 memcpy(event
->u
.create
.phys
, compat
->phys
,
308 sizeof(compat
->phys
));
309 memcpy(event
->u
.create
.uniq
, compat
->uniq
,
310 sizeof(compat
->uniq
));
312 event
->u
.create
.rd_data
= compat_ptr(compat
->rd_data
);
313 event
->u
.create
.rd_size
= compat
->rd_size
;
315 event
->u
.create
.bus
= compat
->bus
;
316 event
->u
.create
.vendor
= compat
->vendor
;
317 event
->u
.create
.product
= compat
->product
;
318 event
->u
.create
.version
= compat
->version
;
319 event
->u
.create
.country
= compat
->country
;
324 /* All others can be copied directly */
327 if (copy_from_user(event
, buffer
, min(len
, sizeof(*event
))))
333 static int uhid_event_from_user(const char __user
*buffer
, size_t len
,
334 struct uhid_event
*event
)
336 if (copy_from_user(event
, buffer
, min(len
, sizeof(*event
))))
343 static int uhid_dev_create(struct uhid_device
*uhid
,
344 const struct uhid_event
*ev
)
346 struct hid_device
*hid
;
352 uhid
->rd_size
= ev
->u
.create
.rd_size
;
353 if (uhid
->rd_size
<= 0 || uhid
->rd_size
> HID_MAX_DESCRIPTOR_SIZE
)
356 uhid
->rd_data
= kmalloc(uhid
->rd_size
, GFP_KERNEL
);
360 if (copy_from_user(uhid
->rd_data
, ev
->u
.create
.rd_data
,
366 hid
= hid_allocate_device();
372 strncpy(hid
->name
, ev
->u
.create
.name
, 127);
374 strncpy(hid
->phys
, ev
->u
.create
.phys
, 63);
376 strncpy(hid
->uniq
, ev
->u
.create
.uniq
, 63);
379 hid
->ll_driver
= &uhid_hid_driver
;
380 hid
->hid_get_raw_report
= uhid_hid_get_raw
;
381 hid
->hid_output_raw_report
= uhid_hid_output_raw
;
382 hid
->bus
= ev
->u
.create
.bus
;
383 hid
->vendor
= ev
->u
.create
.vendor
;
384 hid
->product
= ev
->u
.create
.product
;
385 hid
->version
= ev
->u
.create
.version
;
386 hid
->country
= ev
->u
.create
.country
;
387 hid
->driver_data
= uhid
;
388 hid
->dev
.parent
= uhid_misc
.this_device
;
391 uhid
->running
= true;
393 ret
= hid_add_device(hid
);
395 hid_err(hid
, "Cannot register HID device\n");
402 hid_destroy_device(hid
);
404 uhid
->running
= false;
406 kfree(uhid
->rd_data
);
410 static int uhid_dev_destroy(struct uhid_device
*uhid
)
415 /* clear "running" before setting "report_done" */
416 uhid
->running
= false;
418 atomic_set(&uhid
->report_done
, 1);
419 wake_up_interruptible(&uhid
->report_wait
);
421 hid_destroy_device(uhid
->hid
);
422 kfree(uhid
->rd_data
);
427 static int uhid_dev_input(struct uhid_device
*uhid
, struct uhid_event
*ev
)
432 hid_input_report(uhid
->hid
, HID_INPUT_REPORT
, ev
->u
.input
.data
,
433 min_t(size_t, ev
->u
.input
.size
, UHID_DATA_MAX
), 0);
438 static int uhid_dev_feature_answer(struct uhid_device
*uhid
,
439 struct uhid_event
*ev
)
446 spin_lock_irqsave(&uhid
->qlock
, flags
);
448 /* id for old report; drop it silently */
449 if (atomic_read(&uhid
->report_id
) != ev
->u
.feature_answer
.id
)
451 if (atomic_read(&uhid
->report_done
))
454 memcpy(&uhid
->report_buf
, ev
, sizeof(*ev
));
455 atomic_set(&uhid
->report_done
, 1);
456 wake_up_interruptible(&uhid
->report_wait
);
459 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
463 static int uhid_char_open(struct inode
*inode
, struct file
*file
)
465 struct uhid_device
*uhid
;
467 uhid
= kzalloc(sizeof(*uhid
), GFP_KERNEL
);
471 mutex_init(&uhid
->devlock
);
472 mutex_init(&uhid
->report_lock
);
473 spin_lock_init(&uhid
->qlock
);
474 init_waitqueue_head(&uhid
->waitq
);
475 init_waitqueue_head(&uhid
->report_wait
);
476 uhid
->running
= false;
477 atomic_set(&uhid
->report_done
, 1);
479 file
->private_data
= uhid
;
480 nonseekable_open(inode
, file
);
485 static int uhid_char_release(struct inode
*inode
, struct file
*file
)
487 struct uhid_device
*uhid
= file
->private_data
;
490 uhid_dev_destroy(uhid
);
492 for (i
= 0; i
< UHID_BUFSIZE
; ++i
)
493 kfree(uhid
->outq
[i
]);
500 static ssize_t
uhid_char_read(struct file
*file
, char __user
*buffer
,
501 size_t count
, loff_t
*ppos
)
503 struct uhid_device
*uhid
= file
->private_data
;
508 /* they need at least the "type" member of uhid_event */
509 if (count
< sizeof(__u32
))
513 if (file
->f_flags
& O_NONBLOCK
) {
514 if (uhid
->head
== uhid
->tail
)
517 ret
= wait_event_interruptible(uhid
->waitq
,
518 uhid
->head
!= uhid
->tail
);
523 ret
= mutex_lock_interruptible(&uhid
->devlock
);
527 if (uhid
->head
== uhid
->tail
) {
528 mutex_unlock(&uhid
->devlock
);
531 len
= min(count
, sizeof(**uhid
->outq
));
532 if (copy_to_user(buffer
, uhid
->outq
[uhid
->tail
], len
)) {
535 kfree(uhid
->outq
[uhid
->tail
]);
536 uhid
->outq
[uhid
->tail
] = NULL
;
538 spin_lock_irqsave(&uhid
->qlock
, flags
);
539 uhid
->tail
= (uhid
->tail
+ 1) % UHID_BUFSIZE
;
540 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
544 mutex_unlock(&uhid
->devlock
);
545 return ret
? ret
: len
;
548 static ssize_t
uhid_char_write(struct file
*file
, const char __user
*buffer
,
549 size_t count
, loff_t
*ppos
)
551 struct uhid_device
*uhid
= file
->private_data
;
555 /* we need at least the "type" member of uhid_event */
556 if (count
< sizeof(__u32
))
559 ret
= mutex_lock_interruptible(&uhid
->devlock
);
563 memset(&uhid
->input_buf
, 0, sizeof(uhid
->input_buf
));
564 len
= min(count
, sizeof(uhid
->input_buf
));
566 ret
= uhid_event_from_user(buffer
, len
, &uhid
->input_buf
);
570 switch (uhid
->input_buf
.type
) {
572 ret
= uhid_dev_create(uhid
, &uhid
->input_buf
);
575 ret
= uhid_dev_destroy(uhid
);
578 ret
= uhid_dev_input(uhid
, &uhid
->input_buf
);
580 case UHID_FEATURE_ANSWER
:
581 ret
= uhid_dev_feature_answer(uhid
, &uhid
->input_buf
);
588 mutex_unlock(&uhid
->devlock
);
590 /* return "count" not "len" to not confuse the caller */
591 return ret
? ret
: count
;
594 static unsigned int uhid_char_poll(struct file
*file
, poll_table
*wait
)
596 struct uhid_device
*uhid
= file
->private_data
;
598 poll_wait(file
, &uhid
->waitq
, wait
);
600 if (uhid
->head
!= uhid
->tail
)
601 return POLLIN
| POLLRDNORM
;
606 static const struct file_operations uhid_fops
= {
607 .owner
= THIS_MODULE
,
608 .open
= uhid_char_open
,
609 .release
= uhid_char_release
,
610 .read
= uhid_char_read
,
611 .write
= uhid_char_write
,
612 .poll
= uhid_char_poll
,
616 static struct miscdevice uhid_misc
= {
622 static int __init
uhid_init(void)
624 return misc_register(&uhid_misc
);
627 static void __exit
uhid_exit(void)
629 misc_deregister(&uhid_misc
);
632 module_init(uhid_init
);
633 module_exit(uhid_exit
);
634 MODULE_LICENSE("GPL");
635 MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>");
636 MODULE_DESCRIPTION("User-space I/O driver support for HID subsystem");
637 MODULE_ALIAS_MISCDEV(UHID_MINOR
);
638 MODULE_ALIAS("devname:" UHID_NAME
);