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/device.h>
16 #include <linux/hid.h>
17 #include <linux/input.h>
18 #include <linux/miscdevice.h>
19 #include <linux/module.h>
20 #include <linux/mutex.h>
21 #include <linux/poll.h>
22 #include <linux/sched.h>
23 #include <linux/spinlock.h>
24 #include <linux/uhid.h>
25 #include <linux/wait.h>
27 #define UHID_NAME "uhid"
28 #define UHID_BUFSIZE 32
37 struct hid_device
*hid
;
38 struct uhid_event input_buf
;
40 wait_queue_head_t waitq
;
44 struct uhid_event
*outq
[UHID_BUFSIZE
];
47 static struct miscdevice uhid_misc
;
49 static void uhid_queue(struct uhid_device
*uhid
, struct uhid_event
*ev
)
53 newhead
= (uhid
->head
+ 1) % UHID_BUFSIZE
;
55 if (newhead
!= uhid
->tail
) {
56 uhid
->outq
[uhid
->head
] = ev
;
58 wake_up_interruptible(&uhid
->waitq
);
60 hid_warn(uhid
->hid
, "Output queue is full\n");
65 static int uhid_queue_event(struct uhid_device
*uhid
, __u32 event
)
68 struct uhid_event
*ev
;
70 ev
= kzalloc(sizeof(*ev
), GFP_KERNEL
);
76 spin_lock_irqsave(&uhid
->qlock
, flags
);
78 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
83 static int uhid_hid_start(struct hid_device
*hid
)
85 struct uhid_device
*uhid
= hid
->driver_data
;
87 return uhid_queue_event(uhid
, UHID_START
);
90 static void uhid_hid_stop(struct hid_device
*hid
)
92 struct uhid_device
*uhid
= hid
->driver_data
;
95 uhid_queue_event(uhid
, UHID_STOP
);
98 static int uhid_hid_open(struct hid_device
*hid
)
100 struct uhid_device
*uhid
= hid
->driver_data
;
102 return uhid_queue_event(uhid
, UHID_OPEN
);
105 static void uhid_hid_close(struct hid_device
*hid
)
107 struct uhid_device
*uhid
= hid
->driver_data
;
109 uhid_queue_event(uhid
, UHID_CLOSE
);
112 static int uhid_hid_input(struct input_dev
*input
, unsigned int type
,
113 unsigned int code
, int value
)
115 struct hid_device
*hid
= input_get_drvdata(input
);
116 struct uhid_device
*uhid
= hid
->driver_data
;
118 struct uhid_event
*ev
;
120 ev
= kzalloc(sizeof(*ev
), GFP_ATOMIC
);
124 ev
->type
= UHID_OUTPUT_EV
;
125 ev
->u
.output_ev
.type
= type
;
126 ev
->u
.output_ev
.code
= code
;
127 ev
->u
.output_ev
.value
= value
;
129 spin_lock_irqsave(&uhid
->qlock
, flags
);
130 uhid_queue(uhid
, ev
);
131 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
136 static int uhid_hid_parse(struct hid_device
*hid
)
138 struct uhid_device
*uhid
= hid
->driver_data
;
140 return hid_parse_report(hid
, uhid
->rd_data
, uhid
->rd_size
);
143 static int uhid_hid_get_raw(struct hid_device
*hid
, unsigned char rnum
,
144 __u8
*buf
, size_t count
, unsigned char rtype
)
149 static int uhid_hid_output_raw(struct hid_device
*hid
, __u8
*buf
, size_t count
,
150 unsigned char report_type
)
155 static struct hid_ll_driver uhid_hid_driver
= {
156 .start
= uhid_hid_start
,
157 .stop
= uhid_hid_stop
,
158 .open
= uhid_hid_open
,
159 .close
= uhid_hid_close
,
160 .hidinput_input_event
= uhid_hid_input
,
161 .parse
= uhid_hid_parse
,
164 static int uhid_dev_create(struct uhid_device
*uhid
,
165 const struct uhid_event
*ev
)
167 struct hid_device
*hid
;
173 uhid
->rd_size
= ev
->u
.create
.rd_size
;
174 if (uhid
->rd_size
<= 0 || uhid
->rd_size
> HID_MAX_DESCRIPTOR_SIZE
)
177 uhid
->rd_data
= kmalloc(uhid
->rd_size
, GFP_KERNEL
);
181 if (copy_from_user(uhid
->rd_data
, ev
->u
.create
.rd_data
,
187 hid
= hid_allocate_device();
193 strncpy(hid
->name
, ev
->u
.create
.name
, 127);
195 strncpy(hid
->phys
, ev
->u
.create
.phys
, 63);
197 strncpy(hid
->uniq
, ev
->u
.create
.uniq
, 63);
200 hid
->ll_driver
= &uhid_hid_driver
;
201 hid
->hid_get_raw_report
= uhid_hid_get_raw
;
202 hid
->hid_output_raw_report
= uhid_hid_output_raw
;
203 hid
->bus
= ev
->u
.create
.bus
;
204 hid
->vendor
= ev
->u
.create
.vendor
;
205 hid
->product
= ev
->u
.create
.product
;
206 hid
->version
= ev
->u
.create
.version
;
207 hid
->country
= ev
->u
.create
.country
;
208 hid
->driver_data
= uhid
;
209 hid
->dev
.parent
= uhid_misc
.this_device
;
212 uhid
->running
= true;
214 ret
= hid_add_device(hid
);
216 hid_err(hid
, "Cannot register HID device\n");
223 hid_destroy_device(hid
);
225 uhid
->running
= false;
227 kfree(uhid
->rd_data
);
231 static int uhid_dev_destroy(struct uhid_device
*uhid
)
236 uhid
->running
= false;
238 hid_destroy_device(uhid
->hid
);
239 kfree(uhid
->rd_data
);
244 static int uhid_dev_input(struct uhid_device
*uhid
, struct uhid_event
*ev
)
249 hid_input_report(uhid
->hid
, HID_INPUT_REPORT
, ev
->u
.input
.data
,
250 min_t(size_t, ev
->u
.input
.size
, UHID_DATA_MAX
), 0);
255 static int uhid_char_open(struct inode
*inode
, struct file
*file
)
257 struct uhid_device
*uhid
;
259 uhid
= kzalloc(sizeof(*uhid
), GFP_KERNEL
);
263 mutex_init(&uhid
->devlock
);
264 spin_lock_init(&uhid
->qlock
);
265 init_waitqueue_head(&uhid
->waitq
);
266 uhid
->running
= false;
268 file
->private_data
= uhid
;
269 nonseekable_open(inode
, file
);
274 static int uhid_char_release(struct inode
*inode
, struct file
*file
)
276 struct uhid_device
*uhid
= file
->private_data
;
279 uhid_dev_destroy(uhid
);
281 for (i
= 0; i
< UHID_BUFSIZE
; ++i
)
282 kfree(uhid
->outq
[i
]);
289 static ssize_t
uhid_char_read(struct file
*file
, char __user
*buffer
,
290 size_t count
, loff_t
*ppos
)
292 struct uhid_device
*uhid
= file
->private_data
;
297 /* they need at least the "type" member of uhid_event */
298 if (count
< sizeof(__u32
))
302 if (file
->f_flags
& O_NONBLOCK
) {
303 if (uhid
->head
== uhid
->tail
)
306 ret
= wait_event_interruptible(uhid
->waitq
,
307 uhid
->head
!= uhid
->tail
);
312 ret
= mutex_lock_interruptible(&uhid
->devlock
);
316 if (uhid
->head
== uhid
->tail
) {
317 mutex_unlock(&uhid
->devlock
);
320 len
= min(count
, sizeof(**uhid
->outq
));
321 if (copy_to_user(buffer
, &uhid
->outq
[uhid
->tail
], len
)) {
324 kfree(uhid
->outq
[uhid
->tail
]);
325 uhid
->outq
[uhid
->tail
] = NULL
;
327 spin_lock_irqsave(&uhid
->qlock
, flags
);
328 uhid
->tail
= (uhid
->tail
+ 1) % UHID_BUFSIZE
;
329 spin_unlock_irqrestore(&uhid
->qlock
, flags
);
333 mutex_unlock(&uhid
->devlock
);
334 return ret
? ret
: len
;
337 static ssize_t
uhid_char_write(struct file
*file
, const char __user
*buffer
,
338 size_t count
, loff_t
*ppos
)
340 struct uhid_device
*uhid
= file
->private_data
;
344 /* we need at least the "type" member of uhid_event */
345 if (count
< sizeof(__u32
))
348 ret
= mutex_lock_interruptible(&uhid
->devlock
);
352 memset(&uhid
->input_buf
, 0, sizeof(uhid
->input_buf
));
353 len
= min(count
, sizeof(uhid
->input_buf
));
354 if (copy_from_user(&uhid
->input_buf
, buffer
, len
)) {
359 switch (uhid
->input_buf
.type
) {
361 ret
= uhid_dev_create(uhid
, &uhid
->input_buf
);
364 ret
= uhid_dev_destroy(uhid
);
367 ret
= uhid_dev_input(uhid
, &uhid
->input_buf
);
374 mutex_unlock(&uhid
->devlock
);
376 /* return "count" not "len" to not confuse the caller */
377 return ret
? ret
: count
;
380 static unsigned int uhid_char_poll(struct file
*file
, poll_table
*wait
)
382 struct uhid_device
*uhid
= file
->private_data
;
384 poll_wait(file
, &uhid
->waitq
, wait
);
386 if (uhid
->head
!= uhid
->tail
)
387 return POLLIN
| POLLRDNORM
;
392 static const struct file_operations uhid_fops
= {
393 .owner
= THIS_MODULE
,
394 .open
= uhid_char_open
,
395 .release
= uhid_char_release
,
396 .read
= uhid_char_read
,
397 .write
= uhid_char_write
,
398 .poll
= uhid_char_poll
,
402 static struct miscdevice uhid_misc
= {
404 .minor
= MISC_DYNAMIC_MINOR
,
408 static int __init
uhid_init(void)
410 return misc_register(&uhid_misc
);
413 static void __exit
uhid_exit(void)
415 misc_deregister(&uhid_misc
);
418 module_init(uhid_init
);
419 module_exit(uhid_exit
);
420 MODULE_LICENSE("GPL");
421 MODULE_AUTHOR("David Herrmann <dh.herrmann@gmail.com>");
422 MODULE_DESCRIPTION("User-space I/O driver support for HID subsystem");