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

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_mdControlChan.c ========
  11.  *  This file inmplements the _mdControlChan() function 
  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.  *  ======== connectDevice ========
  21.  *  This function calls USB_connectDev to pull up D+ wire so that bus 
  22.  *  enumeration starts by the host.
  23.  *  Call with INTRs enabled.
  24.  */
  25. Void connectDevice(C5509_USB_ChanHandle chan, C5509_USB_AppCallback * cbFxn)
  26. {   
  27.  
  28.     USB_connectDev(USB0);    /* connect it to upstream port */
  29.     if (cbFxn != NULL) {
  30.         /* save away fxn and arg to call when we are connected */
  31.         chan->fxnConnect = cbFxn->fxn;
  32.         chan->argConnect = cbFxn->arg;
  33.         /*
  34.          *  Check if host has already enumerated USB.
  35.          *  busConnected is set after host reads the USB config desc.
  36.          */
  37.         if (_C5509_USB_devObj.busConnected == TRUE) {
  38.             /* call connect fxn with arg */
  39.             chan->fxnConnect(chan->argConnect);
  40.         }
  41.     }
  42.     else {
  43.         /* no callback specified so spin until bus connected ! */
  44.         while (_C5509_USB_devObj.busConnected == FALSE);       
  45.     }    
  46. }
  47. /* 
  48.  *  ======== _C5509_USB_freeAllPackets ========
  49.  *  This function is called to free packets and complete IOM_FLUSH 
  50.  *  for all channels
  51.  */
  52. Void _C5509_USB_freeAllPackets()
  53. {
  54.     Int i;
  55.     C5509_USB_ChanHandle chan;
  56.     
  57.     for (i=1; i < _C5509_USB_ENDPTNUMS; i++) {
  58.         chan = _C5509_USB_devObj.chans[i];
  59.         if (chan) {
  60.             
  61.             /* abort all pending I/Os */
  62.             _C5509_USB_removePackets( chan, IOM_ABORTED );
  63.             
  64.             /* complete IOM_FLUSH if any */
  65.             _C5509_USB_flushPacketHandler( chan, chan->flushPacket );
  66.         }
  67.     }
  68. }
  69. /*
  70.  *  ========= resetDevice ========
  71.  *  This function is called to reset the USB device.
  72.  *  Call with INTRs disabled.
  73.  */
  74. Void resetDevice()
  75. {
  76.         
  77.     /* stop all data transfer activities */
  78.     USB_abortAllTransaction(USB0);
  79.     
  80.     /* reset device h/w and disconnect it from host */
  81.     USB_resetDev(USB0); 
  82.     
  83.     /* return packets and complete IOM_FLUSH for all channels */
  84.     _C5509_USB_freeAllPackets();
  85.     _C5509_USB_devObj.busConnected = FALSE; 
  86. }
  87. /*
  88.  *  ======== _C5509_USB_reInitUsb ========
  89.  *  This function re-initializes usb module, set device state to default state.
  90.  */
  91. Void _C5509_USB_reInitUsb() 
  92. {
  93.     /* reset device config number */
  94.     _C5509_USB_devObj.stateInfo.usbCurConfig = 0x00;  
  95.     
  96.     /* reset Alt Setting number */
  97.     _C5509_USB_devObj.stateInfo.usbCurAltSet = 0x00; 
  98.   
  99.     /* reconfig the USB module */
  100.     USB_init(USB0, &_C5509_USB_devObj.eps[0], _C5509_USB_devParams->pSofTmrCnt);
  101. }
  102. /*
  103.  *  ======== _C5509_USB_mdControlChan ========
  104.  *  This function preforms various device dependent operations.
  105.  *
  106.  *  chanp is the point to the chanObj
  107.  *
  108.  *  cmd is the control command
  109.  *
  110.  *  args is the optional argument.
  111.  *
  112.  *  
  113.  *  IOM_CHAN_RESET and IOM_CHAN_TIMEDOUT are handled in the same way.
  114.  *  It aborts all pending I/Os and completes any IOM_FLUSHing . 
  115.  *
  116.  *  IOM_DEVICE_RESET dis-connects the device from host, aborts all 
  117.  *   pending I/Os, completes all IOM_FLUSHes.
  118.  *  It then re-init the usb module. After that, application should 
  119.  *   re-create channels and re-connect device to start I/O again.
  120.  *
  121.  *  C5509_USB_DEVICECONNECT call connectDevice to re-start bus enumeration.
  122.  *
  123.  *  C5509_USB_GETSTATEINFO returns USB state information in the 
  124.  *   C5509_USB_StateInfo structure passed in by the application provide arg.
  125.  *  If arg is NULL an error status is returned.
  126.  */
  127. Int _C5509_USB_mdControlChan(Ptr chanp, Uns cmd, Ptr args)
  128. {
  129.     C5509_USB_ChanHandle chan = chanp;
  130.     Uns imask;
  131.     C5509_USB_AppCallback * connectCb;
  132.     C5509_USB_StateInfo * stateInfo;
  133.     Int status = IOM_COMPLETED;
  134.         
  135.     switch(cmd) {
  136.         case IOM_CHAN_RESET:
  137.         case IOM_CHAN_TIMEDOUT:
  138.                   
  139.             /* discard all pending IO packets */
  140.             imask = HWI_disable();    /* disable INTRs */   
  141.             _C5509_USB_removePackets(chan, IOM_ABORTED);
  142.             _C5509_USB_flushPacketHandler( chan, chan->flushPacket);
  143.             HWI_restore(imask);
  144.             break;
  145.         case IOM_DEVICE_RESET:
  146.             imask = HWI_disable();    /* disable INTRs */   
  147.             resetDevice();            /* reset device  */
  148.             HWI_restore(imask);       
  149.             /* 
  150.              * re-init usb module, set state to default 
  151.              */
  152.             _C5509_USB_reInitUsb();    
  153.             break;
  154.         case C5509_USB_DEVICECONNECT:
  155.             connectCb = args;
  156.             connectDevice(chan, connectCb);    /* connect the device */
  157.             break;
  158.                      
  159.         case C5509_USB_GETSTATEINFO:
  160.    
  161.             if (args == NULL) {
  162.                 return (IOM_EBADARGS);
  163.             }
  164.           
  165.             stateInfo =  (C5509_USB_StateInfo *)args;
  166.             imask = HWI_disable();    /* disable INTRs */
  167.             *stateInfo = _C5509_USB_devObj.stateInfo; /* copy to user struct */
  168.             HWI_restore(imask);       
  169.             break;
  170.         default:
  171.             status = IOM_ENOTIMPL;    /* cmd has not been implemented */
  172.             break;
  173.     } /* end switch */
  174.     return status;
  175. }