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

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.11.00.00 11-04-03 (ddk-b13)" */
  9. /*
  10.  * ======== c5509_usb_reqhndlr.c ======== 
  11.  * This file defines USB Chapter 9 default device request handlers.         
  12.  */
  13. #include <std.h>
  14. #include <string.h>
  15. #include <csl.h>
  16. #include <csl_usb.h>
  17. #include <_c5509_usb.h>
  18. #include <c5509_usb.h>
  19. /*
  20.  * data buffer to send/receive status data to host.
  21.  * first 2 bytes for xfer byte count next 8 bytes are for usb data 
  22.  */
  23. static Uint16 genPurposeBuffer[5]; 
  24. /*
  25.  * USB  requests handlers
  26.  */
  27. static C5509_USB_UsbReqRet usbReqGetDescriptor();
  28. static C5509_USB_UsbReqRet usbReqSetAddress();
  29. static C5509_USB_UsbReqRet usbReqSetConfiguration();
  30. static C5509_USB_UsbReqRet usbReqGetInterface();
  31. static C5509_USB_UsbReqRet usbReqGetConfiguration();
  32. static C5509_USB_UsbReqRet usbReqGetStatus();
  33. static C5509_USB_UsbReqRet usbReqClearSetFeature();
  34. static C5509_USB_UsbReqRet usbReqSetInterface();
  35. /*
  36.  * ======== standard USB Request Table ========
  37.  * USB control endpoint 0 parses through this table and pass the 
  38.  *  appropriate default handler via callback to application.
  39.  */
  40. _C5509_USB_UsbRequestStruct _C5509_USB_usbReqTable[] = {
  41.     { _C5509_USB_REQUEST_GET_STATUS         , usbReqGetStatus },
  42.     { _C5509_USB_REQUEST_CLEAR_FEATURE      , usbReqClearSetFeature },
  43.     { _C5509_USB_REQUEST_SET_FEATURE        , usbReqClearSetFeature },
  44.     { _C5509_USB_REQUEST_SET_ADDRESS        , usbReqSetAddress },
  45.     { _C5509_USB_REQUEST_GET_DESCRIPTOR     , usbReqGetDescriptor },
  46.     { _C5509_USB_REQUEST_SET_DESCRIPTOR     , _C5509_USB_usbReqUnknown }, 
  47.     { _C5509_USB_REQUEST_GET_CONFIGURATION  , usbReqGetConfiguration },
  48.     { _C5509_USB_REQUEST_SET_CONFIGURATION  , usbReqSetConfiguration },
  49.     { _C5509_USB_REQUEST_GET_INTERFACE      , usbReqGetInterface },
  50.     { _C5509_USB_REQUEST_SET_INTERFACE      , usbReqSetInterface },
  51.     { _C5509_USB_REQUEST_SYNC_FRAME         , _C5509_USB_usbReqUnknown }, 
  52.     { 0, NULL }  /* table must terminate with a NULL member */                         
  53. };
  54. /*
  55.  * ======== usbReqSetAddress ========
  56.  * set device address request
  57.  */
  58. static C5509_USB_UsbReqRet usbReqSetAddress()
  59. {
  60.     /* 
  61.      * set new device address sent in 
  62.      * the wValue field of the setup packet 
  63.      */
  64.     USB_setDevAddr(USB0, (Uint16)(_C5509_USB_usbSetup.wValue));
  65.   
  66.     return( C5509_USB_REQUEST_SEND_ACK );
  67. }
  68. /*
  69.  * ======== usbReqSetConfiguration ========
  70.  * Set/clear active configuration of the USB device
  71.  */
  72. static C5509_USB_UsbReqRet usbReqSetConfiguration()
  73. {
  74.     C5509_USB_UsbReqRet retStat;
  75.     /* single configuration supported only */
  76.     if((_C5509_USB_usbSetup.wValue ==0) || (_C5509_USB_usbSetup.wValue ==1)) {
  77.         _C5509_USB_devObj.stateInfo.usbCurConfig = _C5509_USB_usbSetup.wValue;
  78.     
  79.         retStat = C5509_USB_REQUEST_SEND_ACK;
  80.     }  
  81.     else {
  82.       
  83.         retStat = C5509_USB_REQUEST_STALL;
  84.     }
  85.     return (retStat);
  86. }
  87. /*
  88.  * ======== usbReqSetInterface ========
  89.  * Set/clear active interface of the USB device 
  90.  */
  91. static C5509_USB_UsbReqRet usbReqSetInterface()
  92. {
  93.     C5509_USB_UsbReqRet retStat = C5509_USB_REQUEST_STALL;
  94.     /* 
  95.      *  decode the requested feature
  96.      *  only Interface 0 and single configuration supported 
  97.      */
  98.     if((_C5509_USB_usbSetup.wIndex == 0) &&
  99.             (_C5509_USB_devObj.stateInfo.usbCurConfig == 1)) {
  100.         if((_C5509_USB_usbSetup.wValue==0) || (_C5509_USB_usbSetup.wValue==1)) {  
  101.             _C5509_USB_devObj.stateInfo.usbCurAltSet = _C5509_USB_usbSetup.wValue;
  102.             retStat = C5509_USB_REQUEST_SEND_ACK;
  103.         }  
  104.     } 
  105.     return( retStat );
  106. }
  107. /*
  108.  * ======== usbReqClearSetFeature ========
  109.  * Clear or Set standard device features
  110.  */
  111. static C5509_USB_UsbReqRet usbReqClearSetFeature()
  112. {
  113.     USB_EpHandle hEPx;
  114.     Uint16 endpt;                
  115.     C5509_USB_UsbReqRet retStat = C5509_USB_REQUEST_SEND_ACK;
  116.     USB_Boolean bFeature = USB_TRUE; /* USB_TRUE, set feature */
  117.     if( _C5509_USB_devObj.lastRequest == _C5509_USB_REQUEST_CLEAR_FEATURE ){
  118.        /* clear or set feature?*/
  119.        bFeature = USB_FALSE;
  120.     }
  121.   
  122.     /* decode the requested feature */
  123.     switch (_C5509_USB_usbSetup.wValue) {
  124.         case _C5509_USB_FEATURE_ENDPOINT_STALL:
  125.             
  126.             /* retrieve the endpoint number */
  127.             endpt = (_C5509_USB_usbSetup.wIndex) & 0xFF;
  128.       
  129.             /* retrieve the handle associated with the endpoint */
  130.             hEPx = USB_epNumToHandle( USB0, endpt );
  131.       
  132.             if (bFeature) {
  133.                 /* stall endpoint */
  134.                 USB_stallEndpt( hEPx );
  135.             }
  136.             else {
  137.                 /* clear stall of the endpoint */
  138.                 USB_clearEndptStall(hEPx);
  139.             }
  140.             break;
  141.     
  142.     case _C5509_USB_FEATURE_REMOTE_WAKEUP:
  143.     
  144.         /* disable / enable remote wakeup */
  145.         USB_setRemoteWakeup(USB0, bFeature);
  146.         break;
  147.    
  148.     default:
  149.     
  150.       retStat = C5509_USB_REQUEST_STALL;
  151.     
  152.     } /* end switch */
  153.     return(retStat);
  154. }
  155. /*
  156.  * ======== usbReqGetStatus ========
  157.  * Handle standard device request GET_STATUS
  158.  */
  159. static C5509_USB_UsbReqRet usbReqGetStatus()
  160. {
  161.     USB_EpHandle hEPx;
  162.     Uint16 endpt; 
  163.     
  164.     switch (_C5509_USB_usbSetup.bmRequestType - 0x80) {
  165.         case 0:       /* return Device Status */
  166.            
  167.             genPurposeBuffer[1] = 
  168.                     (((Uint16)USB_getRemoteWakeupStat(USB0) ) << 1) |
  169.                      _C5509_USB_devObj.stateInfo.usbCurDev;
  170.             break;
  171.         
  172.         case 1:           /* return Interface status */
  173.             
  174.             genPurposeBuffer[1] = _C5509_USB_devObj.stateInfo.usbCurIntrfc;
  175.             break;
  176.         
  177.         case 2:           /* return Endpoint status */
  178.     
  179.             endpt = (_C5509_USB_usbSetup.wIndex) & 0xFF;
  180.             hEPx =  USB_epNumToHandle( USB0, endpt );
  181.             genPurposeBuffer[1] = (Uint16)USB_getEndptStall(hEPx);
  182.             break;
  183.         
  184.         default:
  185.         /* 
  186.          *  Unsupported feature.
  187.          */
  188.         return (C5509_USB_REQUEST_STALL);  
  189.     }
  190.   
  191.     /* post transaction to send the requested data to host */ 
  192.     USB_postTransaction( &_C5509_USB_usbEpObjIn0, 2, 
  193.             genPurposeBuffer, USB_IOFLAG_NONE);
  194.   
  195.     return ( C5509_USB_REQUEST_GET_ACK );
  196. }
  197. /* 
  198.  * ======== usbReqGetConfigurationInterface ========
  199.  * Return current device configuration value
  200.  */
  201. static C5509_USB_UsbReqRet usbReqGetConfiguration()
  202. {
  203.     /* Send the current Configuration Value */
  204.     genPurposeBuffer[1] = _C5509_USB_devObj.stateInfo.usbCurConfig;
  205.   
  206.     USB_postTransaction( &_C5509_USB_usbEpObjIn0, 1, genPurposeBuffer,
  207.             USB_IOFLAG_NONE | USB_IOFLAG_NOSHORT );                      
  208.     return( C5509_USB_REQUEST_GET_ACK );
  209. }
  210. /* 
  211.  * ======== usbReqGetConfigurationInterface ========
  212.  * Return current interface alternate set value
  213.  */
  214. static C5509_USB_UsbReqRet usbReqGetInterface()
  215. {
  216.  
  217.     /* Send the current Interface alternate set Value */
  218.     genPurposeBuffer[1] = _C5509_USB_devObj.stateInfo.usbCurAltSet;
  219.   
  220.     USB_postTransaction( &_C5509_USB_usbEpObjIn0, 1, genPurposeBuffer,
  221.             USB_IOFLAG_NONE | USB_IOFLAG_NOSHORT );                      
  222.     return( C5509_USB_REQUEST_GET_ACK );
  223. }
  224. /*
  225.  * ======== usbReqGetDescriptor ========
  226.  * Return requested descriptor
  227.  */
  228. static C5509_USB_UsbReqRet usbReqGetDescriptor( )
  229. {
  230.     Uint16 dval;
  231.     Uint16 inoutFlag = USB_IOFLAG_NONE ;
  232.     Bool setInitDone = FALSE;
  233.     String * strDesc;
  234.     Void * dataPtr;
  235.     C5509_USB_ChanHandle chan;
  236.     Int i;
  237.     switch (_C5509_USB_usbSetup.wValue >> 8) {
  238.         case C5509_USB_DESCRIPTOR_DEVICE:    /* send device descriptor */
  239.       
  240.             dataPtr = _C5509_USB_devParams->deviceConfig->deviceDesc;
  241.             dval = ((Uint16*)dataPtr)[1] & 0xFF;
  242.             break;    
  243.         case C5509_USB_DESCRIPTOR_CONFIG:    /* send config descriptor */
  244.         
  245.             /* config descriptor is made of linked lists */
  246.             inoutFlag = ( USB_IOFLAG_LNK | USB_IOFLAG_CAT );
  247.             dataPtr = _C5509_USB_devParams->ifcConfig->usbConfig;
  248.             dval = _C5509_USB_devParams->ifcConfig->usbConfig->pBuffer[2]; 
  249.             if ((dval == _C5509_USB_usbSetup.wLength) || 
  250.                 ((_C5509_USB_usbSetup.wLength % _C5509_USB_EP0RSVDSIZE) == 0 )) {
  251.                     inoutFlag |= USB_IOFLAG_NOSHORT;
  252.             }
  253.          
  254.             setInitDone = TRUE;
  255.             break;
  256.         case C5509_USB_DESCRIPTOR_STRING:    /* send string descriptor */
  257.             if( (_C5509_USB_usbSetup.wValue & 0xFF) == 0) {
  258.                 /* LANGID Language Codes */
  259.            
  260.                 dataPtr = _C5509_USB_devParams->deviceConfig->stringDescLangId;
  261.                 dval = ((Uint16*)dataPtr)[1] & 0xFF;
  262.             }
  263.             else {
  264.                 /* strlen of the string requested */
  265.                 strDesc = _C5509_USB_devParams->deviceConfig->stringDesc;
  266.                 dval = strlen( strDesc[_C5509_USB_usbSetup.wValue & 0xFF] ) * 
  267.                         2 - 2 ;
  268.            
  269.                 /* select the smaller of the two */
  270.                 dval = (dval < _C5509_USB_usbSetup.wLength) ? dval : 
  271.                         _C5509_USB_usbSetup.wLength;
  272.            
  273.                 /* 
  274.                  * Insert descriptor type and length in the
  275.                  * first two bytes of string dscriptor
  276.                  */
  277.                 strDesc[_C5509_USB_usbSetup.wValue & 0xFF][1] = 
  278.                         (C5509_USB_DESCRIPTOR_STRING<<8) | dval;
  279.                
  280.                 dataPtr = &strDesc[_C5509_USB_usbSetup.wValue & 0xFF][0];
  281.             }
  282.             break;
  283.         
  284.         default:
  285.             return(C5509_USB_REQUEST_STALL);
  286.     }
  287.     /* select the smaller of two */
  288.     dval = (dval < _C5509_USB_usbSetup.wLength) ? dval : 
  289.             _C5509_USB_usbSetup.wLength;
  290.     USB_postTransaction(&_C5509_USB_usbEpObjIn0, dval, dataPtr, inoutFlag);
  291.   
  292.     /* 
  293.      * set _C5509_USB_devObj.busConnected = TRUE if configuration descriptor is 
  294.      *   sent to host.
  295.      */
  296.     _C5509_USB_devObj.busConnected = setInitDone;
  297.     
  298.     if (setInitDone == TRUE) {
  299.         /* 
  300.          * Call registered connect callback function to notify application 
  301.          *  thread(s) that we are now ready to communicate over USB.
  302.          */
  303.         for (i = _C5509_USB_NUMEPSRSVD; i < _C5509_USB_ENDPTNUMS; i++) {
  304.             if ((chan = _C5509_USB_devObj.chans[i]) != NULL) {
  305.                 if (chan->fxnConnect) {
  306.                     /* Call registered connect callback function */ 
  307.                     chan->fxnConnect(chan->argConnect);
  308.                 }
  309.             }
  310.         }
  311.     }
  312.     return(C5509_USB_REQUEST_GET_ACK);
  313. }