亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usbhcdsl811hslib.c

?? sl811hs_vxworks_host_driver_v1_0_13 sl811的主驅(qū)動
?? C
?? 第 1 頁 / 共 5 頁
字號:
* RETURNS: 
*/
LOCAL void executeTD(pHCD_HOST pHost)
{
  UINT32 ctlSts, token;
  UINT8 *buffer;
  SL11XACTION xact;
  BOOL lowSpeedDevice, isoXfer;
  UINT8 tmp = 0;
  
  /* get control/status */
  ctlSts = FROM_LITTLEL(pHost->pCurrentTD->ctlSts);

  /* get token */
  token = FROM_LITTLEL(pHost->pCurrentTD->token);

  /* get buffer */
  buffer = (UINT8 *) (UHC_FROM_LITTLEL(pHost->pCurrentTD->bfrPtr));

  /* get speed */
  lowSpeedDevice = ctlSts & UHCI_TDCS_LOWSPEED;

  /* iso xfer ? */
  isoXfer = ctlSts & UHCI_TDCS_ISOCH;

  /* get data len */
  xact.dlen = UHCI_TDTOK_MAXLEN(token);

  /* get endpoint */
  xact.ep = UHCI_TDTOK_ENDPT(token);

  /* get device address */
  xact.addr = UHCI_TDTOK_DEVADRS(token);

  /* get packet id */
  xact.pid = UHCI_TDTOK_PID(token);

  /* set pid and ep register */
  SL811_REG_WRITE(SL811HS_PID_DEVEND_A, ((xact.pid & 0xf) << 4) | xact.ep);

  /* set usb address register */
  SL811_REG_WRITE(SL811HS_DEVADDR_TCNT_A, xact.addr);

  /* set length register */
  SL811_REG_WRITE(SL811HS_BASE_LEN_A, xact.dlen);

  /* set base address register */
  SL811_REG_WRITE(SL811HS_BASE_ADDR_A, 0x10);

  /* move output data to buffer */
  if ((xact.pid == USB_PID_SETUP) || (xact.pid == USB_PID_OUT))
    {
      int   i,j;
#ifdef SL811HS_LOG
      int   l=xact.dlen;
      UINT8 *b=buffer;
#endif

      /* SL811_BUF_WRITE(0x10,buffer,xact.dlen); */
      for (i=0,j=0x10; i<xact.dlen; j++,i++) {SL811_REG_WRITE(j,buffer[i]);}

#ifdef SL811HS_LOG
        {
        char dbgStr[1500]="    OUT ";
        for ( i=0;i<l;i++ )
            {
            sprintf(dbgStr+8+(i*3),"%02x ",b[i]);
            } /* end of for () */
        sprintf(dbgStr+8+(i*3),"\n");
        DBG_LOG(dbgStr,1,2,3,4,5,6);
        }
#endif
    }

  /* figure out CTRL REG A */
  if (lowSpeedDevice &&  (!(pHost->lowSpeed[0])))
    tmp |= SL811HS_HCTLMASK_PREAMBLE;

  if (token & (UINT32)(UHCI_TDTOK_DATA_TOGGLE)) tmp |= SL811HS_HCTLMASK_SEQ;

  if (isoXfer) tmp |= SL811HS_HCTLMASK_ISOCH;

  if ((xact.pid == USB_PID_SETUP) || (xact.pid == USB_PID_OUT))
    tmp |= SL811HS_HCTLMASK_WRITE;
  else tmp |= SL811HS_HCTLMASK_SEQ;
    
  /* start the xfer */
  tmp |= SL811HS_HCTLMASK_ARM | SL811HS_HCTLMASK_ENBLEP;

  SL811_REG_WRITE(SL811HS_CTRL_REG_A, tmp);
}

/***************************************************************************
*
* getFrameNo - returns current hardware frame number
*
* RETURNS: value of current frame number
*/

LOCAL UINT16 getFrameNo
    (
    pHCD_HOST pHost
    )

    {
      return FINDEX(pHost->frameNo);
    }


