usrUsbUglMseInit.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* usrUsbUglMseInit.c - Initialization of a USB Mouse in the UGL stack*/
  2. /* Copyright 1999-2001 Wind River Systems, Inc. */
  3. /*
  4. Modification history
  5. --------------------
  6. 01b,05feb01,wef  Created
  7. */
  8. /*
  9. DESCRIPTION
  10. This configlette initializes the USB mouse driver for use with the UGL
  11. stack.  This assumes the USB host stack has already been initialized and 
  12. has a host controller driver attached.   
  13. Refer to the Zinc for Tornado users guide for help on configuring the 
  14. graphics stack.
  15. */
  16. /* includes */
  17. #include "stdlib.h"
  18. #include "string.h"
  19. #include "ugl/uglos.h"
  20. #include "ugl/uglin.h"
  21. #include "usb/usbPlatform.h" /* Basic definitions */
  22. #include "usb/usbdLib.h" /* USBD interface */
  23. #include "usb/usbHid.h" /* USB HID definitions */
  24. #include "drv/usb/usbMouseLib.h" /* USB mouse SIO driver */
  25. /* defines */
  26. #define USB_UGLMSE_DRV "usbUglMse"
  27. /* typedefs */
  28. /* Usb to ugl mouse driver structure */
  29. typedef struct usb_ugl_mouse_driver
  30.     {
  31.     UGL_INPUT_DRIVER  inputDriver;
  32.     SIO_CHAN  *pMseSioChan;
  33.     USBD_CLIENT_HANDLE  usbdHandle;
  34.     UGL_UINT16 oldButtonState;
  35.     } USB_UGL_MOUSE_DRIVER;
  36. /* Globals */
  37. extern UGL_INPUT_Q_ID uglInputQ;
  38. /* forward static declarations */
  39. LOCAL UGL_STATUS usbUglMouseDevDestroy ( UGL_INPUT_DRIVER * pInputDriver );
  40. LOCAL VOID usbMouseDynamicCallback ( pVOID arg, 
  41.      SIO_CHAN *pChan, 
  42.      UINT16 attachCode );
  43. LOCAL STATUS usbMouseReportCallback (void *arg, pHID_MSE_BOOT_REPORT pReport);
  44. /******************************************************************************
  45. *
  46. * usbUglMouseDevCreate
  47. *
  48. * This routine is call from UGL stack to initialize a mouse conntected to 
  49. * an USB port.
  50. *
  51. * RETURNS: Pointer USB_UGL_MOUSE_DRIVER or UGL_NULL
  52. *
  53. */
  54. void usbUglMouseDevCreate 
  55.     ( 
  56.     void 
  57.     )
  58.     {
  59.     USB_UGL_MOUSE_DRIVER * pDriver;
  60.     /* allocate memory for driver structure */
  61.     pDriver = (USB_UGL_MOUSE_DRIVER *) UGL_CALLOC 
  62. (sizeof(USB_UGL_MOUSE_DRIVER),1);
  63.     if (pDriver == UGL_NULL)
  64. {
  65. printf ("Cant allocate USB / UGL mouse drivern");
  66. return;
  67. }
  68.     /* Register client to usb stack */
  69.     if (usbdClientRegister (USB_UGLMSE_DRV, &(pDriver->usbdHandle)) != OK)
  70. {
  71. UGL_FREE(pDriver);
  72. printf ("usbdClientRegister () returned ERRORn");
  73. return;
  74. }
  75.     /* Initialize mouse library */
  76.     if (usbMouseDevInit() != OK)
  77. {
  78. printf ("usbMouseDevInit () returned ERRORn");
  79. UGL_FREE(pDriver);
  80. return;
  81. }
  82.     /* attach dynamic callback to mouse library */
  83.     if (usbMouseDynamicAttachRegister(usbMouseDynamicCallback,
  84.       (pVOID)pDriver) 
  85.     != OK)
  86. {
  87. printf ("usbMouseDynamicAttachRegister () returned ERRORn");
  88. usbMouseDevShutdown();
  89. UGL_FREE(pDriver);
  90. }
  91.     /* Set destroy function pointer */
  92.     pDriver->inputDriver.destroy = usbUglMouseDevDestroy;
  93.     pDriver->oldButtonState = 0;
  94.     /* Attach to UGL stack */
  95.     pDriver->inputDriver.handler.qid = uglInputQ;
  96.     pDriver->inputDriver.handler.formatter = UGL_NULL;
  97.     pDriver->inputDriver.handler.device.isr.name = UGL_NULL;
  98.     pDriver->inputDriver.handler.device.isr.interruptId = UGL_NULL;
  99.     pDriver->inputDriver.handler.frame.xMin = 0;
  100.     pDriver->inputDriver.handler.frame.yMin = 0;
  101.     pDriver->inputDriver.handler.frame.xMax = (UGL_ORD) USB_UGL_CONFIG_SCREEN_WIDTH;
  102.     pDriver->inputDriver.handler.frame.yMax = (UGL_ORD) USB_UGL_CONFIG_SCREEN_HEIGHT;
  103.     }
  104. /******************************************************************************
  105. *
  106. * usbUglMouseDevDestroy
  107. *
  108. * This routine is call from UGL stack to uninstall all register callback and
  109. * free driver structure.
  110. *
  111. * RETURNS: UGL_STATUS_ERROR or UGL_STATUS_OK
  112. *
  113. */
  114. LOCAL UGL_STATUS usbUglMouseDevDestroy
  115.     (
  116.     UGL_INPUT_DRIVER * pInputDriver /* USB mouse driver structure */
  117.     )
  118.     {
  119.     USB_UGL_MOUSE_DRIVER * pDriver = (USB_UGL_MOUSE_DRIVER *)pInputDriver;
  120.     /* Unregister dynamic callback from usb stack */
  121.     if (usbMouseDynamicAttachUnRegister (usbMouseDynamicCallback, 
  122. (pVOID)pDriver) 
  123.       != OK)
  124.     return UGL_STATUS_ERROR;
  125.     /* Desinitialize mouse library */
  126.     if (usbMouseDevShutdown() != OK)
  127.     return UGL_STATUS_ERROR;
  128.     /* Unregister driver from usb stack */
  129.     if (pDriver->usbdHandle != NULL)
  130. {
  131. usbdClientUnregister (pDriver->usbdHandle);
  132. pDriver->usbdHandle = NULL;
  133. }
  134.     /* Free structure */
  135.     UGL_FREE (pInputDriver);
  136.     return UGL_STATUS_OK;
  137.     }
  138. /******************************************************************************
  139. *
  140. * usbMouseDynamicCallback
  141. *
  142. * This routine is the callback function to notify when a mouse is attached or
  143. * removed from USB port.
  144. *
  145. * RETURNS: N/A
  146. *
  147. */
  148. LOCAL VOID usbMouseDynamicCallback( 
  149. pVOID arg, /* user-defined arg to callback */
  150. SIO_CHAN *pChan,  /* struc. of the channel being 
  151.  * created/destroyed 
  152.  */
  153. UINT16 attachCode /* attach code */
  154. )
  155.     {
  156.     USB_UGL_MOUSE_DRIVER * pDriver = (USB_UGL_MOUSE_DRIVER *)arg;
  157.     if (attachCode == USB_MSE_ATTACH)
  158. {
  159. if (usbMouseSioChanLock (pChan) != OK)
  160.     printf ("usbMouseSioChanLock () returned ERRORn");
  161. else
  162.     {
  163.     pDriver->pMseSioChan = pChan;
  164.     if (pDriver->pMseSioChan != NULL)
  165. {
  166. /* Install the callback report function */
  167. (*pDriver->pMseSioChan->pDrvFuncs->callbackInstall)
  168. (pDriver->pMseSioChan,
  169. SIO_CALLBACK_PUT_MOUSE_REPORT,
  170. usbMouseReportCallback, 
  171. (pVOID)pDriver);
  172. }
  173.     }
  174. }
  175.     else if (attachCode == USB_MSE_REMOVE) /* mouse device removed */
  176. {
  177. if (pChan == pDriver->pMseSioChan)
  178.     if (usbMouseSioChanUnlock(pChan) == OK)
  179.     pDriver->pMseSioChan = NULL;
  180. }
  181.     }
  182. /******************************************************************************
  183. *
  184. * usbMouseReportCallback
  185. *
  186. * This routine is the event callback. It notify when the USB mouse as move or
  187. * a button was click. It then post the message to the UGL stack.
  188. *
  189. * RETURNS: UGL_STATUS_DROP or OK
  190. *
  191. */
  192. LOCAL STATUS usbMouseReportCallback
  193.     ( 
  194.     void *arg, 
  195.     pHID_MSE_BOOT_REPORT pReport 
  196.     )
  197.     {
  198.     UGL_INPUT_EVENT * pInputEvent;
  199.     USB_UGL_MOUSE_DRIVER * pDriver = (USB_UGL_MOUSE_DRIVER *)arg;
  200.     
  201.     if (uglInputQEventStorageGet(pDriver->inputDriver.handler.qid,
  202.      &pInputEvent) 
  203.    != UGL_STATUS_OK)
  204. return UGL_STATUS_DROP;
  205.     if (pInputEvent == UGL_NULL)
  206. return UGL_STATUS_DROP;
  207.     memset(pInputEvent, 0, sizeof(*pInputEvent));
  208.     pInputEvent->id = UGL_INPUT_EVENT_TYPE_INCREMENTAL_POINTER;
  209.     pInputEvent->sourceDevice = (UGL_INPUT_HANDLER *)pDriver;
  210.     pInputEvent->event.pointer.dx = (signed char) pReport->xDisplacement; 
  211.     pInputEvent->event.pointer.dy = (signed char) pReport->yDisplacement;
  212.     if ((pReport->buttonState & MOUSE_BUTTON_1) != 0)
  213.     pInputEvent->event.pointer.buttonState |= 1;
  214.     if ((pReport->buttonState & MOUSE_BUTTON_2) != 0)
  215.     pInputEvent->event.pointer.buttonState |= 2;
  216.     if ((pReport->buttonState & MOUSE_BUTTON_3) != 0)
  217.     pInputEvent->event.pointer.buttonState |= 4;
  218.     /* Save button state changes */
  219.     pInputEvent->event.pointer.buttonChange = 
  220. (pInputEvent->event.pointer.buttonState ^ 
  221.  pDriver->oldButtonState);
  222.     pDriver->oldButtonState = pInputEvent->event.pointer.buttonState;
  223.     /* Post to ugl stack the notification event */
  224.     if (uglInputQEventPost(&pInputEvent) != UGL_STATUS_OK)
  225. {
  226. printf ("uglInputQEventPost () returned ERRROR.n");
  227. return UGL_STATUS_DROP;
  228. }
  229.     
  230.     return OK;
  231.     }