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

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_ctrl.c ========
  11.  *  This file implements control endpoint 0 handler. 
  12.  */
  13. #include <std.h>
  14. #include <hwi.h>
  15. #include <csl.h>
  16. #include <csl_usb.h>
  17. #include <c5509_usb.h>
  18. #include <_c5509_usb.h>
  19.   
  20. /*
  21.  * Data structure to hold USB setup packet.  
  22.  * Used by USB CSL USB_getSetupPacket() Fxn. 
  23.  */
  24. USB_SetupStruct _C5509_USB_usbSetup = {0, 0, 0, 0, 0, 0};
  25. /*
  26.  *  ======== standard USB Request Table ========
  27.  *  USB control endpoint 0 handler parses through this table. It calls
  28.  *  back to application with the default handler that matches the request 
  29.  *  sent by the host.
  30.  *  This table is declared in file c5509_usb_reqhndlr.c
  31.  */
  32. extern _C5509_USB_UsbRequestStruct _C5509_USB_usbReqTable[];
  33.  
  34. /*
  35.  *  ======== _C5509_USB_usbReqUnknown ========
  36.  *  Respond to unknown requests. By default, it returns C5509_USB_REQUEST_STALL
  37.  *   to stall endpoint 0.
  38.  */
  39. C5509_USB_UsbReqRet _C5509_USB_usbReqUnknown()
  40. {
  41.     C5509_USB_UsbReqRet retStat = C5509_USB_REQUEST_DONE;
  42.     if (_C5509_USB_usbSetup.New) {
  43.         /* 
  44.          * The request is either not known or not supported.
  45.          * Request the usb control endpoint handler 
  46.          *  to stall the endpoint
  47.          */
  48.         retStat = C5509_USB_REQUEST_STALL;
  49.     }
  50.     return(retStat);
  51. }
  52. /* 
  53.  * initialize the request handler function ptr to _C5509_USB_usbReqUnknown().
  54.  */
  55. C5509_USB_UsbReqHandler fpRequestHandler = _C5509_USB_usbReqUnknown;
  56. /*
  57.  *  ======== C5509_USB_resetEventHandler ========
  58.  *  Host requests device to reset
  59.  *  This function free all packets and complet IOM_FLUSH for all 
  60.  *  channels. It then re-init usb module, set device state to default.
  61.  */
  62. Void C5509_USB_resetEventHandler() 
  63. {
  64.     Uns imask;
  65.     /* stop all data transfer activities */
  66.     USB_abortAllTransaction(USB0);
  67.     
  68.     /* free all packets and complete IOM_FLUSH for all channels */
  69.     imask = HWI_disable();
  70.     _C5509_USB_freeAllPackets();
  71.     HWI_restore(imask);
  72.         
  73.     /* re-init usb module, set state to default */
  74.     _C5509_USB_reInitUsb();
  75. }
  76. /*
  77.  *  ======== C5509_USB_suspendEventHandler ========
  78.  *  Host requests device to suspend
  79.  */
  80. Void C5509_USB_suspendEventHandler(){
  81.     /* 
  82.      *  we do nothing here 
  83.      *  application can extend the functionality
  84.      */
  85. }
  86. /*
  87.  * ======== control endpoint 0 handler ========
  88.  */
  89. Void _C5509_USB_usbCtrlHandler()
  90. {
  91.     C5509_USB_UsbReqRet reqHandlerRet = C5509_USB_REQUEST_DONE;
  92.     USB_EVENT_MASK  usbCtrlEvents;
  93.     USB_EpHandle hEp0In = &_C5509_USB_usbEpObjIn0;
  94.     USB_EpHandle hEp0Out = &_C5509_USB_usbEpObjOut0;
  95.     
  96.     /* find out the control endpoint EP0 event */
  97.     usbCtrlEvents = (USB_getEvents(hEp0Out) | USB_getEvents(hEp0In));
  98.   
  99.     /* 
  100.      * if the USB reset request received, abort all endpoint activities
  101.      * and reconfigure the USB module
  102.      */ 
  103.     if (usbCtrlEvents & USB_EVENT_RESET)  {  /* USB RESET event */
  104.   
  105.         /*
  106.          * host is requesting reset.
  107.          */
  108.         if (_C5509_USB_devParams->deviceConfig->eventHandler != NULL) {
  109.             /* Call configured event handler */
  110.              _C5509_USB_devParams->deviceConfig->eventHandler(USB_EVENT_RESET, 
  111.                      C5509_USB_resetEventHandler);
  112.         }
  113.         else {   /* use default handler */
  114.              C5509_USB_resetEventHandler();
  115.         }
  116.     }
  117.   
  118.     if (usbCtrlEvents & USB_EVENT_SUSPEND) {  /* USB SUSPEND event */
  119.   
  120.         /*
  121.          *  host is requesting suspend
  122.          */
  123.         if (_C5509_USB_devParams->deviceConfig->eventHandler != NULL) {
  124.             _C5509_USB_devParams->deviceConfig->eventHandler(USB_EVENT_SUSPEND,
  125.                      C5509_USB_suspendEventHandler );
  126.         }
  127.         else {
  128.             C5509_USB_suspendEventHandler();   /* call default handler */
  129.         }
  130.     }
  131.   
  132.     /* 
  133.      *  If the event is a setup packet received event then read the setup 
  134.      *  packet, and lookup the usbReqTable[] and user defined table for 
  135.      *  the appropriate request handler
  136.      */
  137.     if ((usbCtrlEvents & USB_EVENT_SETUP) == USB_EVENT_SETUP) {
  138.         /* 
  139.          *  read the setup packet, if something wrong with setup packet
  140.          *  then stall the control endpints
  141.          */
  142.         if ( USB_getSetupPacket( USB0, &_C5509_USB_usbSetup) == USB_FALSE) {
  143.             reqHandlerRet = C5509_USB_REQUEST_STALL;
  144.         }
  145.         else {  
  146.             /* 
  147.              * Get last request from USB setup packet.. 
  148.              * See USB 1.x spec Ch 9 for data formats. 
  149.              */
  150.             _C5509_USB_devObj.lastRequest =
  151.                     ((_C5509_USB_usbSetup.bmRequestType & 0xC0) <<8) |
  152.                     _C5509_USB_usbSetup.bRequest;
  153.             /* 
  154.              * lookup the USB request handler 
  155.              */
  156.             fpRequestHandler =
  157.                  _C5509_USB_usbLookupReqHandler(_C5509_USB_devObj.lastRequest);
  158.       
  159.             /* 
  160.              *  pass the default request handler,
  161.              *  notify application that there is a setup event 
  162.              *  application can extend the functionality
  163.              *  or override the default request handler
  164.              */
  165.             if (_C5509_USB_devParams->deviceConfig->setupEventHandler !=NULL) {
  166.                 reqHandlerRet = 
  167.                         _C5509_USB_devParams->deviceConfig->setupEventHandler(
  168.                                 _C5509_USB_devObj.lastRequest, 
  169.                                 fpRequestHandler, &_C5509_USB_usbSetup);
  170.             }
  171.             else {
  172.                 reqHandlerRet = fpRequestHandler();  /* call defualt handler */
  173.             }
  174.         }
  175.    
  176.     }   /* end of if setup event received */
  177.        
  178.     /*
  179.      *  based on the return value from the called request handler routine
  180.      *  send ACK, stall endpoint, or do nothing.
  181.      */
  182.     switch (reqHandlerRet) {
  183.         /* 
  184.          *  the request handler routine successfully completed the task,
  185.          *  send a 0-byte ACK
  186.          */
  187.         case C5509_USB_REQUEST_SEND_ACK :
  188.             USB_postTransaction( hEp0In, 0, NULL, USB_IOFLAG_NONE);
  189.             break;
  190.                    
  191.         case C5509_USB_REQUEST_DATA_OUT :
  192.             break;
  193.          
  194.             /* 
  195.              *  the request handler routine successfully completed the task,
  196.              *  get a 0-byte ACK
  197.              */
  198.         case C5509_USB_REQUEST_GET_ACK :
  199.             USB_postTransaction( hEp0Out, 0, NULL, USB_IOFLAG_NONE);  
  200.             break;
  201.         case C5509_USB_REQUEST_DATA_IN :
  202.             break;
  203.       
  204.         /*  
  205.          *  the request handler does not know what to do with the setup 
  206.          *  packet, stall the control endpoints
  207.          */
  208.         case C5509_USB_REQUEST_STALL :
  209.             USB_stallEndpt(hEp0Out);
  210.             USB_stallEndpt(hEp0In);
  211.             break;
  212.          
  213.         case C5509_USB_REQUEST_DONE :
  214.             break;
  215.         default:
  216.             fpRequestHandler = _C5509_USB_usbReqUnknown;
  217.     }
  218.     /* clear the flags if a new setup packet is received */
  219.     if (_C5509_USB_usbSetup.New) {
  220.         _C5509_USB_usbSetup.New = 0;
  221.     }
  222. }
  223. /*
  224.  *  ======== _C5509_USB_usbLookupReqHandler ========
  225.  *  This function parse through the usbReqTable and 
  226.  *  pickup the address of that particular request handler
  227.  *  request: the first 2 bytes of USB setup packet
  228.  */
  229. C5509_USB_UsbReqHandler _C5509_USB_usbLookupReqHandler(Uint16 request)
  230. {
  231.     Uint16 i;
  232.   
  233.     /* parse thru the end of request handler table */                                                        
  234.     for (i=0; _C5509_USB_usbReqTable[i].usbReqHandler != NULL; i++) {
  235.         /* if request handler exists 
  236.          * return a pointer to the request handler routine
  237.          */
  238.         if(_C5509_USB_usbReqTable[i].request == request) {
  239.             return (_C5509_USB_usbReqTable[i].usbReqHandler);
  240.         }
  241.     }
  242.   
  243.     /* 
  244.      * if request handler does not exist, 
  245.      * return a pointer to the usbReqUnknown routine
  246.      */
  247.     return (_C5509_USB_usbReqUnknown);   
  248. }