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

VxWorks

开发平台:

C/C++

  1. /* usbTcdLib.c - TCD functional API */
  2. /* Copyright 2000 Wind River Systems, Inc. */
  3. /*
  4. Modification history
  5. --------------------
  6. 01b,23nov99,rcb  Change #include ../xxx references to lower case.
  7. 01a,09aug99,rcb  First.
  8. */
  9. /*
  10. DESCRIPTION
  11. This file defines a generic functional interface to a USB TCD (Target
  12. Controller Driver).  USB TCDs export a single public entry point, their
  13. USB_TCD_EXEC_FUNC.  To this entry point the caller passes a USB_TRB, or
  14. TCD Request Block, which contains a function code identifying a task to
  15. be performed by the TCD and which contains any parameters required for 
  16. the specified function.
  17. This library provides a functional API which to the TCD which hides the
  18. underlying USB_TRBs from the caller.  This simplifies the caller's use
  19. of the TCD. 
  20. Normally, this library is used only by usbTargLib.  Other modules should
  21. have no need to call this library directly.
  22. */
  23. /* includes */
  24. #include "usb/usbPlatform.h"
  25. #include "string.h"
  26. #include "usb/ossLib.h"
  27. #include "drv/usb/target/usbTcd.h"
  28. #include "usb/target/usbTcdLib.h"
  29. /* functions */
  30. /***************************************************************************
  31. *
  32. * trbInit - Initialize a TCD request block
  33. *
  34. * RETURNS: N/A
  35. */
  36. LOCAL VOID trbInit 
  37.     (
  38.     pTRB_HEADER pTrb, 
  39.     pTCD_NEXUS pNexus, 
  40.     UINT16 function,
  41.     UINT16 totalLen
  42.     )
  43.     {
  44.     memset (pTrb, 0, totalLen);
  45.     if (pNexus != NULL)
  46. pTrb->handle = pNexus->handle;
  47.     pTrb->function = function;
  48.     pTrb->trbLength = totalLen;
  49.     }
  50. /***************************************************************************
  51. *
  52. * usbTcdAttach - Attach/initialize a TCD
  53. *
  54. * RETURNS: OK, or ERROR if unable to attach TCD
  55. *
  56. * ERRNO:
  57. *   S_usbTcdLib_BAD_PARAM
  58. */
  59. STATUS usbTcdAttach
  60.     (
  61.     USB_TCD_EXEC_FUNC tcdExecFunc,  /* TCD's primary entry point */
  62.     pVOID tcdParam,     /* TCD-specific param */
  63.     pTCD_NEXUS pNexus,     /* nexus will be initialized on return */
  64.     USB_TCD_MNGMT_CALLBACK mngmtCallback, /* caller's management callback */
  65.     pVOID mngmtCallbackParam,     /* caller-defined mngmt callback param */
  66.     pUINT16 pSpeed,     /* bfr to receive target's speed */
  67.     pUINT16 pNumEndpoints,     /* bfr to receive nbr of endpoints */
  68.     pUSB_TARG_ENDPOINT_INFO *ppEndpoints /* bfr to receive ptr to endpt tbl */
  69.     )
  70.     {
  71.     TRB_ATTACH trb;
  72.     STATUS status;
  73.     /* validate parameters */
  74.     if (tcdExecFunc == NULL || pNexus == NULL || mngmtCallback == NULL ||
  75. pSpeed == NULL || pNumEndpoints == NULL || ppEndpoints == NULL)
  76. return ossStatus (S_usbTcdLib_BAD_PARAM);
  77.     /* Initialize/execute TRB */
  78.     trbInit (&trb.header, NULL, TCD_FNC_ATTACH, sizeof (trb));
  79.     trb.tcdParam = tcdParam;
  80.     trb.mngmtCallback = mngmtCallback;
  81.     trb.mngmtCallbackParam = mngmtCallbackParam;
  82.     status = (*tcdExecFunc) (&trb);
  83.     /* return results */
  84.     pNexus->tcdExecFunc = tcdExecFunc;
  85.     pNexus->handle = trb.header.handle;
  86.     *pSpeed = trb.speed;
  87.     *pNumEndpoints = trb.numEndpoints;
  88.     *ppEndpoints = trb.pEndpoints;
  89.     return status;
  90.     }
  91. /***************************************************************************
  92. *
  93. * usbTcdDetach - Detaches/shuts down TCD
  94. *
  95. * RETURNS: OK, or ERROR if unable to detach TCD
  96. */
  97. STATUS usbTcdDetach
  98.     (
  99.     pTCD_NEXUS pNexus     /* client's nexus */
  100.     )
  101.     {
  102.     TRB_DETACH trb;
  103.     /* initialize/execute trb */
  104.     trbInit (&trb.header, pNexus, TCD_FNC_DETACH, sizeof (trb));
  105.     return (*pNexus->tcdExecFunc) (&trb);
  106.     }
  107. /***************************************************************************
  108. *
  109. * usbTcdEnable - Enables TCD
  110. *
  111. * RETURNS: OK, or ERROR if unable to enable TCD
  112. */
  113. STATUS usbTcdEnable
  114.     (
  115.     pTCD_NEXUS pNexus     /* client's nexus */
  116.     )
  117.     {
  118.     TRB_ENABLE_DISABLE trb;
  119.     /* initialize/execute trb */
  120.     trbInit (&trb.header, pNexus, TCD_FNC_ENABLE, sizeof (trb));
  121.     return (*pNexus->tcdExecFunc) (&trb);
  122.     }
  123. /***************************************************************************
  124. *
  125. * usbTcdDisable - Disables TCD
  126. *
  127. * RETURNS: OK, or ERROR if unable to disable TCD
  128. */
  129. STATUS usbTcdDisable
  130.     (
  131.     pTCD_NEXUS pNexus     /* client's nexus */
  132.     )
  133.     {
  134.     TRB_ENABLE_DISABLE trb;
  135.     /* initialize/execute trb */
  136.     trbInit (&trb.header, pNexus, TCD_FNC_DISABLE, sizeof (trb));
  137.     return (*pNexus->tcdExecFunc) (&trb);
  138.     }
  139. /***************************************************************************
  140. *
  141. * usbTcdAddressSet - Sets device address on the USB
  142. *
  143. * RETURNS: OK, or ERROR if unable to set USB address
  144. */
  145. STATUS usbTcdAddressSet
  146.     (
  147.     pTCD_NEXUS pNexus,     /* client's nexus */
  148.     UINT16 deviceAddress     /* new address for target */
  149.     )
  150.     {
  151.     TRB_ADDRESS_SET trb;
  152.     /* initialize/execute trb */
  153.     trbInit (&trb.header, pNexus, TCD_FNC_ADDRESS_SET, sizeof (trb));
  154.     trb.deviceAddress = deviceAddress;
  155.     return (*pNexus->tcdExecFunc) (&trb);
  156.     }
  157. /***************************************************************************
  158. *
  159. * usbTcdSignalResume - Drives USB RESUME signalling
  160. *
  161. * RETURNS: OK, or ERROR if unable to drive RESUME signalling
  162. */
  163. STATUS usbTcdSignalResume
  164.     (
  165.     pTCD_NEXUS pNexus     /* client's nexus */
  166.     )
  167.     {
  168.     TRB_SIGNAL_RESUME trb;
  169.     /* initialize/execute trb */
  170.     trbInit (&trb.header, pNexus, TCD_FNC_SIGNAL_RESUME, sizeof (trb));
  171.     return (*pNexus->tcdExecFunc) (&trb);
  172.     }
  173. /***************************************************************************
  174. *
  175. * usbTcdEndpointAssign - Assigns an endpoint for subsequent data transfer
  176. *
  177. * RETURNS: OK, or ERROR if unable to assign endpoint.
  178. */
  179. STATUS usbTcdEndpointAssign
  180.     (
  181.     pTCD_NEXUS pNexus,     /* client's nexus */
  182.     UINT16 endpointId,     /* TCD-assigned endpoint ID */
  183.     UINT16 endpointNum,      /* endpoint number to be assigned */
  184.     UINT16 configuration,     /* configuration associated with endpoint */
  185.     UINT16 interface,     /* interface associated with endpoint */
  186.     UINT16 transferType,     /* transfer type for endpoint */
  187.     UINT16 direction     /* direction for endpoint */
  188.     )
  189.     {
  190.     TRB_ENDPOINT_ASSIGN trb;
  191.     /* initialize/execute TRB */
  192.     trbInit (&trb.header, pNexus, TCD_FNC_ENDPOINT_ASSIGN, sizeof (trb));
  193.     trb.endpointId = endpointId;
  194.     trb.endpointNum = endpointNum;
  195.     trb.configuration = configuration;
  196.     trb.interface = interface;
  197.     trb.transferType = transferType;
  198.     trb.direction = direction;
  199.     return (*pNexus->tcdExecFunc) (&trb);
  200.     }
  201. /***************************************************************************
  202. *
  203. * usbTcdEndpointRelease - Release a previously assigned endpoint
  204. *
  205. * RETURNS: OK, or ERROR if unable to release endpoint
  206. */
  207. STATUS usbTcdEndpointRelease
  208.     (
  209.     pTCD_NEXUS pNexus,     /* client's nexus */
  210.     UINT16 endpointId     /* endpointId to release */
  211.     )
  212.     {
  213.     TRB_ENDPOINT_RELEASE trb;
  214.     /* initialize/execute TRB */
  215.     trbInit (&trb.header, pNexus, TCD_FNC_ENDPOINT_RELEASE, sizeof (trb));
  216.     trb.endpointId = endpointId;
  217.     return (*pNexus->tcdExecFunc) (&trb);
  218.     }
  219. /***************************************************************************
  220. *
  221. * usbTcdEndpointStateSet - Sets endpoint stall/unstall state
  222. *
  223. * RETURNS: OK, or ERROR if unable to set endpoint state
  224. */
  225. STATUS usbTcdEndpointStateSet
  226.     (
  227.     pTCD_NEXUS pNexus,     /* client's nexus */
  228.     UINT16 endpointId,     /* endpointId */
  229.     UINT16 state     /* TCD_ENDPOINT_STALL/UNSTALL */
  230.     )
  231.     {
  232.     TRB_ENDPOINT_STATE_SET trb;
  233.     /* initialize/execute TRB */
  234.     trbInit (&trb.header, pNexus, TCD_FNC_ENDPOINT_STATE_SET, sizeof (trb));
  235.     trb.endpointId = endpointId;
  236.     trb.state = state;
  237.     return (*pNexus->tcdExecFunc) (&trb);
  238.     }
  239. /***************************************************************************
  240. *
  241. * usbTcdCurrentFrameGet - Gets current USB frame number
  242. *
  243. * RETURNS: OK, or ERROR if unable to get USB frame number
  244. */
  245. STATUS usbTcdCurrentFrameGet
  246.     (
  247.     pTCD_NEXUS pNexus,     /* client's nexus */
  248.     pUINT16 pFrameNo     /* current frame number */
  249.     )
  250.     {
  251.     TRB_CURRENT_FRAME_GET trb;
  252.     STATUS status;
  253.     /* initialize/execute TRB */
  254.     trbInit (&trb.header, pNexus, TCD_FNC_CURRENT_FRAME_GET, sizeof (trb));
  255.     status = (*pNexus->tcdExecFunc) (&trb);
  256.     /* return results */
  257.     if (pFrameNo != NULL)
  258. *pFrameNo = trb.frameNo;
  259.     return status;
  260.     }
  261. /***************************************************************************
  262. *
  263. * usbTcdErpSubmit - Submits a USB_ERP for execution
  264. *
  265. * RETURNS: OK, or ERROR if unable to submit ERP
  266. */
  267. STATUS usbTcdErpSubmit
  268.     (
  269.     pTCD_NEXUS pNexus,     /* client's nexus */
  270.     pUSB_ERP pErp     /* ERP to be executed */
  271.     )
  272.     {
  273.     TRB_ERP_SUBMIT trb;
  274.     /* initialize/execute TRB */
  275.     trbInit (&trb.header, pNexus, TCD_FNC_ERP_SUBMIT, sizeof (trb));
  276.     trb.pErp = pErp;
  277.     return (*pNexus->tcdExecFunc) (&trb);
  278.     }
  279. /***************************************************************************
  280. *
  281. * usbTcdErpCancel - Cancels a USB_ERP
  282. *
  283. * RETURNS: OK, or ERROR if unable to cancel ERP
  284. */
  285. STATUS usbTcdErpCancel
  286.     (
  287.     pTCD_NEXUS pNexus,     /* client's nexus */
  288.     pUSB_ERP pErp     /* ERP to be canceled */
  289.     )
  290.     {
  291.     TRB_ERP_CANCEL trb;
  292.     /* initialize/execute TRB */
  293.     trbInit (&trb.header, pNexus, TCD_FNC_ERP_CANCEL, sizeof (trb));
  294.     trb.pErp = pErp;
  295.     return (*pNexus->tcdExecFunc) (&trb);
  296.     }
  297. /* End of file. */