1 /*
2 ********************************************************************************
3 *                                USB Hid Driver
4 *
5 *                (c) Copyright 2006-2010, All winners Co,Ld.
6 *                        All Right Reserved
7 *
8 * FileName      :  usbMouse.c
9 *
10 * Author        :  Javen
11 *
12 * Date          :  2010.06.02
13 *
14 * Description   :  USB Mouse
15 *
16 * Others        :  NULL
17 *
18 * History:
19 *       <time>      <version >      <author>        <desc>
20 *      2010.06.02      1.0           Javen          build this file
21 *
22 ********************************************************************************
23 */
24 
25 //#include  "usb_host_config.h"
26 //#include  "usb_host_base_types.h"
27 #include "usb_os_platform.h"
28 #include "usb_host_common.h"
29 #include "error.h"
30 #include "misc_lib.h"
31 #include "HidSpec.h"
32 #include "Hid_i.h"
33 #include "HidFunDrv.h"
34 #include "UsbMouse.h"
35 #include "UsbMouse_DriftControl.h"
36 
37 //---------------------------------------------------------
38 //   函数定义区
39 //---------------------------------------------------------
40 static void usbMouse_StartWork(usbMouse_t *usbMouse);
41 static void usbMouse_StopWork(usbMouse_t *usbMouse);
42 
43 /*
44 *******************************************************************************
45 *                     usbMouseDone
46 *
47 * Description:
48 *
49 *
50 * Parameters:
51 *
52 *
53 * Return value:
54 *
55 *
56 * note:
57 *    无
58 *
59 *******************************************************************************
60 */
usbMouseDone(HidRequest_t * HidReq)61 static void usbMouseDone(HidRequest_t *HidReq)
62 {
63     int val = 0;
64     usbMouse_t *usbMouse = NULL;
65 
66     usbMouse = (usbMouse_t *)HidReq->Extern;
67     if(usbMouse == NULL){
68         hal_log_err("ERR: usbMouseDone: usbMouse == NULL\n");
69         return;
70     }
71 
72 //  UsbThreadWakeUp(usbMouse->MouseThreadSemi);
73     if (!hal_sem_getvalue(usbMouse->MouseThreadSemi, &val))
74     {
75         hal_sem_post(usbMouse->MouseThreadSemi);
76     }
77 
78     return;
79 }
80 
81 /*
82 *******************************************************************************
83 *                     usbMouseOpen
84 *
85 * Description:
86 *
87 *
88 * Parameters:
89 *
90 *
91 * Return value:
92 *
93 *
94 * note:
95 *    无
96 *
97 *******************************************************************************
98 */
usbMouseOpen(void * open_arg,uint32_t mode)99 static USB_OS_HANDLE usbMouseOpen(void *open_arg, uint32_t mode)
100 {
101     usbMouse_t *usbMouse = NULL;
102 
103     if(open_arg == NULL){
104         hal_log_err("ERR: usbMouseOpen: input error, open_arg = %x\n", open_arg);
105         return NULL;
106     }
107 
108     usbMouse = (usbMouse_t *)open_arg;
109     if(usbMouse->Magic != USB_HID_DEV_MAGIC){
110         hal_log_err("ERR: usbMouseOpen: BlkDev Magic(%x) is invalid\n", usbMouse->Magic);
111         return NULL;
112     }
113 
114     return (USB_OS_HANDLE)open_arg;
115 }
116 
117 /*
118 *******************************************************************************
119 *                     usbMouseClose
120 *
121 * Description:
122 *
123 *
124 * Parameters:
125 *
126 *
127 * Return value:
128 *    0  :成功
129 *   !0  :失败
130 *
131 * note:
132 *    无
133 *
134 *******************************************************************************
135 */
usbMouseClose(USB_OS_HANDLE hDev)136 static int32_t usbMouseClose(USB_OS_HANDLE hDev)
137 {
138     usbMouse_t *usbMouse = NULL;
139 
140     if(hDev == NULL){
141         hal_log_err("ERR: usbMouseClose: input error\n");
142         return EPDK_FAIL;
143     }
144 
145     usbMouse = (usbMouse_t *)hDev;
146     if(usbMouse->Magic != USB_HID_DEV_MAGIC){
147         hal_log_err("ERR: usbMouseClose: BlkDev Magic(%x) is invalid\n", usbMouse->Magic);
148         return EPDK_FAIL;
149     }
150 
151     return EPDK_OK;
152 }
153 /*
154 *******************************************************************************
155 *                     usbMouseRead
156 *
157 * Description:
158 *
159 *
160 * Parameters:
161 *
162 *
163 * Return value:
164 *
165 *
166 * note:
167 *    无
168 *
169 *******************************************************************************
170 */
usbMouseRead(void * pBuffer,uint32_t blk,uint32_t n,USB_OS_HANDLE hDev)171 static uint32_t usbMouseRead(void * pBuffer, uint32_t blk, uint32_t n, USB_OS_HANDLE hDev)
172 {
173     hal_log_err("ERR: usbMouseRead not support\n");
174     return 0;
175 }
176 
177 /*
178 *******************************************************************************
179 *                     usbMouseWrite
180 *
181 * Description:
182 *
183 *
184 * Parameters:
185 *
186 *
187 * Return value:
188 *
189 *
190 * note:
191 *    无
192 *
193 *******************************************************************************
194 */
usbMouseWrite(const void * pBuffer,uint32_t blk,uint32_t n,USB_OS_HANDLE hDev)195 static uint32_t usbMouseWrite(const void * pBuffer, uint32_t blk, uint32_t n, USB_OS_HANDLE hDev)
196 {
197     hal_log_err("ERR: usbMouseWrite not support\n");
198     return 0;
199 }
200 
201 /*
202 *******************************************************************************
203 *                     usbMouseIoctl
204 *
205 * Description:
206 *
207 *
208 * Parameters:
209 *
210 *
211 * Return value:
212 *
213 *
214 * note:
215 *    无
216 *
217 *******************************************************************************
218 */
usbMouseIoctl(USB_OS_HANDLE hDev,uint32_t Cmd,long Aux,void * pBuffer)219 static int32_t usbMouseIoctl(USB_OS_HANDLE hDev, uint32_t Cmd, long Aux, void *pBuffer)
220 {
221     usbMouse_t *usbMouse = NULL;
222     HidDev_t *HidDev = NULL;
223     unsigned int cup_sr = 0;
224 
225     if(hDev == NULL){
226         hal_log_err("ERR: usbMouseClose: input error\n");
227         return EPDK_FAIL;
228     }
229 
230     usbMouse = (usbMouse_t *)hDev;
231     if(usbMouse->Magic != USB_HID_DEV_MAGIC){
232         hal_log_err("ERR: usbMouseClose: BlkDev Magic(%x) is invalid\n", usbMouse->Magic);
233         return EPDK_FAIL;
234     }
235 
236     HidDev = usbMouse->HidDev;
237     if(HidDev == NULL){
238         hal_log_err("ERR: HidDev == NULL\n");
239         return EPDK_FAIL;
240     }
241 
242     switch(Cmd){
243         case USBH_HID_USER_CTRL_CMD_TEST_START:
244         {
245             hal_log_info("usb mouse test command: start-s\n");
246             if(pBuffer == NULL){
247                 hal_log_err("ERR: Execute usb mouse test cmd START failed, for pBuffer is NULL\n");
248                 return EPDK_FAIL;
249             }
250 
251             ENTER_CRITICAL(cup_sr);
252             usbMouse->USBHMouseTest = (USBHMouseTest_t *)pBuffer;
253             usbMouse->USBMouseTestFlag  = 1;
254             EXIT_CRITICAL(cup_sr);
255 
256             usbMouse_StartWork(usbMouse);
257             hal_log_info("usb mouse test command: start-e\n");
258         }
259         break;
260 
261         case USBH_HID_USER_CTRL_CMD_TEST_STOP:
262             hal_log_info("usb mouse test command: stop-s\n");
263 
264             if(usbMouse->USBMouseTestFlag){
265                 ENTER_CRITICAL(cup_sr);
266                 usbMouse->USBHMouseTest     = NULL;
267                 usbMouse->USBMouseTestFlag  = 0;
268                 EXIT_CRITICAL(cup_sr);
269 
270                 usbMouse_StopWork(usbMouse);
271             }else{
272                 hal_log_err("ERR: usb mouse test, can not stop test, for have not start test\n");
273                 return EPDK_FAIL;
274             }
275 
276             hal_log_info("usb mouse test command: stop-e\n");
277         break;
278 
279         case USBH_HID_USER_CTRL_CMD_REG:
280             usbMouse->CallBack = (USBHMouse_CallBack)esKRNL_GetCallBack((__pCBK_t)(pBuffer));
281             if(usbMouse->CallBack == NULL){
282                 hal_log_err("ERR: usb mouse CallBack is NULL\n");
283                 return EPDK_FAIL;
284             }
285 
286             usbMouse_StartWork(usbMouse);
287         break;
288 
289         case USBH_HID_USER_CTRL_CMD_UNREG:
290             usbMouse->CallBack = NULL;
291             usbMouse_StopWork(usbMouse);
292         break;
293 
294         default:
295             hal_log_err("ERR: unkown cmd(%x)\n", Cmd);
296             return EPDK_FAIL;
297     }
298 
299     return EPDK_OK;
300 }
301 
302 /*
303 *******************************************************************************
304 *                     usbMouse_StartWork
305 *
306 * Description:
307 *
308 *
309 * Parameters:
310 *
311 *
312 * Return value:
313 *
314 *
315 * note:
316 *    无
317 *
318 *******************************************************************************
319 */
usbMouse_StartWork(usbMouse_t * usbMouse)320 static void usbMouse_StartWork(usbMouse_t *usbMouse)
321 {
322     HidDev_t *HidDev = NULL;
323     unsigned int cup_sr = 0;
324     int ret = 0, val = 0;
325 
326     if(usbMouse == NULL){
327         hal_log_err("ERR: input error\n");
328         return ;
329     }
330 
331     HidDev = usbMouse->HidDev;
332     if(HidDev == NULL){
333         hal_log_err("ERR: HidDev == NULL\n");
334         return ;
335     }
336 
337     if(HidDev->State == HID_DEV_OFFLINE){
338         hal_log_err("ERR: device is offline, mouse can not start work\n");
339         return ;
340     }
341 
342     /* 清除鼠标的状态 */
343     ret = HidDev->SoftReset(HidDev);
344     if(ret != USB_ERR_SUCCESS){
345         hal_log_err("ERR: SoftReset failed\n");
346         /* 由于有些鼠标不支持SetIdle命令,SoftReset可能会失败,因此不能直接return */
347     }
348 
349     ENTER_CRITICAL(cup_sr);
350     usbMouse->StopWork       = 0;
351     usbMouse->HidReq.Result = USB_HID_TRANSPORT_DEVICE_RESET;
352     EXIT_CRITICAL(cup_sr);
353 
354     //  UsbThreadWakeUp(usbMouse->MouseThreadSemi);
355     if (!hal_sem_getvalue(usbMouse->MouseThreadSemi, &val))
356     {
357         hal_sem_post(usbMouse->MouseThreadSemi);
358     }
359 
360     return;
361 }
362 
363 /*
364 *******************************************************************************
365 *                     usbMouse_StopWork
366 *
367 * Description:
368 *
369 *
370 * Parameters:
371 *
372 *
373 * Return value:
374 *
375 *
376 * note:
377 *    无
378 *
379 *******************************************************************************
380 */
usbMouse_StopWork(usbMouse_t * usbMouse)381 static void usbMouse_StopWork(usbMouse_t *usbMouse)
382 {
383     HidDev_t *HidDev = NULL;
384     unsigned int cup_sr = 0;
385 
386     if(usbMouse == NULL){
387         hal_log_err("ERR: input error\n");
388         return ;
389     }
390 
391     HidDev = usbMouse->HidDev;
392     if(HidDev == NULL){
393         hal_log_err("ERR: HidDev == NULL\n");
394         return ;
395     }
396 
397     ENTER_CRITICAL(cup_sr);
398     usbMouse->StopWork = 1;
399     EXIT_CRITICAL(cup_sr);
400 
401     HidDev->StopTransport(HidDev);
402 
403     return ;
404 }
405 
406 /*
407 *******************************************************************************
408 *                     usbMouse_StopWork
409 *
410 * Description:
411 *
412 *
413 * Parameters:
414 *
415 *
416 * Return value:
417 *
418 *
419 * note:
420 *    无
421 *
422 *******************************************************************************
423 */
usbMouseEvent(usbMouse_t * usbMouse)424 static void usbMouseEvent(usbMouse_t *usbMouse)
425 {
426     HidRequest_t *HidReq = NULL;
427     int status = 0;
428     USBHMouseEvent_t Event;
429     int TempData = 0;
430 
431     if(usbMouse == NULL){
432         hal_log_err("ERR: input error\n");
433         return ;
434     }
435 
436     HidReq = &(usbMouse->HidReq);
437     if(HidReq == NULL){
438         hal_log_err("ERR: HidReq == NULL\n");
439         return ;
440     }
441 
442     /* check request result */
443     switch(HidReq->Result){
444         case USB_HID_TRANSPORT_SUCCESS:
445             //nothing to do
446         break;
447 
448         case USB_HID_TRANSPORT_DEVICE_DISCONNECT:
449             hal_log_err("ERR: usbMouseEvent: mouse is disconnect\n");
450             return;
451         //break;
452 
453         case USB_HID_TRANSPORT_CANCEL_CMD:
454             hal_log_err("ERR: usbMouseEvent: driver cancel command\n");
455             return;
456         //break;
457 
458         default:
459             hal_log_err("ERR: unkown result %x\n", HidReq->Result);
460             goto next;
461     }
462 
463     DMSG_MOUSE_TEST("\n");
464     DMSG_MOUSE_TEST("[0]:%x, [1]:%x, [2]:%x, [3]:%x, [4]:%x, [5]:%x, [6]:%x\n",
465               usbMouse->Data[0], usbMouse->Data[1], usbMouse->Data[2],
466               usbMouse->Data[3], usbMouse->Data[4], usbMouse->Data[5],
467               usbMouse->Data[6]);
468 
469     /* paser usb mouse event */
470     memset(&Event, 0, sizeof(USBHMouseEvent_t));
471 
472     /* button */
473     if(usbMouse->DataDef.Button.BitCount){
474         TempData = 0;
475         /*这里可能会有问题,里面操作是否会超过TempData所在内存*/
476         xGetDataFromBuffer(usbMouse->Data,
477                            usbMouse->DataDef.Button.BitOffset,
478                            usbMouse->DataDef.Button.BitCount,
479                            &TempData);
480         memcpy(&Event.Button, &TempData, sizeof(TempData));
481     }
482 
483     /* X坐标 */
484     if(usbMouse->DataDef.X.BitCount){
485         TempData = 0;
486         xGetDataFromBuffer(usbMouse->Data,
487                            usbMouse->DataDef.X.BitOffset,
488                            usbMouse->DataDef.X.BitCount,
489                            &TempData);
490         if(usb_test_bit((usbMouse->DataDef.X.BitCount - 1), (volatile uint32_t *)&TempData)){
491             TempData |= (0xffffffff << (usbMouse->DataDef.X.BitCount - 1));
492         }
493 
494         /* 根据鼠标原厂的建议, 把超过+127设置为+127, 超过-127设置为-127 */
495         if(TempData <= -127){
496             Event.X = -127;
497         }else if(TempData > 127){
498             Event.X = 127;
499         }else{
500             Event.X = TempData;
501         }
502     }
503 
504     /* Y坐标 */
505     if(usbMouse->DataDef.Y.BitCount){
506         TempData = 0;
507         xGetDataFromBuffer(usbMouse->Data,
508                            usbMouse->DataDef.Y.BitOffset,
509                            usbMouse->DataDef.Y.BitCount,
510                            &TempData);
511         if(usb_test_bit((usbMouse->DataDef.Y.BitCount - 1), (volatile uint32_t *)&TempData)){
512             TempData |= (0xffffffff << (usbMouse->DataDef.Y.BitCount - 1));
513         }
514 
515         if(TempData <= -127){
516             Event.Y = -127;
517         }else if(TempData > 127){
518             Event.Y = 127;
519         }else{
520             Event.Y = TempData;
521         }
522     }
523 
524     /* wheel */
525     if(usbMouse->DataDef.Wheel.BitCount){
526         TempData = 0;
527         xGetDataFromBuffer(usbMouse->Data,
528                            usbMouse->DataDef.Wheel.BitOffset,
529                            usbMouse->DataDef.Wheel.BitCount,
530                            &TempData);
531         if(usb_test_bit((usbMouse->DataDef.Wheel.BitCount - 1), (volatile uint32_t *)&TempData)){
532             TempData |= (0xffffffff << (usbMouse->DataDef.Wheel.BitCount - 1));
533         }
534 
535         if(TempData <= -127){
536             Event.Wheel = -127;
537         }else if(TempData > 127){
538             Event.Wheel = 127;
539         }else{
540             Event.Wheel = TempData;
541         }
542     }
543 
544     DMSG_MOUSE_TEST("Button 1 = %d\n", Event.Button.LeftButton);
545     DMSG_MOUSE_TEST("Button 2 = %d\n", Event.Button.RightButton);
546     DMSG_MOUSE_TEST("Button 3 = %d\n", Event.Button.MiddleButton);
547     DMSG_MOUSE_TEST("Button 4 = %d\n", Event.Button.Button4);
548     DMSG_MOUSE_TEST("Button 5 = %d\n", Event.Button.Button5);
549     DMSG_MOUSE_TEST("Button 6 = %d\n", Event.Button.Button6);
550     DMSG_MOUSE_TEST("Button 7 = %d\n", Event.Button.Button7);
551     DMSG_MOUSE_TEST("Button 8 = %d\n", Event.Button.Button8);
552 
553     DMSG_MOUSE_TEST("X        = %d\n", Event.X);
554     DMSG_MOUSE_TEST("Y        = %d\n", Event.Y);
555     DMSG_MOUSE_TEST("Wheel    = %d\n", Event.Wheel);
556     DMSG_MOUSE_TEST("\n");
557 
558     UsbMouse_AddToDriftArray(usbMouse, &Event);
559 
560 next:
561     /* do next hid request */
562     status = HidSentRequest(&(usbMouse->HidReq));
563     if(status != USB_ERR_SUCCESS){
564         hal_log_err("ERR: HidSentRequest failed\n");
565         return ;
566     }
567 
568     return ;
569 }
570 
571 /*
572 *******************************************************************************
573 *                     usbMouseThd
574 *
575 * Description:
576 *
577 *
578 * Parameters:
579 *
580 *
581 * Return value:
582 *
583 *
584 * note:
585 *    无
586 *
587 *******************************************************************************
588 */
usbMouseThread(void * p_arg)589 static void usbMouseThread(void *p_arg)
590 {
591     usbMouse_t *usbMouse = (usbMouse_t *)p_arg;
592 
593     hal_sem_post(usbMouse->notify_complete);
594 
595     while(1){
596         //--<1>--杀死线程
597 //      TryToKillThreadSelf("usbMouseThread");
598 
599 //      /* sleep */
600 //      UsbThreadSleep(usbMouse->MouseThreadSemi);
601         kthread_stop(usbMouse->MouseThdId);
602         hal_sem_wait(usbMouse->MouseThreadSemi);
603 
604         if(usbMouse->HidDev->State == HID_DEV_OFFLINE || usbMouse->StopWork){
605             /* nothing to do */
606             hal_log_info("WRN: Usb mouse is offline(%d) or stop work(%d)\n",
607                       usbMouse->HidDev->State, usbMouse->StopWork);
608         }else{
609             usbMouseEvent(usbMouse);
610         }
611     }
612 }
613 
614 /*
615 *******************************************************************************
616 *                     usbMouseProbe
617 *
618 * Description:
619 *
620 *
621 * Parameters:
622 *
623 *
624 * Return value:
625 *
626 *
627 * note:
628 *    无
629 *
630 *******************************************************************************
631 */
usbMouseProbe(HidDev_t * HidDev)632 int usbMouseProbe(HidDev_t *HidDev)
633 {
634     usbMouse_t *usbMouse = NULL;
635     unsigned char err = 0;
636     int ret = 0;
637 
638     if(HidDev == NULL){
639         hal_log_err("ERR: usbMouseProbe: input error\n");
640         return USB_ERR_BAD_ARGUMENTS;
641     }
642 
643     /* 创建一个mouse设备,并且初始化 */
644     usbMouse = (usbMouse_t *)hal_malloc(sizeof(usbMouse_t));
645     if(usbMouse == NULL){
646         hal_log_err("ERR: hal_malloc failed\n");
647         return USB_ERR_MALLOC_FAILED;
648     }
649 
650     memset(usbMouse, 0, sizeof(usbMouse_t));
651     usbMouse->HidDev = HidDev;
652     HidDev->Extern = usbMouse;
653 
654 /*
655     if(HidDev->pusb_dev->manufacturer){
656         strcpy((char *)usbMouse->Vendor, HidDev->pusb_dev->manufacturer);
657     }
658 
659     if(HidDev->pusb_dev->product){
660         strcpy((char *)usbMouse->Product, HidDev->pusb_dev->product);
661     }
662 
663     if(HidDev->pusb_dev->serial){
664         strcpy((char *)usbMouse->Serial, HidDev->pusb_dev->serial);
665     }
666 */
667 
668     /* init mouse data tansfer */
669     if(HidDev->OnceTransferLength > USB_HID_MOUSE_DATA_LEN){
670         hal_log_err("ERR: HidDev OnceTransferLength is too big.(%d, %d)\n",
671                    HidDev->OnceTransferLength, USB_HID_MOUSE_DATA_LEN);
672         goto error0;
673     }
674 
675     /* get button BitOffset and BitCount */
676     ret = HidGetInputReport(HidDev,
677                             USB_HID_USAGE_PAGE_BUTTON,
678                             USB_HID_GENERIC_DESKTOP_PAGE_UNDEFINED,
679                             &usbMouse->DataDef.Button.BitOffset,
680                             &usbMouse->DataDef.Button.BitCount);
681     if(ret != USB_ERR_SUCCESS){
682         hal_log_err("ERR: Get mouse button bitoffset and bitcount field\n");
683         goto error0;
684     }
685 
686     /* get X BitOffset and BitCount */
687     ret = HidGetInputReport(HidDev,
688                             USB_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
689                             USB_HID_GENERIC_DESKTOP_PAGE_X,
690                             &usbMouse->DataDef.X.BitOffset,
691                             &usbMouse->DataDef.X.BitCount);
692     if(ret != USB_ERR_SUCCESS){
693         hal_log_err("ERR: Get mouse button bitoffset and bitcount field\n");
694         goto error0;
695     }
696 
697     /* get Y BitOffset and BitCount */
698     ret = HidGetInputReport(HidDev,
699                             USB_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
700                             USB_HID_GENERIC_DESKTOP_PAGE_Y,
701                             &usbMouse->DataDef.Y.BitOffset,
702                             &usbMouse->DataDef.Y.BitCount);
703     if(ret != USB_ERR_SUCCESS){
704         hal_log_err("ERR: Get mouse button bitoffset and bitcount field\n");
705         goto error0;
706     }
707 
708     /* get wheel BitOffset and BitCount */
709     ret = HidGetInputReport(HidDev,
710                             USB_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
711                             USB_HID_GENERIC_DESKTOP_PAGE_WHEEL,
712                             &usbMouse->DataDef.Wheel.BitOffset,
713                             &usbMouse->DataDef.Wheel.BitCount);
714     if(ret != USB_ERR_SUCCESS){
715         hal_log_err("ERR: Get mouse button bitoffset and bitcount field\n");
716         goto error0;
717     }
718 
719     hal_log_info("Button: BitOffset = %d, BitCount = %d\n",
720               usbMouse->DataDef.Button.BitOffset, usbMouse->DataDef.Button.BitCount);
721     hal_log_info("X: BitOffset = %d, BitCount = %d\n",
722               usbMouse->DataDef.X.BitOffset, usbMouse->DataDef.X.BitCount);
723     hal_log_info("Y: BitOffset = %d, BitCount = %d\n",
724               usbMouse->DataDef.Y.BitOffset, usbMouse->DataDef.Y.BitCount);
725     hal_log_info("Wheel: BitOffset = %d, BitCount = %d\n",
726               usbMouse->DataDef.Wheel.BitOffset, usbMouse->DataDef.Wheel.BitCount);
727 
728     /* init device operation function */
729     usbMouse->MouseOp.Open  = usbMouseOpen;
730     usbMouse->MouseOp.Close = usbMouseClose;
731     usbMouse->MouseOp.Read  = usbMouseRead;
732     usbMouse->MouseOp.Write = usbMouseWrite;
733     usbMouse->MouseOp.Ioctl = usbMouseIoctl;
734 
735     /* init hid request */
736     usbMouse->HidReq.HidDev = HidDev;
737     usbMouse->HidReq.DataTransferLength = HidDev->OnceTransferLength;
738     usbMouse->HidReq.buffer = usbMouse->Data;
739     usbMouse->HidReq.Done = usbMouseDone;
740 
741     usbMouse->HidReq.Extern = (void *)usbMouse;
742     usbMouse->Magic = USB_HID_DEV_MAGIC;
743 
744     /* stop mouse */
745     usbMouse->StopWork = 1;
746 
747     UsbMouse_DriftControl_Init(usbMouse);
748 
749     /* create mouse thread */
750     usbMouse->MouseThreadSemi = hal_sem_create(0);
751     if(usbMouse->MouseThreadSemi == NULL){
752         hal_log_err("ERR: hal_sem_create MouseThreadSemi failed\n");
753         goto error1;
754     }
755 
756     usbMouse->notify_complete = hal_sem_create(0);
757     if(usbMouse->notify_complete == NULL){
758         hal_log_err("ERR: hal_sem_create notify_complete failed\n");
759         goto error2;
760     }
761 
762     usbMouse->MouseThdId = kthread_create((void *)usbMouseThread,
763                                             (void *)usbMouse,
764                                             "usbMouseThread");
765     if(usbMouse->MouseThdId == OS_NO_ERR){
766         hal_log_err("ERR: create usbMouseThd failed\n");
767         goto error3;
768     }
769 
770     hal_sem_wait(usbMouse->notify_complete);
771 
772     /* 生成设备名 */
773     strcpy((char *)usbMouse->ClassName, "HID");
774     strcpy((char *)usbMouse->DevName, "USBMOUSE");
775 
776     {
777         unsigned char temp_buff[32];
778         unsigned int temp = 0;
779 
780         strcat((char *)usbMouse->DevName, "_");
781 
782         /* usb controler number */
783 //      temp = usbh_get_usbd_port();
784         temp = 0;
785         memset(temp_buff, 0, 32);
786         Usb_uint2str_dec(temp, (char *)temp_buff);
787         strcat((char *)usbMouse->DevName, (const char *)temp_buff);
788 
789         /* hid device number */
790         memset(temp_buff, 0, 32);
791         Usb_uint2str_dec(HidDev->DevNo, (char *)temp_buff);
792         strcat((char *)usbMouse->DevName, (const char *)temp_buff);
793     }
794 
795     /* 向系统注册Hid设备 */
796     usbMouse->MouseRegHdle = esDEV_DevReg((const char *)usbMouse->ClassName,
797                                             (const char *)usbMouse->DevName,
798                                             &(usbMouse->MouseOp),
799                                             (void *)usbMouse);
800     if(usbMouse->MouseRegHdle == NULL){
801         hal_log_err("ERR: Mouse USB_OS_DEV_REG failed\n");
802         goto error4;
803     }
804 
805     hal_log_info("\n");
806     hal_log_info("*****************************************************************\n");
807     hal_log_info("*                                                               *\n");
808     hal_log_info("* USB HOST Regist \"%s\" \"%s\" successful\n",
809                  usbMouse->ClassName, usbMouse->DevName);
810     hal_log_info("*                                                               *\n");
811     hal_log_info("*****************************************************************\n");
812     hal_log_info("\n");
813 
814     /* Notice: 由于新的设备上来以后,系统的设备管理告知应用程序,因此只能由驱动告知应用程序 */
815     esKSRV_SendMsg(KMSG_USR_SYSTEM_MOUSE_PLUGIN, KMSG_PRIO_HIGH);
816 
817 #ifdef USBH_HID_MOUSE_TEST
818     usbMouse->StopWork       = 0;
819     usbMouse->HidReq.Result = USB_HID_TRANSPORT_DEVICE_RESET;
820     UsbThreadWakeUp(usbMouse->MouseThreadSemi);
821 #endif
822 
823     return USB_ERR_SUCCESS;
824 
825 error4:
826     //UsbKillThread(usbMouse->MouseThdId , usbMouse->MouseThreadSemi);
827     kthread_stop(usbMouse->MouseThdId);
828 
829 error3:
830     hal_sem_delete(usbMouse->notify_complete);
831     usbMouse->notify_complete = NULL;
832 
833 error2:
834     hal_sem_delete(usbMouse->MouseThreadSemi);
835     usbMouse->MouseThreadSemi = NULL;
836 
837 error1:
838 error0:
839     hal_free(usbMouse);
840     usbMouse = NULL;
841 
842     return USB_ERR_DEVICE_PROBE_FAILED;
843 }
844 
845 /*
846 *******************************************************************************
847 *                     usbMouseRemove
848 *
849 * Description:
850 *
851 *
852 * Parameters:
853 *
854 * misc_lib.h
855 * Return value:
856 *
857 *
858 * note:
859 *    无
860 *
861 *******************************************************************************
862 */
usbMouseRemove(HidDev_t * HidDev)863 int usbMouseRemove(HidDev_t * HidDev)
864 {
865     usbMouse_t *usbMouse = NULL;
866     unsigned int cup_sr = 0;
867     unsigned char err = 0;
868 
869     if(HidDev == NULL){
870         hal_log_err("ERR: usbMouseRemove: input error\n");
871         return USB_ERR_BAD_ARGUMENTS;
872     }
873 
874     usbMouse = HidDev->Extern;
875     if(usbMouse == NULL){
876         hal_log_err("ERR: usbMouseRemove: usbMouse == NULL\n");
877         return USB_ERR_BAD_ARGUMENTS;
878     }
879 
880     esKSRV_SendMsg(KMSG_USR_SYSTEM_MOUSE_PLUGOUT, KMSG_PRIO_HIGH);
881 
882     usbMouse_StopWork(usbMouse);
883 
884     hal_log_info("\n");
885     hal_log_info("*****************************************************************\n");
886     hal_log_info("*                                                               *\n");
887     hal_log_info("* USB HOST UnRegist \"%s\" \"%s\" successful\n",
888                  usbMouse->ClassName, usbMouse->DevName);
889     hal_log_info("*                                                               *\n");
890     hal_log_info("*****************************************************************\n");
891     hal_log_info("\n");
892 
893     /* unregist device */
894     if(usbMouse->MouseRegHdle){
895         esDEV_DevUnreg(usbMouse->MouseRegHdle);
896     }
897 
898     /* kill thread */
899 //  UsbKillThread(usbMouse->MouseThdId , usbMouse->MouseThreadSemi);
900     kthread_stop(usbMouse->MouseThdId);
901 
902     if(usbMouse->notify_complete){
903         hal_sem_delete(usbMouse->notify_complete);
904         usbMouse->notify_complete = NULL;
905     }
906 
907     if(usbMouse->MouseThreadSemi){
908         hal_sem_delete(usbMouse->MouseThreadSemi);
909         usbMouse->MouseThreadSemi = NULL;
910     }
911 
912     UsbMouse_DriftControl_Exit(usbMouse);
913 
914     ENTER_CRITICAL(cup_sr);
915     HidDev->Extern = NULL;
916     EXIT_CRITICAL(cup_sr);
917 
918     hal_free(usbMouse);
919 
920     return USB_ERR_SUCCESS;
921 }
922 
923