/***************************************************************************
*
* setIrpResult - sets result in IRP and executes IRP callback
*
* RETURNS: value from Irp result field
*/

LOCAL int setIrpResult
    (
    pUSB_IRP pIrp,
    int result
    )

    {
    if (result != PENDING)
	{
	pIrp->result = result;

	if (pIrp->usbdCallback != NULL)
	    (*pIrp->usbdCallback) (pIrp);

	else if (pIrp->userCallback != NULL)
	    (*pIrp->userCallback) (pIrp);
	}

    return result;
    }


/***************************************************************************
*
* planAheadTime - returns "plan-ahead time"
*
* The "plan ahead interval" is the maximum time that code should "plan
* ahead when setting up work for the UHC.  It is expected that interrupt
* latency will never exceed one half of this time.
*
* RETURNS: plan ahead time in msec
*/

LOCAL UINT16 planAheadTime
    (
    pHCD_HOST pHost
    )

    {
    return PLAN_AHEAD_TIME;
    }


/***************************************************************************
*
* calcIntInterval - calculates the scheduling interval for interrupt transfer
*
* RETURNS: Actual interval to be used for interrupt transfer
*/

LOCAL UINT16 calcIntInterval
    (
    UINT16 interval	/* 1 <= requested interval <= 255 */
    )

    {
    UINT16 i;

    /* Select an interval which is the largest power of two less than or
     * equal to the requested interval.
     */

    for (i = 2; i < 256; i <<= 1)
	{
	if (i > interval)
	    break;
	}

    return i >> 1;
    }


/***************************************************************************
*
* calcQhTd - calculates number of QHs and TDs to be allocated for IRP
*
* Calculates the number of TDs/QHs which need to be allocated for <pIrp>
* in order to complete the IRP or manage it through at least the "plan
* ahead interval."  Returns number of TDs in <pTdCount> and QHs in
* <pQhCount>.
*
* RETURNS: N/A
*/

LOCAL VOID calcQhTd
    (
    pHCD_HOST pHost,
    pHCD_PIPE pPipe,
    pUSB_IRP pIrp,
    pUINT16 pQhCount,
    pUINT16 pTdCount
    )

    {
    UINT16 qhCount = 0;
    UINT16 tdCount = 0;
    UINT16 trialTdCount;
    UINT32 bytesPerFrame;


    /* The calculation of TDs/QHs varies based on the type of transfer */

    switch (pPipe->transferType)
    {
    case USB_XFRTYPE_ISOCH:

	/* IRPs for isochronous transfers have one or more bfrList[]
	 * entries which requires a variable number of TDs.  There
	 * will be a single TD per frame, and the number of TDs
	 * is bounded by the "plan ahead time".
	 *
	 * NOTE: for isoch transfers, maxPacketSize is the number
	 * of bytes to be transmitted each frame.
	 */

	qhCount = 0;

	bytesPerFrame = pPipe->bandwidth / 1000L;

	trialTdCount = (pIrp->transferLen + bytesPerFrame - 1) 
			/ bytesPerFrame;

	tdCount = min (trialTdCount, planAheadTime (pHost));
	break;

    case USB_XFRTYPE_INTERRUPT:

	/* IRPs for interrupt transfers have one or more bfrList[] 
	 * entries.  Each IRP requires a single QHs which may be linked
	 * into multiple frame lists (to allow it to be scheduled 
	 * periodically) plus a variable number of TDs.
	 */

	qhCount = 1;

	trialTdCount = (pIrp->transferLen + pPipe->maxPacketSize - 1)
			/ pPipe->maxPacketSize;

	tdCount = min (trialTdCount, MAX_IRP_TDS);
	break;

    case USB_XFRTYPE_CONTROL:

	/* IRPs for control transfers have two or more bfrList[]
	 * entries.  We need one QH for the transfer plus one TD
	 * for the Setup packet (first bfrList[] entry) plus
	 * a variable number of TDs for the additional bfr list entries
	 * plus a final TD for the status packet.  There is an overriding 
	 * limit on the number of TDs per control IRP set at MAX_IRP_TDS.
	 * 
	 * NOTE: For low-speed control transfers, we impose a limit of
	 * one oustanding TD at a time.
	 */

	qhCount = 1;


	if (pPipe->speed == USB_SPEED_LOW)
	    {
	    tdCount = 1;
	    }
	else
	    {	
	    tdCount = 2;	/* for Setup and status packets */

	    if (pIrp->bfrCount > 1)
		{
		trialTdCount = (pIrp->transferLen - pIrp->bfrList [0].bfrLen 
				+ pPipe->maxPacketSize - 1) 
				/ pPipe->maxPacketSize;

		tdCount += min (trialTdCount, MAX_IRP_TDS - tdCount);
		}
	    }

	break;

    case USB_XFRTYPE_BULK:

	/* IRPs for bulk transfers have one or more bfrList[] entries.	
	 * Each IRP requires a single QH plus a variable number of TDs.
	 */

	qhCount = 1;

	trialTdCount = (pIrp->transferLen + pPipe->maxPacketSize - 1)
			/ pPipe->maxPacketSize;

	tdCount = min (trialTdCount, MAX_IRP_TDS);
	break;
    }

    /* return results */

    if (pQhCount != NULL)
	   *pQhCount = qhCount;

    if (pTdCount != NULL)
	    *pTdCount = tdCount;
    }


