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

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_mdCreateChan.c ========
  11.  *  This file implements C5509_USB_mdCreateChan() function 
  12.  */
  13. #include <std.h>
  14. #include <que.h>
  15. #include <iom.h>
  16. #include <mem.h>
  17. #include <csl.h>
  18. #include <csl_usb.h>
  19. #include <_c5509_usb.h>
  20. #include <c5509_usb.h>
  21. /*
  22.  * ======== _C5509_USB_mdCreateChan ========
  23.  * This function is called to open a channel.
  24.  *  
  25.  *  chanp is used to output initialized channel object to IOM.
  26.  *  
  27.  *  devp is the global device object
  28.  *
  29.  *  name is the device string name
  30.  *
  31.  *  mode is IOM_INPUT or IOM_OUTPUT. Other mode is illegal.
  32.  *
  33.  *  chanParams are optional channel specific parameters, but not used.
  34.  *  
  35.  *  cbFxn and cbArg is the IOM callback pointer and argument
  36.  */
  37. Int _C5509_USB_mdCreateChan(Ptr * chanp, Ptr devp, String name, Int mode, 
  38.         Ptr chanParams, IOM_TiomCallback cbFxn,Ptr cbArg) 
  39. {   
  40.     C5509_USB_ChanHandle  chan;
  41.     Uint16      epNum;
  42.     C5509_USB_EpConfig * cfgPtr;              
  43.     _C5509_USB_DevHandle port = (_C5509_USB_DevHandle)devp;
  44.     Int i; 
  45.     
  46.     if (chanp == NULL ) {
  47.         return IOM_EBADARGS;
  48.     }
  49.     *chanp = NULL;  /* make sure NULL on error */
  50.     epNum = (Uint16)*name - 0x30;  /* atoi - ascii conversion shortcut */
  51.     /* 
  52.      * Return error if user supplied illegal endpoint #
  53.      * Note Endpoint 0 IN & OUTis reserved for driver control channel.
  54.      */
  55.     if ((epNum < USB_OUT_EP1) || (epNum > USB_OUT_EP7)) {  
  56.         return IOM_EBADIO;
  57.     }
  58.     if (mode == IOM_OUTPUT) { /* to host */
  59.         epNum |= 0x08;    /* USB_IN_EP1...USB_IN_EP7  */
  60.     } 
  61.  
  62.     /* Get this endpoint number from configured EP list */
  63.     cfgPtr =  _C5509_USB_devParams->ifcConfig->epConfig;
  64.     for (i = 0; i < _C5509_USB_devParams->ifcConfig->numEps; i++, cfgPtr++) {
  65.     
  66.         if (epNum == cfgPtr->epNum) {           
  67.             if (port->chans[i]) {
  68.                 return (IOM_EBADIO);    /* ERROR! channel is already open! */
  69.             }
  70.             chan = cfgPtr->chanp;
  71.             break;
  72.         }
  73.         if (i == (_C5509_USB_devParams->ifcConfig->numEps - 1)) {
  74.             return IOM_EBADIO;   /* not in user EP configuration */
  75.         }
  76.     }
  77.         
  78.     QUE_new( &chan->pendList );    /* initialize pend list */
  79.     chan->cbFxn = cbFxn;    /* IOM call back */
  80.     chan->cbArg = cbArg;    /* call back arg */   
  81.     chan->mode = mode;    /* mode */ 
  82.     chan->dataPacket = NULL;    /* dataPacket */
  83.     chan->flushPacket = NULL;   /* flushPacket */
  84.     chan->fxnConnect = NULL;    /* fxn called when bus enum is complete */
  85.     chan->argConnect = NULL;    /* argument to fxnConnect */
  86.     port->chans[epNum] = chan;  /* remember this chan is open */
  87.     *chanp = chan;    /* output chan to IOM */
  88.             
  89.     return (IOM_COMPLETED);
  90. }