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