1 /*
2 ********************************************************************************
3 * USB Hid Driver
4 *
5 * (c) Copyright 2006-2010, All winners Co,Ld.
6 * All Right Reserved
7 *
8 * FileName : Hid.c
9 *
10 * Author : Javen
11 *
12 * Date : 2010/06/02
13 *
14 * Description : Hid Driver中对USB接口设备的处理
15 *
16 * Others : NULL
17 *
18 * History:
19 * <time> <author> <version > <desc>
20 * 2010.06.02 Javen 1.0 build this file
21 *
22 ********************************************************************************
23 */
24 //#include "usb_host_config.h"
25 //#include "usb_host_base_types.h"
26 #include "usb_os_platform.h"
27 #include "error.h"
28
29 #include "usb_utils_find_zero_bit.h"
30 #include "usb_list.h"
31 #include "urb.h"
32 #include "list_head_ext.h"
33 #include "usb_host_common.h"
34 #include "usb_gen_dev_mod.h"
35 #include "usb_core_interface.h"
36 #include "usb_msg.h"
37 #include "HidSpec.h"
38 #include "Hid.h"
39 #include "Hid_i.h"
40 #include "HidTransport.h"
41 #include "HidProtocol.h"
42 #include "HidFunDrv.h"
43
44 #define HID_DRV_NAME "HID Class"
45 #define HID_DRV_AUTHOR "Host Driver Author"
46 #if 0
47 #define DMSG_HID_TEST hal_log_info
48 #else
49 #define DMSG_HID_TEST(...)
50 #endif
51
52 //---------------------------------------------------------------
53 // 宏定义区
54 //---------------------------------------------------------------
55
56 //---------------------------------------------------------------
57 // 全局变量区
58 //---------------------------------------------------------------
59 static struct usb_host_func_drv HidDrv;
60 static u32 HidDev_id_array; /* 记录了设备的编号 */
61
62 static struct usb_drv_dev_match_table Hid_match_table[] = {
63 {
64 USB_DEVICE_ID_MATCH_INT_CLASS, //match_flags;
65
66 0, //idVendor;
67 0, //idProduct;
68 0, //bcdDevice_lo;
69 0, //bcdDevice_hi;
70
71 //Used for device class matches
72 0, //bDeviceClass;
73 0, //bDeviceSubClass;
74 0, //bDeviceProtocol;
75
76 //Used for interface class matches
77 USB_CLASS_HID, //bInterfaceClass;
78 0, //bInterfaceSubClass;
79 0, //bInterfaceProtocol;
80
81 //not matched against
82 0, //driver_info;
83 },
84
85 {
86 0, //match_flags;
87
88 0, //idVendor;
89 0, //idProduct;
90 0, //bcdDevice_lo;
91 0, //bcdDevice_hi;
92
93 //Used for device class matches
94 0, //bDeviceClass;
95 0, //bDeviceSubClass;
96 0, //bDeviceProtocol;
97
98 //Used for interface class matches
99 0, //bInterfaceClass;
100 0, //bInterfaceSubClass;
101 0, //bInterfaceProtocol;
102
103 //not matched against
104 0, //driver_info;
105 }/* Terminating entry */
106 };
107
108 //---------------------------------------------------------------
109 // 函数区定义区
110 //---------------------------------------------------------------
111
112 /*
113 *******************************************************************************
114 * get_HidDev_id
115 *
116 * Description:
117 * 给新插入的设备分配ID
118 *
119 * Parameters:
120 * void
121 *
122 * Return value:
123 * 返回分配的ID
124 *
125 * note:
126 * 无
127 *
128 *******************************************************************************
129 */
get_HidDev_id(void)130 static unsigned int get_HidDev_id(void)
131 {
132 unsigned int bit = 0;
133
134 bit = find_next_zero_bit((const volatile u32 *)&HidDev_id_array, (1 * 32), 0);
135 if(bit > 32){
136 hal_log_err("ERR: find_next_zero_bit failed\n");
137 return 31;
138 }
139
140 usb_set_bit(bit, (volatile uint32_t *)&HidDev_id_array);
141
142 return bit;
143 }
144
145 /*
146 *******************************************************************************
147 * free_HidDev_id
148 *
149 * Description:
150 * 释放分配的ID
151 *
152 * Parameters:
153 * bit : input. mscDev的ID号
154 *
155 * Return value:
156 * 0 :成功
157 * !0 :失败
158 *
159 * note:
160 * 无
161 *
162 *******************************************************************************
163 */
free_HidDev_id(unsigned int bit)164 static int free_HidDev_id(unsigned int bit)
165 {
166 if(usb_test_bit(bit, (volatile uint32_t *)&HidDev_id_array) == 0){
167 hal_log_err("ERR: free_host_id: invalid bit(%d)\n", bit);
168 return -1;
169 }
170
171 /* 回收该位 */
172 usb_clear_bit(bit, (volatile uint32_t *)&HidDev_id_array);
173
174 return 0;
175 }
176
177 /*
178 *******************************************************************************
179 * HidDevInit
180 *
181 * Description:
182 *
183 *
184 * Parameters:
185 *
186 *
187 * Return value:
188 *
189 *
190 * note:
191 * 无
192 *
193 *******************************************************************************
194 */
HidDevInit(HidDev_t * HidDev,struct usb_interface * intf)195 static int HidDevInit(HidDev_t *HidDev, struct usb_interface *intf)
196 {
197 int ret = 0;
198
199 if(HidDev == NULL || intf == NULL){
200 hal_log_err("ERR: HidDevInit: input error\n");
201 return USB_ERR_BAD_ARGUMENTS;
202 }
203
204 HidDev->pusb_dev = usb_mod_interface_to_usbdev(intf);
205 if(HidDev->pusb_dev == NULL){
206 hal_log_err("ERR: HidDevInit: HidDev->pusb_dev == NULL\n");
207 return USB_ERR_BAD_ARGUMENTS;
208 }
209
210 HidDev->pusb_intf = intf;
211 HidDev->DevNo = get_HidDev_id();
212
213 /* Store our private data in the interface */
214 usb_mod_usb_set_intf_priv_data(intf, (void *)HidDev);
215
216 /* alloc urb */
217 HidDev->CurrentUrb = usb_alloc_urb(0);
218 if(HidDev->CurrentUrb == NULL){
219 hal_log_err("ERR: HidDevInit: usb_alloc_urb failed\n");
220 return USB_ERR_ALLOC_URB_FAILED;
221 }
222
223 HidDev->CtrlReq = (struct usb_ctrlrequest *)usb_buffer_alloc(HidDev->pusb_dev,
224 sizeof(struct usb_ctrlrequest),
225 0,
226 NULL);
227 if(HidDev->CtrlReq == NULL){
228 hal_log_err("ERR: usb_buffer_alloc CtrlReq failed\n");
229 ret = USB_ERR_MALLOC_FAILED;
230 goto error0;
231 }
232
233 HidDev->ReportDesc = (unsigned char *)hal_malloc(USB_HID_MAX_DESCRIPTOR_SIZE);
234 if(HidDev->ReportDesc == NULL){
235 hal_log_err("ERR: hal_malloc failed\n");
236 goto error1;
237 }
238
239 HidDev->UrbWait = hal_sem_create(0);
240 if(HidDev->UrbWait == NULL){
241 hal_log_err("ERR: USB_OS_SemCreate UrbWait failed\n");
242 ret = USB_ERR_CREATE_SIME_FAILED;
243 goto error2;
244 }
245
246 return USB_ERR_SUCCESS;
247
248 error2:
249 hal_free(HidDev->ReportDesc);
250 HidDev->ReportDesc = NULL;
251
252 error1:
253 usb_buffer_free(HidDev->pusb_dev, sizeof(struct usb_ctrlrequest), (void *)(HidDev->CtrlReq), 0);
254 HidDev->CtrlReq = NULL;
255
256 error0:
257 usb_free_urb(HidDev->CurrentUrb);
258 HidDev->CurrentUrb = NULL;
259
260 return ret;
261 }
262
263 /*
264 *******************************************************************************
265 * HidDevFree
266 *
267 * Description:
268 *
269 *
270 * Parameters:
271 *
272 *
273 * Return value:
274 *
275 *
276 * note:
277 * 无
278 *
279 *******************************************************************************
280 */
HidDevFree(HidDev_t * HidDev)281 static int HidDevFree(HidDev_t *HidDev)
282 {
283 unsigned char err = 0;
284
285 if(HidDev == NULL){
286 hal_log_err("ERR: input error\n");
287 return USB_ERR_BAD_ARGUMENTS;
288 }
289
290 if(HidDev->CurrentUrb){
291 usb_free_urb(HidDev->CurrentUrb);
292 HidDev->CurrentUrb = NULL;
293 }
294
295 if(HidDev->CtrlReq){
296 usb_buffer_free(HidDev->pusb_dev, sizeof(struct usb_ctrlrequest), (void *)(HidDev->CtrlReq), 0);
297 HidDev->CtrlReq = NULL;
298 }
299
300 if(HidDev->ReportDesc){
301 hal_free(HidDev->ReportDesc);
302 }
303
304 if(HidDev->UrbWait){
305 hal_sem_delete(HidDev->UrbWait);
306 HidDev->UrbWait = NULL;
307 }
308
309 /* Remove our private data from the interface */
310 usb_mod_usb_set_intf_priv_data(HidDev->pusb_intf, NULL);
311
312 free_HidDev_id(HidDev->DevNo);
313
314 return 0;
315 }
316
317 /*
318 *******************************************************************************
319 * HidGetDeviceInfo
320 *
321 * Description:
322 *
323 *
324 * Parameters:
325 *
326 *
327 * Return value:
328 * 无
329 *
330 * note:
331 * 无
332 *
333 *******************************************************************************
334 */
HidGetDeviceInfo(HidDev_t * HidDev,unsigned int index)335 static void HidGetDeviceInfo(HidDev_t *HidDev, unsigned int index)
336 {
337 struct usb_interface_descriptor *idesc = &(HidDev->pusb_intf->cur_altsetting->desc);
338
339 HidDev->InterfaceNo = idesc->bInterfaceNumber;
340 HidDev->SubClass = idesc->bInterfaceSubClass;
341 HidDev->Protocol = idesc->bInterfaceProtocol;
342
343 return;
344 }
345
346 /*
347 *******************************************************************************
348 * HidGetTransport
349 *
350 * Description:
351 *
352 *
353 * Parameters:
354 *
355 *
356 * Return value:
357 *
358 *
359 * note:
360 * 无
361 *
362 *******************************************************************************
363 */
HidGetTransport(HidDev_t * HidDev)364 static int HidGetTransport(HidDev_t *HidDev)
365 {
366 HidDev->ResetRecovery = HidResetRecovery;
367 HidDev->SoftReset = HidSoftReset;
368 HidDev->Transport = HidTransport;
369 HidDev->StopTransport = HidStopTransport;
370
371 return USB_ERR_SUCCESS;
372 }
373
374 /*
375 *******************************************************************************
376 * HidCreatePipes
377 *
378 * Description:
379 *
380 *
381 * Parameters:
382 *
383 *
384 * Return value:
385 *
386 *
387 * note:
388 * 无
389 *
390 *******************************************************************************
391 */
HidCreatePipes(HidDev_t * HidDev)392 static int HidCreatePipes(HidDev_t *HidDev)
393 {
394 struct usb_host_virt_interface *altsetting = HidDev->pusb_intf->cur_altsetting;
395 struct usb_endpoint_descriptor *ep = NULL;
396 struct usb_endpoint_descriptor *ep_int = NULL;
397 int i = 0;
398
399 for (i = 0; i < altsetting->desc.bNumEndpoints; i++) {
400 ep = &altsetting->endpoint[i].desc;
401
402 /* Is it an interrupt endpoint? */
403 if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
404 ep_int = ep;
405 }
406 }
407
408 if(ep_int == NULL){
409 hal_log_err("HidCreatePipes: Endpoint sanity check failed! Rejecting dev.\n");
410 return USB_ERR_UNKOWN_ERROR;
411 }
412
413 /* create ctrl and int pipes */
414 HidDev->CtrlOut = usb_sndctrlpipe(HidDev->pusb_dev, 0);
415 HidDev->CtrlIn = usb_rcvctrlpipe(HidDev->pusb_dev, 0);
416 HidDev->IntIn = usb_rcvintpipe(HidDev->pusb_dev,
417 ep_int->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
418 HidDev->EpInterval = ep_int->bInterval;
419 HidDev->OnceTransferLength = ep_int->wMaxPacketSize;
420
421 return USB_ERR_SUCCESS;
422 }
423
424 /*
425 *******************************************************************************
426 * HidSetDeviceState
427 *
428 * Description:
429 *
430 *
431 * Parameters:
432 *
433 *
434 * Return value:
435 *
436 *
437 * note:
438 * 无
439 *
440 *******************************************************************************
441 */
HidSetDeviceState(HidDev_t * HidDev,HidDev_State_t state)442 void HidSetDeviceState(HidDev_t *HidDev, HidDev_State_t state)
443 {
444 unsigned int cup_sr = 0;
445
446 ENTER_CRITICAL(cup_sr);
447 HidDev->State = state;
448 EXIT_CRITICAL(cup_sr);
449 }
450
451 /*
452 *******************************************************************************
453 * HidParseReport
454 *
455 * Description:
456 *
457 *
458 * Parameters:
459 *
460 *
461 * Return value:
462 *
463 *
464 * note:
465 * 无
466 *
467 *******************************************************************************
468 */
HidGetInputReport(HidDev_t * HidDev,unsigned int Usagepage,unsigned int Usage,unsigned int * BitOffset,unsigned int * BitCount)469 int HidGetInputReport(HidDev_t *HidDev,
470 unsigned int Usagepage,
471 unsigned int Usage,
472 unsigned int *BitOffset,
473 unsigned int *BitCount)
474 {
475 usbHidReportEnum_t *InputReport = NULL;
476 usbHidReport_t *Report = NULL;
477 usbHidField_t *Field = NULL;
478 usbHidUsage_t *ReportUsage = NULL;
479 unsigned int Offset_ReportId = 0; /* 如果有ReportId, 那么data[0]就不能够算在BitOffset里 */
480 unsigned int i = 0;
481 unsigned int j = 0;
482 unsigned int k = 0;
483
484 InputReport = HidDev->HidReportEnum + USB_HID_REPORT_INPUT;
485 if(InputReport == NULL){
486 hal_log_err("ERR: InputReport is NULL\n");
487 return USB_ERR_BAD_ARGUMENTS;
488 }
489
490 /* Device uses numbered reports, data[0] is report number */
491 if(InputReport->numbered){
492 Offset_ReportId = 8;
493 }
494 hal_log_info("InputReport ReportNum = %d\n", InputReport->ReportNum);
495
496 /* report */
497 for(i = 0; i < InputReport->ReportNum; i++){
498 Report = InputReport->Report[i];
499 if(Report == NULL){
500 hal_log_err("ERR: Report is NULL\n");
501 continue;
502 }
503
504 /* field */
505 for(j = 0; j < Report->Maxfield; j++){
506 Field = Report->Field[j];
507 if(Field == NULL){
508 hal_log_err("ERR: Field is NULL\n");
509 continue;
510 }
511
512 /* Usage */
513 for(k = 0; k < Field->maxusage; k++){
514 ReportUsage = &Field->usage[k];
515 if(ReportUsage == NULL){
516 hal_log_err("ERR: Usage is NULL\n");
517 continue;
518 }
519
520 if(Usage == USB_HID_GENERIC_DESKTOP_PAGE_UNDEFINED){
521 if(((ReportUsage->hid >> 16) & 0xffff) == Usagepage){
522 DMSG_HID_TEST("Find Bitmap: Usage(%x), Id = %d, report_offset = %d, report_size = %d\n",
523 Usagepage, ((Offset_ReportId == 0) ? 0 : 1),
524 Field->report_offset, (Field->report_size * k));
525 *BitOffset = Offset_ReportId + Field->report_offset + (Field->report_size * k);
526 *BitCount = Field->report_size * Field->report_count;
527
528 DMSG_HID_TEST("Usage(%x), BitOffset = %d, BitCount = %d\n",
529 Usagepage, *BitOffset, *BitCount);
530
531 return USB_ERR_SUCCESS;
532 }
533 }else{
534 if(ReportUsage->hid == ((Usagepage << 16) | Usage)){
535 DMSG_HID_TEST("Find Bitmap: usage(%x, %x), Id = %d, report_offset = %d, report_size = %d\n",
536 Usagepage, Usage, ((Offset_ReportId == 0) ? 0 : 1),
537 Field->report_offset, (Field->report_size * k));
538 *BitOffset = Offset_ReportId + Field->report_offset + (Field->report_size * k);
539 *BitCount = Field->report_size;
540
541 DMSG_HID_TEST("usage(%x, %x), BitOffset = %d, BitCount = %d\n",
542 Usagepage, Usage, *BitOffset, *BitCount);
543
544 return USB_ERR_SUCCESS;
545 }
546 }
547 }
548 }
549 }
550
551 return USB_ERR_UNKOWN_ERROR;
552 }
553
554
555 /*
556 *******************************************************************************
557 * HidDevScan
558 *
559 * Description:
560 *
561 *
562 * Parameters:
563 *
564 *
565 * Return value:
566 *
567 *
568 * note:
569 * 无
570 *
571 *******************************************************************************
572 */
HidDevScan(HidDev_t * HidDev)573 static int HidDevScan(HidDev_t *HidDev)
574 {
575 struct usb_host_virt_interface *cur_alt = NULL;
576 usbHidDescriptor_t *HidDesc = NULL;
577 int ret = 0;
578 unsigned int i = 0;
579
580 if(HidDev == NULL){
581 hal_log_err("ERR: HidDevScan: input error\n");
582 return USB_ERR_BAD_ARGUMENTS;
583 }
584
585 /* initalize parameter */
586 cur_alt = HidDev->pusb_intf->cur_altsetting;
587
588 /* get device type */
589 HidDev->DevType = cur_alt->desc.bInterfaceProtocol;
590
591 /* Get Hid descriptor */
592 if (usb_get_extra_descriptor(cur_alt, USB_HID_DT_HID, &HidDesc)
593 &&(!cur_alt->desc.bNumEndpoints
594 || usb_get_extra_descriptor(&(cur_alt->endpoint[0]), USB_HID_DT_HID, &HidDesc))){
595 hal_log_err("ERR: class descriptor not present\n");
596 return USB_ERR_UNKOWN_ERROR;
597 }
598
599 /* 获得report返回的数据长度 */
600 for (i = 0; i < HidDesc->bNumDescriptors; i++){
601 if (HidDesc->desc[i].bDescriptorType == USB_HID_DT_REPORT){
602 HidDev->ReportSize = le16_to_cpu(HidDesc->desc[i].wDescriptorLength);
603 break;
604 }
605 }
606
607 if (HidDev->ReportSize == 0 || HidDev->ReportSize > USB_HID_MAX_DESCRIPTOR_SIZE) {
608 hal_log_err("ERR: weird size of report descriptor (%u)\n", HidDev->ReportSize);
609 return USB_ERR_UNKOWN_ERROR;
610 }
611
612 /* set idle request, 限制了report的频率 */
613 HidSetIlde(HidDev, HidDev->InterfaceNo, 0, 0);
614
615 /* Get Hid Report descriptor */
616 ret = HidGetClassDescriptor(HidDev,
617 HidDev->InterfaceNo,
618 USB_HID_DT_REPORT,
619 (void *)HidDev->ReportDesc,
620 HidDev->ReportSize);
621 if(ret != USB_ERR_SUCCESS){
622 hal_log_err("ERR: HidGetClassDescriptor failed\n");
623 return USB_ERR_COMMAND_EXECUTE_FAILED;
624 }
625
626 /* parse Hid Report descriptor */
627 HidParseReport(HidDev->ReportDesc, HidDev->ReportSize, HidDev);
628
629 /* Client probe */
630 switch(HidDev->DevType){
631 case USB_HID_PROTOCOL_MOUSE:
632 HidDev->ClientProbe = usbMouseProbe;
633 HidDev->ClientRemove = usbMouseRemove;
634 break;
635 /*
636 case USB_HID_PROTOCOL_KEYBOARD:
637 HidDev->ClientProbe = usbKeyBoardProbe;
638 HidDev->ClientRemove = usbKeyBoardRemove;
639 break;
640 */
641 default:
642 hal_log_err("ERR: HidDevScan: unkown hid Device Type(%x)\n", HidDev->DevType);
643 HidDev->ClientProbe = NULL;
644 HidDev->ClientRemove = NULL;
645
646 return USB_ERR_UNKOWN_DEVICE;
647 }
648
649 if(HidDev->ClientProbe){
650 if(HidDev->ClientProbe(HidDev) != USB_ERR_SUCCESS){
651 hal_log_err("ERR: ClientProbe faield\n");
652 return USB_ERR_DEVICE_PROBE_FAILED;
653 }
654 }
655
656 return USB_ERR_SUCCESS;
657 }
658
659 /*
660 *******************************************************************************
661 * HidDevAdd
662 *
663 * Description:
664 *
665 *
666 * Parameters:
667 *
668 *
669 * Return value:
670 *
671 *
672 * note:
673 * 无
674 *
675 *******************************************************************************
676 */
HidDevAdd(HidDev_t * HidDev)677 static int HidDevAdd(HidDev_t * HidDev)
678 {
679 return HidDevScan(HidDev);
680 }
681
682 /*
683 *******************************************************************************
684 * HidDevDel
685 *
686 * Description:
687 *
688 *
689 * Parameters:
690 *
691 *
692 * Return value:
693 *
694 *
695 * note:
696 * 无
697 *
698 *******************************************************************************
699 */
HidDevDel(HidDev_t * HidDev)700 static int HidDevDel(HidDev_t * HidDev)
701 {
702 if(HidDev->ClientRemove){
703 if(HidDev->ClientRemove(HidDev) != USB_ERR_SUCCESS){
704 hal_log_err("ERR: ClientProbe faield\n");
705 return USB_ERR_DEVICE_PROBE_FAILED;
706 }
707 }
708
709 HidFreeReport(HidDev);
710
711 return USB_ERR_SUCCESS;
712 }
713
714
715 /*
716 *******************************************************************************
717 * HidSentRequest
718 *
719 * Description:
720 *
721 *
722 * Parameters:
723 *
724 *
725 * Return value:
726 *
727 *
728 * note:
729 * 无
730 *
731 *******************************************************************************
732 */
HidSentRequest(HidRequest_t * HidReq)733 int HidSentRequest(HidRequest_t *HidReq)
734 {
735 HidDev_t *HidDev = NULL;
736 unsigned int cpu_sr = 0;
737 int ret = 0;
738
739 if(HidReq == NULL){
740 hal_log_err("ERR: HidSentRequest: input error\n");
741 return USB_ERR_BAD_ARGUMENTS;
742 }
743
744 HidDev = HidReq->HidDev;
745 if(HidDev == NULL){
746 hal_log_err("ERR: HidSentRequest: HidDev == NULL\n");
747 return USB_ERR_BAD_ARGUMENTS;
748 }
749
750 /* Transport */
751 ret = HidDev->Transport(HidDev, HidReq);
752
753 ENTER_CRITICAL(cpu_sr);
754 HidReq->Result = ret;
755 EXIT_CRITICAL(cpu_sr);
756
757 /* HidReq Done */
758 HidReq->Done(HidReq);
759
760 return USB_ERR_SUCCESS;
761 }
762
763 /*
764 *******************************************************************************
765 * HidDevProbe
766 *
767 * Description:
768 *
769 *
770 * Parameters:
771 *
772 *
773 * Return value:
774 *
775 *
776 * note:
777 * 无
778 *
779 *******************************************************************************
780 */
HidDevProbe(struct usb_interface * intf,const struct usb_drv_dev_match_table * table_item)781 static int32_t HidDevProbe(struct usb_interface *intf, const struct usb_drv_dev_match_table * table_item)
782 {
783 const s32 match_table_index = table_item - Hid_match_table;
784 HidDev_t *HidDev = NULL;
785 int ret = 0;
786 // unsigned char err = 0;
787
788 hal_log_info("HidDevProbe begin\n");
789
790 if(intf == NULL || table_item == NULL){
791 hal_log_err("ERR: HidDevProbe: input error\n");
792 return -1;
793 }
794
795 //----------------------------------------------------------------
796 // 创建HidDev设备
797 //----------------------------------------------------------------
798 /* 初始化一个mscDev */
799 HidDev = hal_malloc(sizeof(HidDev_t));
800 if(HidDev == NULL){
801 hal_log_err("ERR: HidDevProbe malloc failed\n");
802 goto error0;
803 }
804
805 memset(HidDev, 0, sizeof(HidDev_t));
806
807 ret = HidDevInit(HidDev, intf);
808 if(ret != USB_ERR_SUCCESS){
809 hal_log_err("ERR: HidDevProbe failed\n");
810 ret = -1;
811 goto error1;
812 }
813
814 /* 获得设备信息 */
815 HidGetDeviceInfo(HidDev, match_table_index);
816
817 /* 获得Transport */
818 ret = HidGetTransport(HidDev);
819 if(ret != USB_ERR_SUCCESS){
820 hal_log_err("ERR: HidGetTransport failed\n");
821 ret = -1;
822 goto error2;
823 }
824
825 /* 创建传输管道 */
826 ret = HidCreatePipes(HidDev);
827 if(ret != USB_ERR_SUCCESS){
828 hal_log_err("ERR: HidGetTransport failed\n");
829 ret = -1;
830 goto error3;
831 }
832
833 HidSetDeviceState(HidDev, HID_DEV_ONLINE);
834
835 //----------------------------------------------------------------
836 // 识别HidDev设备
837 //----------------------------------------------------------------
838 ret = HidDevAdd(HidDev);
839 if(ret != USB_ERR_SUCCESS){
840 hal_log_err("ERR: HidDevScan failed\n");
841 ret = -1;
842 goto error4;
843 }
844
845 return 0;
846
847 error4:
848 HidSetDeviceState(HidDev, HID_DEV_OFFLINE);
849
850 error3:
851 error2:
852 HidDevFree(HidDev);
853
854 error1:
855 hal_free(HidDev);
856
857 error0:
858
859 return -1;
860 }
861
862 /*
863 *******************************************************************************
864 * HidInit
865 *
866 * Description:
867 *
868 *
869 * Parameters:
870 *
871 *
872 * Return value:
873 * EPDK_OK / EPDK_FAIL
874 *
875 * note:
876 * 无
877 *
878 *******************************************************************************
879 */
HidDevSuspend(struct usb_interface * intf)880 static int32_t HidDevSuspend(struct usb_interface *intf)
881 {
882 hal_log_info("HidDevSuspend not support\n");
883
884 return 0;
885 }
886 /*
887 *******************************************************************************
888 * HidInit
889 *
890 * Description:
891 *
892 *
893 * Parameters:
894 *
895 *
896 * Return value:
897 * EPDK_OK / EPDK_FAIL
898 *
899 * note:
900 * 无
901 *
902 *******************************************************************************
903 */
HidDevRemove(struct usb_interface * intf)904 static void HidDevRemove(struct usb_interface *intf)
905 {
906 HidDev_t *HidDev = NULL;
907
908 if(intf == NULL){
909 hal_log_err("ERR: HidDevRemoves: input error\n");
910 return ;
911 }
912
913 HidDev = (HidDev_t *)usb_mod_usb_get_intf_priv_data(intf);
914 if(HidDev == NULL){
915 hal_log_err("ERR: HidDev = NULL\n");
916 return ;
917 }
918
919 HidSetDeviceState(HidDev, HID_DEV_OFFLINE);
920
921 HidDevDel(HidDev);
922
923 HidDevFree(HidDev);
924
925 hal_free(HidDev);
926
927 hal_log_info("HidDevRemove complete\n");
928
929 return ;
930 }
931
932 /*
933 *******************************************************************************
934 * HidInit
935 *
936 * Description:
937 *
938 *
939 * Parameters:
940 *
941 *
942 * Return value:
943 * EPDK_OK / EPDK_FAIL
944 *
945 * note:
946 * 无
947 *
948 *******************************************************************************
949 */
HidDriverInit(struct usb_host_func_drv * drv)950 static int HidDriverInit(struct usb_host_func_drv *drv)
951 {
952 if(drv == NULL){
953 hal_log_err("ERR: mscDrv_init: input error\n");
954 return -1;
955 }
956
957 USB_INIT_LIST_HEAD(&(drv->virt_dev_list));
958 drv->func_drv_name = HID_DRV_NAME;
959 drv->func_drv_auther = HID_DRV_AUTHOR;
960 drv->probe = HidDevProbe;
961 drv->disconnect = HidDevRemove;
962 drv->suspend = HidDevSuspend;
963 drv->resume = NULL;
964 drv->match_table = Hid_match_table;
965
966 return 0;
967 }
968
969 /*
970 *******************************************************************************
971 * HidInit
972 *
973 * Description:
974 *
975 *
976 * Parameters:
977 *
978 *
979 * Return value:
980 * EPDK_OK / EPDK_FAIL
981 *
982 * note:
983 * 无
984 *
985 *******************************************************************************
986 */
HidInit(void)987 int HidInit(void)
988 {
989 int ret = 0;
990
991 memset(&HidDrv, 0, sizeof(struct usb_host_func_drv));
992
993 if(HidDriverInit(&HidDrv) != 0){
994 hal_log_err("ERR: HidDriverInit failed\n");
995 return -1;
996 }
997
998 ret = usb_host_func_drv_reg(&HidDrv);
999 if(ret != 0){
1000 hal_log_err("ERR: HidInit: Reg driver %s failed\n", HidDrv.func_drv_name);
1001 return -1;
1002 }
1003
1004 return 0;
1005 }
1006
1007 /*
1008 *******************************************************************************
1009 * HidExit
1010 *
1011 * Description:
1012 *
1013 *
1014 * Parameters:
1015 *
1016 *
1017 * Return value:
1018 * EPDK_OK / EPDK_FAIL
1019 *
1020 * note:
1021 * 无
1022 *
1023 *******************************************************************************
1024 */
HidExit(void)1025 int HidExit(void)
1026 {
1027 int ret = 0;
1028
1029 ret = usb_host_func_drv_unreg(&HidDrv);
1030 if(ret != 0){
1031 hal_log_err("ERR: HidExit: UnReg driver %s failed\n", HidDrv.func_drv_name);
1032 return -1;
1033 }
1034
1035 memset(&HidDrv, 0, sizeof(struct usb_host_func_drv));
1036
1037 return 0;
1038 }
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049