/***************************************************************************
*
* freeIrpWorkspace - releases IRP_WORKSPACE and related QHs and TDs
*
* Releases all QHs and TDs associated with an IRP_WORKSPACE and frees
* the IRP_WORKSPACE structure itself.
*
* RETURNS: N/A
*/

LOCAL VOID freeIrpWorkspace
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp
    )

    {
    pIRP_WORKSPACE pWork = (pIRP_WORKSPACE) pIrp->hcdPtr;

    if (pWork != NULL)
	{
	if (pWork->pQh != NULL)
	    DMA_FREE (pWork->pQh);

	if (pWork->pTdPool != NULL)
	    DMA_FREE (pWork->pTdPool);

	OSS_FREE (pWork);

	pIrp->hcdPtr = NULL;
	}
    }


/***************************************************************************
*
* allocIrpWorkspace - allocates QH and TD structures for IRP
*
* Calculates the required number of QH and TD structures for an IRP
* and allocates aligned memory.  Also creates an IRP_WORKSPACE structure
* to manage the QHs and TDs allocated for the IRP and links it into the
* IRP.
*
* RETURNS: TRUE if successful, else FALSE
*/

LOCAL BOOL allocIrpWorkspace
    (
    pHCD_HOST pHost,
    pHCD_PIPE pPipe,
    pUSB_IRP pIrp
    )

    {
    pIRP_WORKSPACE pWork;
    UINT16 tdLen;
    UINT16 i;


    /* Allocate IRP_WORKSPACE */

    if ((pWork = OSS_CALLOC (sizeof (*pWork))) == NULL)
	return FALSE;

    pIrp->hcdPtr = pWork;
    pWork->pPipe = pPipe;
    pWork->pIrp = pIrp;


    /* Calculate number of QHs and TDs */

    calcQhTd (pHost, pPipe, pIrp, &pWork->qhCount, &pWork->tdCount);


    /* Allocate QHs and TDs */

    if (pWork->qhCount > 0)
	{
	if ((pWork->pQh = DMA_MALLOC (sizeof (QH_WRAPPER), 
	    UHCI_QH_ALIGNMENT)) == NULL)
	    {
	    freeIrpWorkspace (pHost, pIrp);
	    return FALSE;
	    }

	memset (pWork->pQh, 0, sizeof (QH_WRAPPER));
	pWork->pQh->sw.pWork = pWork;
	pWork->pQh->qh.tdLink = UHC_END_OF_LIST;
	}

    if (pWork->tdCount > 0)
	{
	tdLen = pWork->tdCount * sizeof (TD_WRAPPER);

	if ((pWork->pTdPool = DMA_MALLOC (tdLen, UHCI_TD_ALIGNMENT)) == NULL)
	    {
	    freeIrpWorkspace (pHost, pIrp);
	    return FALSE;
	    }

	memset (pWork->pTdPool, 0, tdLen);
	}


    /* Create a chain of TDs in the "free" list */

    pWork->pTdInUse = pWork->pTdFree = NULL;

    for (i = 0; i < pWork->tdCount; i++)
	{
	pWork->pTdPool [i].sw.pWork = pWork;

	pWork->pTdPool [i].sw.pNext = pWork->pTdFree;
	pWork->pTdFree = &pWork->pTdPool [i];
	}


    /* Initialize the pointer to the last TD in use */

    pWork->pLastTdInUse = NULL;


    return TRUE;
    }


