2 * f_hid.c -- USB HID function driver
4 * Copyright (C) 2010 Fabien Chouteau <fabien.chouteau@barco.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include <linux/kernel.h>
22 #include <linux/utsname.h>
23 #include <linux/module.h>
24 #include <linux/hid.h>
25 #include <linux/cdev.h>
26 #include <linux/mutex.h>
27 #include <linux/poll.h>
28 #include <linux/smp_lock.h>
29 #include <linux/uaccess.h>
30 #include <linux/wait.h>
31 #include <linux/usb/g_hid.h>
33 static int major
, minors
;
34 static struct class *hidg_class
;
36 /*-------------------------------------------------------------------------*/
37 /* HID gadget struct */
41 unsigned char bInterfaceSubClass
;
42 unsigned char bInterfaceProtocol
;
43 unsigned short report_desc_length
;
45 unsigned short report_length
;
48 char *set_report_buff
;
49 unsigned short set_report_length
;
51 wait_queue_head_t read_queue
;
56 wait_queue_head_t write_queue
;
57 struct usb_request
*req
;
61 struct usb_function func
;
63 struct usb_endpoint_descriptor
*fs_in_ep_desc
;
64 struct usb_endpoint_descriptor
*hs_in_ep_desc
;
67 static inline struct f_hidg
*func_to_hidg(struct usb_function
*f
)
69 return container_of(f
, struct f_hidg
, func
);
72 /*-------------------------------------------------------------------------*/
73 /* Static descriptors */
75 static struct usb_interface_descriptor hidg_interface_desc
= {
76 .bLength
= sizeof hidg_interface_desc
,
77 .bDescriptorType
= USB_DT_INTERFACE
,
78 /* .bInterfaceNumber = DYNAMIC */
79 .bAlternateSetting
= 0,
81 .bInterfaceClass
= USB_CLASS_HID
,
82 /* .bInterfaceSubClass = DYNAMIC */
83 /* .bInterfaceProtocol = DYNAMIC */
84 /* .iInterface = DYNAMIC */
87 static struct hid_descriptor hidg_desc
= {
88 .bLength
= sizeof hidg_desc
,
89 .bDescriptorType
= HID_DT_HID
,
92 .bNumDescriptors
= 0x1,
93 /*.desc[0].bDescriptorType = DYNAMIC */
94 /*.desc[0].wDescriptorLenght = DYNAMIC */
97 /* High-Speed Support */
99 static struct usb_endpoint_descriptor hidg_hs_in_ep_desc
= {
100 .bLength
= USB_DT_ENDPOINT_SIZE
,
101 .bDescriptorType
= USB_DT_ENDPOINT
,
102 .bEndpointAddress
= USB_DIR_IN
,
103 .bmAttributes
= USB_ENDPOINT_XFER_INT
,
104 /*.wMaxPacketSize = DYNAMIC */
105 .bInterval
= 4, /* FIXME: Add this field in the
106 * HID gadget configuration?
107 * (struct hidg_func_descriptor)
111 static struct usb_descriptor_header
*hidg_hs_descriptors
[] = {
112 (struct usb_descriptor_header
*)&hidg_interface_desc
,
113 (struct usb_descriptor_header
*)&hidg_desc
,
114 (struct usb_descriptor_header
*)&hidg_hs_in_ep_desc
,
118 /* Full-Speed Support */
120 static struct usb_endpoint_descriptor hidg_fs_in_ep_desc
= {
121 .bLength
= USB_DT_ENDPOINT_SIZE
,
122 .bDescriptorType
= USB_DT_ENDPOINT
,
123 .bEndpointAddress
= USB_DIR_IN
,
124 .bmAttributes
= USB_ENDPOINT_XFER_INT
,
125 /*.wMaxPacketSize = DYNAMIC */
126 .bInterval
= 10, /* FIXME: Add this field in the
127 * HID gadget configuration?
128 * (struct hidg_func_descriptor)
132 static struct usb_descriptor_header
*hidg_fs_descriptors
[] = {
133 (struct usb_descriptor_header
*)&hidg_interface_desc
,
134 (struct usb_descriptor_header
*)&hidg_desc
,
135 (struct usb_descriptor_header
*)&hidg_fs_in_ep_desc
,
139 /*-------------------------------------------------------------------------*/
142 static ssize_t
f_hidg_read(struct file
*file
, char __user
*buffer
,
143 size_t count
, loff_t
*ptr
)
145 struct f_hidg
*hidg
= file
->private_data
;
146 char *tmp_buff
= NULL
;
152 if (!access_ok(VERIFY_WRITE
, buffer
, count
))
155 spin_lock_irqsave(&hidg
->spinlock
, flags
);
157 #define READ_COND (hidg->set_report_buff != NULL)
160 spin_unlock_irqrestore(&hidg
->spinlock
, flags
);
161 if (file
->f_flags
& O_NONBLOCK
)
164 if (wait_event_interruptible(hidg
->read_queue
, READ_COND
))
167 spin_lock_irqsave(&hidg
->spinlock
, flags
);
171 count
= min_t(unsigned, count
, hidg
->set_report_length
);
172 tmp_buff
= hidg
->set_report_buff
;
173 hidg
->set_report_buff
= NULL
;
175 spin_unlock_irqrestore(&hidg
->spinlock
, flags
);
177 if (tmp_buff
!= NULL
) {
178 /* copy to user outside spinlock */
179 count
-= copy_to_user(buffer
, tmp_buff
, count
);
187 static void f_hidg_req_complete(struct usb_ep
*ep
, struct usb_request
*req
)
189 struct f_hidg
*hidg
= (struct f_hidg
*)ep
->driver_data
;
191 if (req
->status
!= 0) {
192 ERROR(hidg
->func
.config
->cdev
,
193 "End Point Request ERROR: %d\n", req
->status
);
196 hidg
->write_pending
= 0;
197 wake_up(&hidg
->write_queue
);
200 static ssize_t
f_hidg_write(struct file
*file
, const char __user
*buffer
,
201 size_t count
, loff_t
*offp
)
203 struct f_hidg
*hidg
= file
->private_data
;
204 ssize_t status
= -ENOMEM
;
206 if (!access_ok(VERIFY_READ
, buffer
, count
))
209 mutex_lock(&hidg
->lock
);
211 #define WRITE_COND (!hidg->write_pending)
214 while (!WRITE_COND
) {
215 mutex_unlock(&hidg
->lock
);
216 if (file
->f_flags
& O_NONBLOCK
)
219 if (wait_event_interruptible_exclusive(
220 hidg
->write_queue
, WRITE_COND
))
223 mutex_lock(&hidg
->lock
);
226 count
= min_t(unsigned, count
, hidg
->report_length
);
227 status
= copy_from_user(hidg
->req
->buf
, buffer
, count
);
230 ERROR(hidg
->func
.config
->cdev
,
231 "copy_from_user error\n");
232 mutex_unlock(&hidg
->lock
);
236 hidg
->req
->status
= 0;
238 hidg
->req
->length
= count
;
239 hidg
->req
->complete
= f_hidg_req_complete
;
240 hidg
->req
->context
= hidg
;
241 hidg
->write_pending
= 1;
243 status
= usb_ep_queue(hidg
->in_ep
, hidg
->req
, GFP_ATOMIC
);
245 ERROR(hidg
->func
.config
->cdev
,
246 "usb_ep_queue error on int endpoint %zd\n", status
);
247 hidg
->write_pending
= 0;
248 wake_up(&hidg
->write_queue
);
253 mutex_unlock(&hidg
->lock
);
258 static unsigned int f_hidg_poll(struct file
*file
, poll_table
*wait
)
260 struct f_hidg
*hidg
= file
->private_data
;
261 unsigned int ret
= 0;
263 poll_wait(file
, &hidg
->read_queue
, wait
);
264 poll_wait(file
, &hidg
->write_queue
, wait
);
267 ret
|= POLLOUT
| POLLWRNORM
;
270 ret
|= POLLIN
| POLLRDNORM
;
278 static int f_hidg_release(struct inode
*inode
, struct file
*fd
)
280 fd
->private_data
= NULL
;
284 static int f_hidg_open(struct inode
*inode
, struct file
*fd
)
286 struct f_hidg
*hidg
=
287 container_of(inode
->i_cdev
, struct f_hidg
, cdev
);
289 fd
->private_data
= hidg
;
294 /*-------------------------------------------------------------------------*/
297 static void hidg_set_report_complete(struct usb_ep
*ep
, struct usb_request
*req
)
299 struct f_hidg
*hidg
= (struct f_hidg
*)req
->context
;
301 if (req
->status
!= 0 || req
->buf
== NULL
|| req
->actual
== 0) {
302 ERROR(hidg
->func
.config
->cdev
, "%s FAILED\n", __func__
);
306 spin_lock(&hidg
->spinlock
);
308 hidg
->set_report_buff
= krealloc(hidg
->set_report_buff
,
309 req
->actual
, GFP_ATOMIC
);
311 if (hidg
->set_report_buff
== NULL
) {
312 spin_unlock(&hidg
->spinlock
);
315 hidg
->set_report_length
= req
->actual
;
316 memcpy(hidg
->set_report_buff
, req
->buf
, req
->actual
);
318 spin_unlock(&hidg
->spinlock
);
320 wake_up(&hidg
->read_queue
);
325 static int hidg_setup(struct usb_function
*f
,
326 const struct usb_ctrlrequest
*ctrl
)
328 struct f_hidg
*hidg
= func_to_hidg(f
);
329 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
330 struct usb_request
*req
= cdev
->req
;
334 value
= __le16_to_cpu(ctrl
->wValue
);
335 length
= __le16_to_cpu(ctrl
->wLength
);
337 VDBG(cdev
, "hid_setup crtl_request : bRequestType:0x%x bRequest:0x%x "
338 "Value:0x%x\n", ctrl
->bRequestType
, ctrl
->bRequest
, value
);
340 switch ((ctrl
->bRequestType
<< 8) | ctrl
->bRequest
) {
341 case ((USB_DIR_IN
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
) << 8
342 | HID_REQ_GET_REPORT
):
343 VDBG(cdev
, "get_report\n");
345 /* send an empty report */
346 length
= min_t(unsigned, length
, hidg
->report_length
);
347 memset(req
->buf
, 0x0, length
);
352 case ((USB_DIR_IN
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
) << 8
353 | HID_REQ_GET_PROTOCOL
):
354 VDBG(cdev
, "get_protocol\n");
358 case ((USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
) << 8
359 | HID_REQ_SET_REPORT
):
360 VDBG(cdev
, "set_report | wLenght=%d\n", ctrl
->wLength
);
362 req
->complete
= hidg_set_report_complete
;
366 case ((USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
) << 8
367 | HID_REQ_SET_PROTOCOL
):
368 VDBG(cdev
, "set_protocol\n");
372 case ((USB_DIR_IN
| USB_TYPE_STANDARD
| USB_RECIP_INTERFACE
) << 8
373 | USB_REQ_GET_DESCRIPTOR
):
374 switch (value
>> 8) {
376 VDBG(cdev
, "USB_REQ_GET_DESCRIPTOR: REPORT\n");
377 length
= min_t(unsigned short, length
,
378 hidg
->report_desc_length
);
379 memcpy(req
->buf
, hidg
->report_desc
, length
);
384 VDBG(cdev
, "Unknown decriptor request 0x%x\n",
392 VDBG(cdev
, "Unknown request 0x%x\n",
403 req
->length
= length
;
404 status
= usb_ep_queue(cdev
->gadget
->ep0
, req
, GFP_ATOMIC
);
406 ERROR(cdev
, "usb_ep_queue error on ep0 %d\n", value
);
410 static void hidg_disable(struct usb_function
*f
)
412 struct f_hidg
*hidg
= func_to_hidg(f
);
414 usb_ep_disable(hidg
->in_ep
);
415 hidg
->in_ep
->driver_data
= NULL
;
420 static int hidg_set_alt(struct usb_function
*f
, unsigned intf
, unsigned alt
)
422 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
423 struct f_hidg
*hidg
= func_to_hidg(f
);
424 const struct usb_endpoint_descriptor
*ep_desc
;
427 VDBG(cdev
, "hidg_set_alt intf:%d alt:%d\n", intf
, alt
);
429 if (hidg
->in_ep
!= NULL
) {
430 /* restart endpoint */
431 if (hidg
->in_ep
->driver_data
!= NULL
)
432 usb_ep_disable(hidg
->in_ep
);
434 ep_desc
= ep_choose(f
->config
->cdev
->gadget
,
435 hidg
->hs_in_ep_desc
, hidg
->fs_in_ep_desc
);
436 status
= usb_ep_enable(hidg
->in_ep
, ep_desc
);
438 ERROR(cdev
, "Enable endpoint FAILED!\n");
441 hidg
->in_ep
->driver_data
= hidg
;
447 const struct file_operations f_hidg_fops
= {
448 .owner
= THIS_MODULE
,
450 .release
= f_hidg_release
,
451 .write
= f_hidg_write
,
456 static int __init
hidg_bind(struct usb_configuration
*c
, struct usb_function
*f
)
459 struct f_hidg
*hidg
= func_to_hidg(f
);
463 /* allocate instance-specific interface IDs, and patch descriptors */
464 status
= usb_interface_id(c
, f
);
467 hidg_interface_desc
.bInterfaceNumber
= status
;
470 /* allocate instance-specific endpoints */
472 ep
= usb_ep_autoconfig(c
->cdev
->gadget
, &hidg_fs_in_ep_desc
);
475 ep
->driver_data
= c
->cdev
; /* claim */
478 /* preallocate request and buffer */
480 hidg
->req
= usb_ep_alloc_request(hidg
->in_ep
, GFP_KERNEL
);
485 hidg
->req
->buf
= kmalloc(hidg
->report_length
, GFP_KERNEL
);
489 /* set descriptor dynamic values */
490 hidg_interface_desc
.bInterfaceSubClass
= hidg
->bInterfaceSubClass
;
491 hidg_interface_desc
.bInterfaceProtocol
= hidg
->bInterfaceProtocol
;
492 hidg_hs_in_ep_desc
.wMaxPacketSize
= cpu_to_le16(hidg
->report_length
);
493 hidg_fs_in_ep_desc
.wMaxPacketSize
= cpu_to_le16(hidg
->report_length
);
494 hidg_desc
.desc
[0].bDescriptorType
= HID_DT_REPORT
;
495 hidg_desc
.desc
[0].wDescriptorLength
=
496 cpu_to_le16(hidg
->report_desc_length
);
498 hidg
->set_report_buff
= NULL
;
500 /* copy descriptors */
501 f
->descriptors
= usb_copy_descriptors(hidg_fs_descriptors
);
505 hidg
->fs_in_ep_desc
= usb_find_endpoint(hidg_fs_descriptors
,
507 &hidg_fs_in_ep_desc
);
509 if (gadget_is_dualspeed(c
->cdev
->gadget
)) {
510 hidg_hs_in_ep_desc
.bEndpointAddress
=
511 hidg_fs_in_ep_desc
.bEndpointAddress
;
512 f
->hs_descriptors
= usb_copy_descriptors(hidg_hs_descriptors
);
513 if (!f
->hs_descriptors
)
515 hidg
->hs_in_ep_desc
= usb_find_endpoint(hidg_hs_descriptors
,
517 &hidg_hs_in_ep_desc
);
519 hidg
->hs_in_ep_desc
= NULL
;
522 mutex_init(&hidg
->lock
);
523 spin_lock_init(&hidg
->spinlock
);
524 init_waitqueue_head(&hidg
->write_queue
);
525 init_waitqueue_head(&hidg
->read_queue
);
527 /* create char device */
528 cdev_init(&hidg
->cdev
, &f_hidg_fops
);
529 dev
= MKDEV(major
, hidg
->minor
);
530 status
= cdev_add(&hidg
->cdev
, dev
, 1);
534 device_create(hidg_class
, NULL
, dev
, NULL
, "%s%d", "hidg", hidg
->minor
);
539 ERROR(f
->config
->cdev
, "hidg_bind FAILED\n");
540 if (hidg
->req
!= NULL
) {
541 kfree(hidg
->req
->buf
);
542 if (hidg
->in_ep
!= NULL
)
543 usb_ep_free_request(hidg
->in_ep
, hidg
->req
);
546 usb_free_descriptors(f
->hs_descriptors
);
547 usb_free_descriptors(f
->descriptors
);
552 static void hidg_unbind(struct usb_configuration
*c
, struct usb_function
*f
)
554 struct f_hidg
*hidg
= func_to_hidg(f
);
556 device_destroy(hidg_class
, MKDEV(major
, hidg
->minor
));
557 cdev_del(&hidg
->cdev
);
559 /* disable/free request and end point */
560 usb_ep_disable(hidg
->in_ep
);
561 usb_ep_dequeue(hidg
->in_ep
, hidg
->req
);
562 kfree(hidg
->req
->buf
);
563 usb_ep_free_request(hidg
->in_ep
, hidg
->req
);
565 /* free descriptors copies */
566 usb_free_descriptors(f
->hs_descriptors
);
567 usb_free_descriptors(f
->descriptors
);
569 kfree(hidg
->report_desc
);
570 kfree(hidg
->set_report_buff
);
574 /*-------------------------------------------------------------------------*/
577 #define CT_FUNC_HID_IDX 0
579 static struct usb_string ct_func_string_defs
[] = {
580 [CT_FUNC_HID_IDX
].s
= "HID Interface",
581 {}, /* end of list */
584 static struct usb_gadget_strings ct_func_string_table
= {
585 .language
= 0x0409, /* en-US */
586 .strings
= ct_func_string_defs
,
589 static struct usb_gadget_strings
*ct_func_strings
[] = {
590 &ct_func_string_table
,
594 /*-------------------------------------------------------------------------*/
595 /* usb_configuration */
597 int __init
hidg_bind_config(struct usb_configuration
*c
,
598 struct hidg_func_descriptor
*fdesc
, int index
)
606 /* maybe allocate device-global string IDs, and patch descriptors */
607 if (ct_func_string_defs
[CT_FUNC_HID_IDX
].id
== 0) {
608 status
= usb_string_id(c
->cdev
);
611 ct_func_string_defs
[CT_FUNC_HID_IDX
].id
= status
;
612 hidg_interface_desc
.iInterface
= status
;
615 /* allocate and initialize one new instance */
616 hidg
= kzalloc(sizeof *hidg
, GFP_KERNEL
);
621 hidg
->bInterfaceSubClass
= fdesc
->subclass
;
622 hidg
->bInterfaceProtocol
= fdesc
->protocol
;
623 hidg
->report_length
= fdesc
->report_length
;
624 hidg
->report_desc_length
= fdesc
->report_desc_length
;
625 hidg
->report_desc
= kmemdup(fdesc
->report_desc
,
626 fdesc
->report_desc_length
,
628 if (!hidg
->report_desc
) {
633 hidg
->func
.name
= "hid";
634 hidg
->func
.strings
= ct_func_strings
;
635 hidg
->func
.bind
= hidg_bind
;
636 hidg
->func
.unbind
= hidg_unbind
;
637 hidg
->func
.set_alt
= hidg_set_alt
;
638 hidg
->func
.disable
= hidg_disable
;
639 hidg
->func
.setup
= hidg_setup
;
641 status
= usb_add_function(c
, &hidg
->func
);
648 int __init
ghid_setup(struct usb_gadget
*g
, int count
)
653 hidg_class
= class_create(THIS_MODULE
, "hidg");
655 status
= alloc_chrdev_region(&dev
, 0, count
, "hidg");
664 void ghid_cleanup(void)
667 unregister_chrdev_region(MKDEV(major
, 0), minors
);
671 class_destroy(hidg_class
);