c5509_usb_bind.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:9k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. /*
  10.  *  ======== c5509_usb_bind.c ========
  11.  *  This file implements _mdBindDev function.
  12.  */
  13. #include <std.h>
  14. #include <hwi.h>
  15. #include <iom.h>
  16. #include <csl.h>
  17. #include <csl_usb.h>
  18. #include <c5509_usb.h>
  19. #include <_c5509_usb.h>
  20. /*
  21.  *  ======== control endpoint 0  ========
  22.  *  They are accessed internally in mini-driver code.
  23.  */
  24. USB_EpObj _C5509_USB_usbEpObjIn0, _C5509_USB_usbEpObjOut0;
  25. /*  
  26.  *  ======== global C5509_USB device object ========
  27.  */
  28. _C5509_USB_DevObj _C5509_USB_devObj = {
  29.     FALSE,    /* bus connected if TRUE */
  30.     0,        /* last chapter 9 request */
  31.     /* 
  32.      * channel object handles
  33.      */
  34.     { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  35.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
  36.     /* 
  37.      * Null terminated endpoint ptr array used for CSL initialization
  38.      */
  39.     { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  40.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
  41.     /*
  42.      * USB state information C5509_USB_StateInfo.
  43.      */
  44.     {0,        /* current configuration number */
  45.      0,        /* current interface number */ 
  46.      0,        /* current alternate set number */
  47.      1}        /* current device state, self powered */ 
  48. };
  49. /*
  50.  * ======== _C5509_USB_devParams ========
  51.  *  This pointer points to the device parameter passed by user as a 
  52.  *  parameter of _C5509_USB_mdBindDev(...)
  53.  */
  54. C5509_USB_DevParams *_C5509_USB_devParams;
  55.   
  56. /*  
  57.  * ======== control endpoint 0 handler ========
  58.  *  This function is defined in file c5509_usbiom_usbctrl.c.
  59.  */
  60. extern Void _C5509_USB_usbCtrlHandler();
  61. /*
  62.  * ======== endpoint out 1 handler ========
  63.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_OUT_EP1] due
  64.  *   to lack of context parameter in EP handler function call.
  65.  */
  66. static Void endptOut1Handler( Void ) {
  67.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP1] );
  68. }
  69. /*
  70.  * ======== endpoint out 2 handler ========
  71.  *  We need the wrapper to pass __C5509_USB_devObj.chans[USB_OUT_EP2]
  72.  */
  73. static Void endptOut2Handler( Void ) {
  74.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP2] );
  75. }
  76. /*
  77.  * ======== endpoint out 3 handler ========
  78.  *  We need the wrapper to pass __C5509_USB_devObj.chans[USB_OUT_EP3]
  79.  */
  80. static Void endptOut3Handler( Void ) {
  81.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP3] );
  82. }
  83. /*
  84.  * ======== endpoint out 4 handler ========
  85.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_OUT_EP4]
  86.  */
  87. static Void endptOut4Handler( Void ) {
  88.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP4] );
  89. }
  90. /*
  91.  * ======== endpoint out 5 handler ========
  92.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_OUT_EP5]
  93.  */
  94. static Void endptOut5Handler( Void ) {
  95.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP5] );
  96. }
  97. /*
  98.  * ======== endpoint out 6 handler ========
  99.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_OUT_EP6]
  100.  */
  101. static Void endptOut6Handler( Void ) {
  102.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP6] );
  103. }
  104. /*
  105.  * ======== endpoint out 7 handler ========
  106.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_OUT_EP7]
  107.  */
  108. static Void endptOut7Handler( Void ) {
  109.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_OUT_EP7] );
  110. }
  111. /*
  112.  * ======== endpoint in 1  handler ========
  113.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP1]
  114.  */
  115. static Void endptIn1Handler( Void ) {
  116.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP1] );
  117. }
  118. /*
  119.  * ======== endpoint in 2  handler ========
  120.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP2]
  121.  */
  122. static Void endptIn2Handler( Void ) {
  123.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP2] );
  124. }
  125. /*
  126.  * ======== endpoint in 3  handler ========
  127.  * We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP3]
  128.  */
  129. static Void endptIn3Handler( Void ) {
  130.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP3] );
  131. }
  132. /*
  133.  * ======== endpoint in 4 handler ========
  134.  * We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP4]
  135.  */
  136. static Void endptIn4Handler( Void ) {
  137.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP4] );
  138. }
  139. /*
  140.  * ======== endpoint in 5  handler ========
  141.  * We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP5]
  142.  */
  143. static Void endptIn5Handler( Void ) {
  144.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP5] );
  145. }
  146. /*
  147.  * ======== endpoint in 6  handler ========
  148.  * We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP6]
  149.  */
  150. static Void endptIn6Handler( Void ) {
  151.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP6] );
  152. }
  153. /*
  154.  *  ======== endpoint in 7  handler ========
  155.  *  We need the wrapper to pass _C5509_USB_devObj.chans[USB_IN_EP7]
  156.  */
  157. static Void endptIn7Handler( Void ) {
  158.     _C5509_USB_transactionHandler( _C5509_USB_devObj.chans[USB_IN_EP7] );
  159. }
  160. typedef Void (*EndptHandler)();  /* function pointer type */
  161. /*
  162.  *  ======== Endpoint handler function pointer table ========
  163.  */
  164. static EndptHandler endptHandler[_C5509_USB_ENDPTNUMS] = {
  165.     _C5509_USB_usbCtrlHandler, endptOut1Handler, endptOut2Handler,
  166.     endptOut3Handler, endptOut4Handler, endptOut5Handler, endptOut6Handler,
  167.     endptOut7Handler, _C5509_USB_usbCtrlHandler, endptIn1Handler, endptIn2Handler,
  168.     endptIn3Handler, endptIn4Handler, endptIn5Handler, endptIn6Handler,
  169.     endptIn7Handler
  170. };
  171. /*  
  172.  *  ======== _C5509_USB_mdBindDev ========
  173.  *  It is called during DSP/BIOS initialization to initialize device
  174.  *
  175.  *  *devp is used to output global device object to IOM
  176.  *
  177.  *  devid is device id.
  178.  *
  179.  *  devParams is the device parameter. There is no default device 
  180.  *  parameter. User is required to pass the proper device parameter so 
  181.  *  that the necessary init work can be done.  
  182.  */  
  183. Int _C5509_USB_mdBindDev(Ptr *devp, Int devid, Ptr devParams)
  184. {
  185.     C5509_USB_EpConfig * cfgPtr;
  186.     Int16 i;
  187.     HWI_Attrs hwiAttrs = HWI_ATTRS;
  188.     Int16 status;
  189.     
  190.                       
  191.     *devp = &_C5509_USB_devObj; /* internal device object */
  192.     if (devParams == NULL) {
  193.         return IOM_EBADARGS;
  194.     }
  195.      _C5509_USB_devParams = devParams;
  196.     /*
  197.      * Check for supported driver version(s)
  198.      */
  199.     if (_C5509_USB_devParams->versionId > C5509_USB_VERSION_1) {
  200.         return IOM_EBADIO;
  201.     }
  202.    
  203.    
  204.     /* 
  205.      *  API vector address must be initialized before calling any USB API.
  206.      */
  207.     USB_setAPIVectorAddress(); 
  208.     USB_initPLL(_C5509_USB_devParams->inclk, _C5509_USB_OUTCLK48MHZ, 
  209.             _C5509_USB_devParams->plldiv);    /* init USB clock */ 
  210.     /*
  211.      *  init reserved endpoints EP0 OUT & EP0 IN.
  212.      */
  213.     _C5509_USB_devObj.eps[0] = &_C5509_USB_usbEpObjOut0;
  214.     USB_initEndptObj( USB0, &_C5509_USB_usbEpObjOut0, USB_OUT_EP0, USB_CTRL, 
  215.             _C5509_USB_EP0RSVDSIZE, _C5509_USB_EP0RSVDMASK, 
  216.             _C5509_USB_usbCtrlHandler);
  217.     _C5509_USB_devObj.eps[1] = &_C5509_USB_usbEpObjIn0;
  218.     USB_initEndptObj(USB0, &_C5509_USB_usbEpObjIn0, USB_IN_EP0, USB_CTRL, 
  219.             _C5509_USB_EP0RSVDSIZE, _C5509_USB_EP0RSVDMASK, 
  220.             _C5509_USB_usbCtrlHandler);
  221.     
  222.     cfgPtr =  _C5509_USB_devParams->ifcConfig->epConfig;
  223.     for (i = 0; i < _C5509_USB_devParams->ifcConfig->numEps; i++, cfgPtr++) {
  224.         _C5509_USB_devObj.eps[i + _C5509_USB_NUMEPSRSVD] =  &cfgPtr->chanp->epObj;
  225.        /*
  226.         * init configured endpoints.
  227.         */
  228.         USB_initEndptObj(USB0, &cfgPtr->chanp->epObj, cfgPtr->epNum, 
  229.                 cfgPtr->epType, cfgPtr->epMaxPktLen,
  230.                 cfgPtr->epEvtMask, endptHandler[cfgPtr->epNum]);
  231.     }
  232.     /* init usb module. Only single device(USB0) supported by CSL */
  233.     status = USB_init(USB0, &_C5509_USB_devObj.eps[0], 
  234.             _C5509_USB_devParams->pSofTmrCnt);
  235.     if (status != USB_TRUE) {
  236.         return (IOM_EBADIO);        
  237.     }
  238.        
  239.     /*  
  240.      * Plug & enable the USB device interrupt.
  241.      * For C55x if both ierx masks are equal to one, then mask only self intr.
  242.      */
  243.     hwiAttrs.ier0mask = _C5509_USB_devParams->ier0mask;
  244.     hwiAttrs.ier1mask = _C5509_USB_devParams->ier1mask;
  245.     
  246.     HWI_dispatchPlug(IRQ_EVT_USB, (Fxn)USB_evDispatch, &hwiAttrs);
  247.     IRQ_enable(IRQ_EVT_USB);
  248.     
  249.     return (IOM_COMPLETED);
  250. }