/***************************************************************************
*
* isBandwidthTracked - determines if bandwidth is tracked for this transfer
*
* Since the USBD has already reserved adequate bandwidth for isochronous
* and interrupt transfers, we only track low speed control transfers.
*
* RETURNS: TRUE if bandwidth tracked, else FALSE.
*/

LOCAL BOOL isBandwidthTracked
    (
    pHCD_PIPE pPipe
    )

    {

    if (pPipe->transferType == USB_XFRTYPE_CONTROL &&

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品一区二区蜜桃| 一区二区三区国产| 一区在线播放视频| 一区二区三区资源| 免费不卡在线观看| 国产91综合网| 欧美日韩一级片在线观看| 亚洲精品一区二区三区精华液 | 亚洲国产成人精品视频| 免费成人美女在线观看| www.亚洲在线| 91麻豆精品国产无毒不卡在线观看| 精品盗摄一区二区三区| 最新日韩在线视频| 麻豆精品一区二区三区| av网站免费线看精品| 欧美巨大另类极品videosbest | 欧美α欧美αv大片| 中文一区在线播放| 婷婷丁香久久五月婷婷| 国产丶欧美丶日本不卡视频| 欧美在线一二三四区| 久久久久亚洲综合| 亚洲成人激情综合网| 丰满放荡岳乱妇91ww| 欧美一区二区三区四区久久| 国产精品色眯眯| 热久久国产精品| 91视视频在线观看入口直接观看www | 国产精品视频线看| 日韩成人一区二区三区在线观看| 成人性色生活片| 日韩欧美一二三四区| 亚洲日本欧美天堂| 国产精品主播直播| 91精品麻豆日日躁夜夜躁| 成人免费一区二区三区视频| 另类小说欧美激情| 欧美在线三级电影| 中文字幕免费一区| 精品无人码麻豆乱码1区2区| 欧美视频一区二区在线观看| 国产精品福利一区二区三区| 麻豆成人av在线| 欧美在线免费播放| 国产精品视频一二| 国产精品一区在线| 精品免费视频.| 天天影视涩香欲综合网| 91视频在线观看免费| 国产精品无圣光一区二区| 精品一区二区三区的国产在线播放 | 国产欧美日韩卡一| 久久99精品国产91久久来源| 欧美精品一二三| 一区二区三区久久久| 99国产精品一区| 国产精品青草久久| 国产成人在线看| 久久久久久影视| 狠狠狠色丁香婷婷综合激情| 4438成人网| 日日摸夜夜添夜夜添亚洲女人| 精品视频一区二区三区免费| 一区二区在线观看视频在线观看| 不卡视频一二三| 国产精品大尺度| 菠萝蜜视频在线观看一区| 国产精品久线观看视频| 成人免费视频app| 国产亚洲精品aa| 成人午夜电影网站| 国产精品私人影院| 91丨国产丨九色丨pron| 亚洲精品成人少妇| 一区二区三区日韩在线观看| 一本大道av伊人久久综合| 亚洲欧美激情视频在线观看一区二区三区| 99久久777色| 亚洲色图第一区| 欧美性受xxxx| 五月天丁香久久| 日韩一级完整毛片| 久久er精品视频| 久久久久久久久久电影| 国产91在线|亚洲| 亚洲日本一区二区| 精品视频一区 二区 三区| 调教+趴+乳夹+国产+精品| 91精品国产黑色紧身裤美女| 九色综合国产一区二区三区| 久久久精品免费网站| 成人av网在线| 亚洲美女视频在线观看| 欧美日韩高清一区二区| 蜜臂av日日欢夜夜爽一区| 久久综合九色欧美综合狠狠| 国产成人av影院| 亚洲欧美激情视频在线观看一区二区三区 | 久久久亚洲高清| www.性欧美| 亚洲狠狠爱一区二区三区| 欧美一区二区三区婷婷月色 | 日本一二三不卡| 色综合天天综合在线视频| 丰满白嫩尤物一区二区| 亚洲婷婷综合久久一本伊一区| 在线免费不卡电影| 日韩和欧美一区二区三区| 久久网这里都是精品| 91在线免费看| 男人的j进女人的j一区| 国产欧美一区二区在线| 色噜噜狠狠一区二区三区果冻| 日日夜夜免费精品| 亚洲国产精品成人综合色在线婷婷| 色视频成人在线观看免| 狂野欧美性猛交blacked| 国产精品国产三级国产| 欧美老女人在线| 成人做爰69片免费看网站| 午夜天堂影视香蕉久久| 久久九九久久九九| 欧美无砖砖区免费| 国产精品小仙女| 亚洲国产综合人成综合网站| 精品粉嫩aⅴ一区二区三区四区| 色先锋aa成人| 韩国av一区二区三区| 亚洲福利一二三区| 国产日韩影视精品| 欧美精品欧美精品系列| 成人h版在线观看| 免费观看在线综合色| 亚洲同性同志一二三专区| 精品少妇一区二区三区| 色婷婷一区二区三区四区| 国产一区二区三区久久悠悠色av| 一区二区三区四区五区视频在线观看 | 亚洲最色的网站| 国产人伦精品一区二区| 欧美精品粉嫩高潮一区二区| 99国产精品久久久久久久久久久| 看电视剧不卡顿的网站| 亚洲电影一区二区三区| 中文欧美字幕免费| 欧美成人在线直播| 欧美久久久久久久久中文字幕| 99精品国产视频| 国产99久久久国产精品免费看| 人禽交欧美网站| 视频一区国产视频| 亚洲国产裸拍裸体视频在线观看乱了| 欧美国产日本韩| 欧美精品一区二区三区视频| 91麻豆精品国产自产在线| 欧美性受xxxx黑人xyx性爽| 99久精品国产| 99热在这里有精品免费| 国产成人免费高清| 国产一区二区剧情av在线| 日本午夜一本久久久综合| 亚洲一二三区在线观看| 亚洲人精品午夜| 亚洲视频一二三区| 国产精品久久久久影视| 国产日韩视频一区二区三区| 久久久亚洲综合| 国产亚洲污的网站| www久久久久| 日韩亚洲欧美一区| 3d成人动漫网站| 91九色02白丝porn| 色综合色综合色综合 | 中文一区二区完整视频在线观看| 日韩欧美在线综合网| 欧美色手机在线观看| 欧洲生活片亚洲生活在线观看| 成人激情电影免费在线观看| 国产一区二区三区蝌蚪| 一区二区三区四区激情| 亚洲最大成人综合| 亚洲欧美乱综合| 中文字幕一区二区5566日韩| 久久精品欧美一区二区三区麻豆| 日韩精品专区在线影院观看| 3atv一区二区三区| 欧美日韩久久久| 91精品国产一区二区三区| 精品视频一区 二区 三区| 欧美丝袜第三区| 欧美日韩国产一二三| 欧美色成人综合| 欧美日韩一区二区三区在线| 色欲综合视频天天天| 色哟哟在线观看一区二区三区| 91视频免费播放| 岛国av在线一区| 色综合久久中文字幕| av在线不卡免费看|