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

VxWorks

开发平台:

C/C++

  1. /* usrUsbUglKbdInit.c - Initialization of a USB Keyboard in the UGL stack*/
  2.  
  3. /* Copyright 1999-2001 Wind River Systems, Inc. */
  4.  
  5. /*
  6. Modification history
  7. --------------------
  8. 01b,05feb01,wef  Created
  9. */
  10.  
  11. /*
  12. DESCRIPTION
  13.  
  14. This configlette initializes the USB keyboard driver for use with the UGL
  15. stack.  This assumes the USB host stack has already been initialized and
  16. has a host controller driver attached.
  17.  
  18. Refer to the Zinc for Tornado users guide for help on configuring the
  19. graphics stack.
  20.  
  21. */
  22. /* includes */
  23. #include "stdlib.h"
  24. #include "string.h"
  25. #include "ugl/uglos.h"
  26. #include "ugl/uglin.h"
  27. #include "usb/usbPlatform.h" /* Basic definitions */
  28. #include "usb/usbdLib.h" /* USBD interface */
  29. #include "usb/usbHid.h" /* USB HID definitions */
  30. #include "drv/usb/usbKeyboardLib.h" /* USB keyoard SIO driver */
  31. #include "logLib.h"
  32. /* defines */
  33. #define UGL_USBKBD_DRV "usbUglKbd"
  34. /* typedefs */
  35. /* Usb to ugl eyboard driver structure */
  36. typedef struct ugl_usb_kbd_driver
  37.     {
  38.     UGL_INPUT_DRIVER  inputDriver;
  39.     SIO_CHAN  *pKbdSioChan;
  40.     USBD_CLIENT_HANDLE  usbdHandle;
  41.     } UGL_USB_KBD_DRIVER;
  42. /* Globals */
  43. extern UGL_INPUT_Q_ID uglInputQ;
  44. /* forward static declarations */
  45. LOCAL UGL_STATUS usbUglKeyboardDevDestroy( UGL_INPUT_DRIVER * pInputDriver );
  46. LOCAL VOID usbKeyboardDynamicCallback (pVOID arg, 
  47.        SIO_CHAN *pChan, 
  48.        UINT16 attachCode );
  49. LOCAL STATUS usbKeyboardReportCallback( void *arg, char rxChar );
  50. /******************************************************************************
  51. *
  52. * usbUglKbdDevCreate
  53. *
  54. * This routine is call from UGL stack to initialize a keyboard conntected to 
  55. * an USB port.
  56. *
  57. * RETURNS: Pointer UGL_USB_KBD_DRIVER or UGL_NULL
  58. *
  59. */
  60. void usbUglKeyboardDevCreate
  61.     (
  62.     void 
  63.     )
  64.     {
  65.     UGL_USB_KBD_DRIVER * pDriver;
  66.     /* allocate memory for driver structure */
  67.     pDriver = (UGL_USB_KBD_DRIVER *)
  68.     UGL_CALLOC (sizeof(UGL_USB_KBD_DRIVER),1);
  69.     if (pDriver == UGL_NULL)
  70. {
  71. printf ("Cant allocate USB / UGL keyboard drivern");
  72. return;
  73. }
  74.     /* register client to usb stack */
  75.     if (usbdClientRegister (UGL_USBKBD_DRV, &(pDriver->usbdHandle)) != OK)
  76. {
  77. printf ("usbdClientRegister () returned ERRORn");
  78. UGL_FREE(pDriver);
  79. return;
  80. }
  81.     /* initialize keyboard library */
  82.     if (usbKeyboardDevInit() != OK)
  83. {
  84. printf ("usbKeyboardDevInit () returned ERRORn");
  85. UGL_FREE(pDriver);
  86. return;
  87. }
  88.     /* attach dynamic callback to keyboard library */
  89.     if (usbKeyboardDynamicAttachRegister (usbKeyboardDynamicCallback,
  90.   (pVOID)pDriver) != OK)
  91. {
  92. printf ("usbKeyboardDynamicAttachRegister () returned ERRORn");
  93. usbKeyboardDevShutdown();
  94. UGL_FREE(pDriver);
  95. return;
  96. }
  97.     /* set destroy function pointer */
  98.     pDriver->inputDriver.destroy = usbUglKeyboardDevDestroy;
  99.     /* Attach to UGL stack */
  100.     pDriver->inputDriver.version = 1;
  101.     pDriver->inputDriver.handler.qid = uglInputQ;
  102.     pDriver->inputDriver.handler.formatter = UGL_NULL;
  103.     pDriver->inputDriver.handler.device.isr.name = UGL_NULL;
  104.     pDriver->inputDriver.handler.device.isr.interruptId = UGL_NULL;
  105.     /*return (UGL_INPUT_DRIVER *)pDriver;*/
  106.     }
  107. /******************************************************************************
  108. *
  109. * usbUglKeyoardDevDestroy
  110. *
  111. * This routine is call from UGL stack to uninstall all register callback and
  112. * free driver structure.
  113. *
  114. * RETURNS: UGL_STATUS_ERROR or UGL_STATUS_OK
  115. *
  116. */
  117. LOCAL UGL_STATUS usbUglKeyboardDevDestroy
  118.     (
  119.     UGL_INPUT_DRIVER * pInputDriver /* USB keyboard driver structure*/
  120.     )
  121.     {
  122.     UGL_USB_KBD_DRIVER * pDriver =
  123.     (UGL_USB_KBD_DRIVER *)pInputDriver;
  124.     /* unregister dynamic callback from usb stack */
  125.     if (usbKeyboardDynamicAttachUnRegister (usbKeyboardDynamicCallback, 
  126.     (pVOID)pDriver) 
  127.  != OK)
  128. return UGL_STATUS_ERROR;
  129.     /* desinitialize keyboard library */
  130.     if (usbKeyboardDevShutdown() != OK)
  131. return UGL_STATUS_ERROR;
  132.     /* unregister driver from usb stack */
  133.     if (pDriver->usbdHandle != NULL)
  134. {
  135. usbdClientUnregister (pDriver->usbdHandle);
  136. pDriver->usbdHandle = NULL;
  137. }
  138.     /* free structure */
  139.     UGL_FREE (pInputDriver);
  140.     return UGL_STATUS_OK;
  141.     }
  142. /******************************************************************************
  143. *
  144. * usbKeyboardDynamicCallback
  145. *
  146. * This routine is the callback function to notify when a keyboard is attached 
  147. * or removed from USB port.
  148. *
  149. * RETURNS: N/A
  150. *
  151. */
  152. LOCAL VOID usbKeyboardDynamicCallback
  153.     ( 
  154.     pVOID arg, /* user-defined arg to callback */
  155.     SIO_CHAN *pChan,  /* 
  156.  * struc. of the channel being 
  157.  * created/destroyed 
  158.  */
  159.     UINT16 attachCode /* attach code */
  160.     )
  161.     {
  162.     UGL_USB_KBD_DRIVER * pDriver = (UGL_USB_KBD_DRIVER *)arg;
  163.     if (attachCode == USB_KBD_ATTACH) /* keyboard device attached */
  164. {
  165. if (pDriver->pKbdSioChan == NULL)
  166.     {
  167.     if (usbKeyboardSioChanLock(pChan) == OK)
  168.     pDriver->pKbdSioChan = pChan;
  169.     if (pDriver->pKbdSioChan != NULL)
  170. {
  171. /* Install the callback report function */
  172. (*pDriver->pKbdSioChan->pDrvFuncs->callbackInstall) 
  173. (pDriver->pKbdSioChan,
  174.  SIO_CALLBACK_PUT_RCV_CHAR,
  175.  usbKeyboardReportCallback, 
  176.  (pVOID)pDriver);
  177. /* Start keyboard in supported mode */
  178. (*pDriver->pKbdSioChan->pDrvFuncs->ioctl)(pDriver->pKbdSioChan,
  179.   SIO_MODE_SET, 
  180.   (pVOID)SIO_MODE_INT);
  181. }
  182.     }
  183. }
  184.     else /* keyboard device removed */
  185. {
  186. if (pChan == pDriver->pKbdSioChan)
  187.     if (usbKeyboardSioChanUnlock(pChan) == OK)
  188.     pDriver->pKbdSioChan = NULL;
  189. }
  190.     }
  191. /******************************************************************************
  192. *
  193. * usbKeyboardReportCallback(
  194. *
  195. * This routine is the event callback. It notify when the USB keyboard key as
  196. * been press. It then post the message to the UGL stack.
  197. *
  198. * RETURNS: UGL_STATUS_DROP or OK
  199. *
  200. */
  201. LOCAL STATUS usbKeyboardReportCallback
  202.     ( 
  203.     void *arg, 
  204.     char rxChar
  205.     )
  206.     {
  207.     UGL_INPUT_EVENT * pInputEvent;
  208.     UGL_USB_KBD_DRIVER * pDriver = 
  209.     (UGL_USB_KBD_DRIVER *)arg;
  210.     /* get a input event handler from UGL */
  211.     if (uglInputQEventStorageGet (pDriver->inputDriver.handler.qid,
  212.   &pInputEvent) 
  213. != UGL_STATUS_OK)
  214. {
  215. /* Out of room. Throw out event. */
  216. return UGL_STATUS_DROP;
  217. }
  218.     if (pInputEvent == UGL_NULL)
  219.     return UGL_STATUS_DROP;
  220.     memset(pInputEvent, 0, sizeof(*pInputEvent));
  221.     /* fill InputEvent message */
  222.     pInputEvent->id = UGL_INPUT_EVENT_TYPE_KEYBOARD;
  223.     pInputEvent->sourceDevice = (UGL_INPUT_HANDLER *) pDriver;
  224.     pInputEvent->event.keyboard.key = rxChar;
  225.     pInputEvent->event.keyboard.modifiers |= 
  226.     UGL_INPUT_EVENT_KEYBOARD_KEYCAP_STATE;
  227.     /* send input message to UGL input queue */
  228.     uglInputQEventPost (&pInputEvent);
  229.     return OK;
  230.     }