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

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

?? mscbot.c

?? 最新的LPC214X USBMASS驅(qū)動程序
?? C
字號:
////  $Id: mscbot.c 42 2008-10-04 18:40:36Z jcw $//  $Revision: 42 $//  $Author: jcw $//  $Date: 2008-10-04 14:40:36 -0400 (Sat, 04 Oct 2008) $//  $HeadURL: http://tinymicros.com/svn_public/arm/lpc2148_demo/trunk/usbmass/mscbot.c $///*  LPCUSB, an USB device driver for LPC microcontrollers   Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)  Redistribution and use in source and binary forms, with or without  modification, are permitted provided that the following conditions are met:  1. Redistributions of source code must retain the above copyright     notice, this list of conditions and the following disclaimer.  2. Redistributions in binary form must reproduce the above copyright     notice, this list of conditions and the following disclaimer in the     documentation and/or other materials provided with the distribution.  3. The name of the author may not be used to endorse or promote products     derived from this software without specific prior written permission.  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/#include "FreeRTOS.h"#include <string.h>#include "../usb/usbapi.h"#include "mscdebug.h"#include "mscbot.h"#include "mscscsi.h"//// Command block wrapper structure//typedef struct {  U32   dwCBWSignature;  U32   dwCBWTag;  U32   dwCBWDataTransferLength;  U8    bmCBWFlags;  U8    bCBWLun;  U8    bCBWCBLength;  U8    CBWCB[16];} TCBW;////  Command status wrapper structure //typedef struct {  U32   dwCSWSignature;  U32   dwCSWTag;  U32   dwCSWDataResidue;  U8    bmCSWStatus;} TCSW;////  States of BOT state machine //typedef enum {  eCBW,  eDataOut,  eDataIn,  eCSW,  eStalled} EBotState;//////#define CBW_SIGNATURE 0x43425355    /**< magic word in CBW */#define CSW_SIGNATURE 0x53425355    /**< magic word in CSW */#define STATUS_PASSED     0x00    /**< successful transfer */#define STATUS_FAILED     0x01    /**< failed transfer */#define STATUS_PHASE_ERR  0x02    /**< conflict between host and device */static U32 dwTransferSize;  /**< total size of data transfer */static U32 dwOffset;        /**< offset in current data transfer */static TCBW CBW;static TCSW CSW;static EBotState  eState;static U8 *pbData;////  Prepares a CSW, to be sent on next bulk-IN interrupt//    //  @param [in] bStatus CSW status//static void mscbotSendCSW (U8 bStatus){  int iResidue;    iResidue = CBW.dwCBWDataTransferLength - dwTransferSize;    CSW.dwCSWSignature = CSW_SIGNATURE;  CSW.dwCSWTag = CBW.dwCBWTag;  CSW.dwCSWDataResidue = MAX (iResidue, 0);  CSW.bmCSWStatus = bStatus;  DBG ("CSW: status=%x, residue=%d\n", bStatus, CSW.dwCSWDataResidue);  eState = eCSW;}////  Checks if CBW is valid and meaningful//    //  @param [in] pCBW  Command block wrapper//  @param [in] iLen  Length of CBW//      //  @return TRUE if valid and meaningful//static BOOL mscbotCheckCBW (TCBW *pCBW, int iLen){  //  // CBW valid?  //  if (iLen != 31)   {    DBG ("Invalid length (%d)\n", iLen);    return FALSE;  }  if (pCBW->dwCBWSignature != CBW_SIGNATURE)   {    DBG ("Invalid signature %x\n", pCBW->dwCBWSignature);    return FALSE;  }  //  // CBW meaningful?  //  if (pCBW->bCBWLun != 0)   {    DBG ("Invalid LUN %d\n", pCBW->bCBWLun);    return FALSE;  }  if ((pCBW->bCBWCBLength < 1) || (pCBW->bCBWCBLength > 16))   {    DBG ("Invalid CB len %d\n", pCBW->bCBWCBLength);    return FALSE;  }  return TRUE;}////  mscbotBOTStall//    Local function to stall ongoing transfer//    //  Which endpoint to stall is determined by looking at the transfer//  direction intended by the host.//static void mscbotBOTStall (void){  if ((CBW.bmCBWFlags & 0x80) || (CBW.dwCBWDataTransferLength == 0))     usbHardwareEndpointStall (MSC_BULK_IN_EP, TRUE);  else     usbHardwareEndpointStall (MSC_BULK_OUT_EP, TRUE);}////  mscbotHandleDataIn//    Handles data from device-to-host//    static void mscbotHandleDataIn (void){  int iChunk;    //  //  Process data for host in SCSI layer  //  if ((pbData = mscscsiHandleData (CBW.CBWCB, CBW.bCBWCBLength, pbData, dwOffset)) == NULL)  {    mscbotBOTStall ();    mscbotSendCSW (STATUS_FAILED);    return;  }  //  //  Send data to host?  //  if (dwOffset < dwTransferSize)   {    iChunk = MIN (64, dwTransferSize - dwOffset);    usbHardwareEndpointWrite (MSC_BULK_IN_EP, pbData, iChunk);    dwOffset += iChunk;  }    //  // are we done now?  //  if (dwOffset == dwTransferSize)   {    if (dwOffset != CBW.dwCBWDataTransferLength)     {      DBG ("stalling DIN");      mscbotBOTStall ();    }    //    //  Done    //    mscbotSendCSW (STATUS_PASSED);  }}////  mscbotHandleDataOut//    Handles data from host-to-device//static void mscbotHandleDataOut (void){  int iChunk;  if (dwOffset < dwTransferSize)   {    iChunk = usbHardwareEndpointRead (MSC_BULK_OUT_EP, pbData, dwTransferSize - dwOffset);    pbData = mscscsiHandleData (CBW.CBWCB, CBW.bCBWCBLength, pbData, dwOffset);    if (pbData == NULL)     {      mscbotBOTStall ();      mscbotSendCSW (STATUS_FAILED);      return;    }    dwOffset += iChunk;  }  //  //  Are we done now?  //  if (dwOffset == dwTransferSize)   {    if (dwOffset != CBW.dwCBWDataTransferLength)     {      DBG ("stalling DOUT");      mscbotBOTStall ();    }    mscbotSendCSW (STATUS_PASSED);  }}    ////  Resets the BOT state machine//void mscbotReset (void){  DBG ("BOT reset in state %d\n", eState);  eState = eCBW;  mscscsiReset ();}////   Handles the BOT bulk OUT endpoint//     //   @param [in] bEP     Endpoint number//   @param [in] bEPStatus Endpoint status (indicates NAK, STALL, etc)//     int mscbotBulkOut (U8 bEP, U8 bEPStatus){  unsigned int iLen, iChunk;  BOOL fHostIn, fDevIn;  //  //  Ignore events on stalled EP  //  if (bEPStatus & EP_STATUS_STALLED)    return 0;  switch (eState)   {    case eCBW:      {        iLen = usbHardwareEndpointRead (bEP, (U8 *)&CBW, sizeof(CBW));        if (!mscbotCheckCBW(&CBW, iLen))         {          usbHardwareEndpointStall (MSC_BULK_IN_EP, TRUE);          usbHardwareEndpointStall (MSC_BULK_OUT_EP, TRUE);          eState = eStalled;          break;        }        DBG ("CBW: len=%d, flags=%x, cmd=%x, cmdlen=%d\n", CBW.dwCBWDataTransferLength, CBW.bmCBWFlags, CBW.CBWCB[0], CBW.bCBWCBLength);        dwOffset = 0;        dwTransferSize = 0;        fHostIn = ((CBW.bmCBWFlags & 0x80) != 0);        //        //  Verify request.  Unknown command if NULL        //        if ((pbData = mscscsiHandleCmd (CBW.CBWCB, CBW.bCBWCBLength, &iLen, &fDevIn)) == NULL)        {          mscbotBOTStall ();          mscbotSendCSW (STATUS_FAILED);          break;              }        //        //  Rule: if device and host disagree on direction, send CSW with status 2        //        if ((iLen > 0) && ((fHostIn && !fDevIn) || (!fHostIn && fDevIn)))         {          DBG ("Host and device disagree on direction\n");          mscbotBOTStall ();          mscbotSendCSW (STATUS_PHASE_ERR);          break;        }        //        //  Rule: if D > H, send CSW with status 2        //        if (iLen > CBW.dwCBWDataTransferLength)         {          DBG ("Negative residue\n");          mscbotBOTStall ();          mscbotSendCSW (STATUS_PHASE_ERR);          break;        }        if (((dwTransferSize = iLen) == 0) || fDevIn)         {          //          //  Data from device-to-host          //          eState = eDataIn;          mscbotHandleDataIn ();        }        else         {          //          //  Data from host-to-device          //          eState = eDataOut;        }      }      break;    case eDataOut:      {        mscbotHandleDataOut ();      }      break;    case eDataIn:    case eCSW:      {        iChunk = usbHardwareEndpointRead (bEP, NULL, 0);        DBG ("Phase error in state %d, %d bytes\n", eState, iChunk);        eState = eCBW;      }      break;    case eStalled:      {        usbHardwareEndpointStall (MSC_BULK_OUT_EP, TRUE);      }      break;    default:      {        DBG ("Invalid state %d\n", eState);        ASSERT (FALSE);      }      break;  }  return 0;}////   Handles the BOT bulk IN endpoint//     //   @param [in] bEP     Endpoint number//   @param [in] bEPStatus Endpoint status (indicates NAK, STALL, etc)//     int mscbotBulkIn (U8 bEP __attribute__ ((unused)), U8 bEPStatus){  if (bEPStatus & EP_STATUS_STALLED)    return 0;  switch (eState)   {    //    //  Ignore possibly old ACKs    //    case eCBW:    case eDataOut:      break;    case eDataIn:      mscbotHandleDataIn ();      break;    //    //  Wait for an IN token, then send the CSW    //    case eCSW:      usbHardwareEndpointWrite (MSC_BULK_IN_EP, (U8 *)&CSW, 13);      eState = eCBW;      break;    //    //  Keep stalling    //    case eStalled:      usbHardwareEndpointStall (MSC_BULK_IN_EP, TRUE);      break;    default:      DBG ("Invalid state %d\n", eState);      ASSERT (FALSE);      break;  }  return 0;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
婷婷开心久久网| 乱一区二区av| 91成人国产精品| 午夜影院久久久| 久久先锋资源网| 国产在线视频精品一区| 欧美一区二区视频在线观看| 亚洲精品国产精华液| av网站免费线看精品| 久久久久国产精品人| 色婷婷精品久久二区二区蜜臀av| 亚洲图片欧美视频| 国产欧美一区二区精品性色超碰 | 91精品国产91热久久久做人人| 久久se这里有精品| 国产精品色眯眯| 5858s免费视频成人| 成人一级片网址| 蜜臀av一区二区在线观看| 中文字幕亚洲区| 日韩一区二区免费在线观看| 不卡视频免费播放| 久久成人羞羞网站| 亚洲 欧美综合在线网络| 欧美国产精品劲爆| 日韩精品资源二区在线| 在线观看视频一区| 大桥未久av一区二区三区中文| 亚洲国产毛片aaaaa无费看| 精品日韩欧美在线| 成人av在线电影| 国产成a人无v码亚洲福利| 亚洲午夜在线电影| 成人欧美一区二区三区1314 | 国产午夜精品一区二区三区四区| 色婷婷综合久色| 国产成人亚洲综合色影视| 日韩av在线发布| 亚洲欧美日韩精品久久久久| 中文字幕亚洲欧美在线不卡| 91电影在线观看| 国产美女一区二区三区| 老司机精品视频在线| 日韩成人av影视| 日日骚欧美日韩| 亚洲电影在线播放| 亚洲在线视频网站| 亚洲午夜av在线| 亚洲一区在线看| 亚洲第一福利视频在线| 亚洲妇女屁股眼交7| 亚洲va国产天堂va久久en| 亚洲国产日产av| 中文字幕在线观看不卡| 欧美精品一区二区三区在线播放| 精品三级在线看| 国产夜色精品一区二区av| 久久嫩草精品久久久精品| 久久女同性恋中文字幕| 欧美国产丝袜视频| 18欧美亚洲精品| 亚洲欧美精品午睡沙发| 亚洲精品自拍动漫在线| 一区二区三区中文免费| 一区二区在线观看不卡| 午夜伊人狠狠久久| 日韩制服丝袜av| 久久99国产精品麻豆| 国产乱理伦片在线观看夜一区| 国产成人午夜高潮毛片| 99久久综合99久久综合网站| 色999日韩国产欧美一区二区| 欧美日韩免费高清一区色橹橹| 7777精品伊人久久久大香线蕉经典版下载 | 伦理电影国产精品| 丰满白嫩尤物一区二区| 日本乱人伦一区| 91精品在线观看入口| 久久一日本道色综合| 中文子幕无线码一区tr| 亚洲视频一区二区免费在线观看 | 欧美性大战久久久| 日韩欧美成人午夜| 日韩毛片在线免费观看| 视频一区二区国产| 97精品久久久午夜一区二区三区 | 久久久午夜精品理论片中文字幕| 一区在线中文字幕| 天天影视网天天综合色在线播放| 美日韩一区二区| 91麻豆蜜桃一区二区三区| 色婷婷狠狠综合| 国产91丝袜在线播放九色| 色老汉av一区二区三区| 欧美videossexotv100| 亚洲女性喷水在线观看一区| 日本中文字幕一区| 色婷婷av一区二区三区大白胸 | 亚洲欧洲日产国码二区| 亚洲成人7777| 91在线国产观看| 欧美一区二区精品| 一区二区三区自拍| 岛国一区二区在线观看| 欧美日本一区二区| 夜夜精品浪潮av一区二区三区| 国产69精品一区二区亚洲孕妇| 欧美一区二区高清| 国产精品国模大尺度视频| 毛片一区二区三区| 欧美日韩dvd在线观看| 亚洲综合色视频| 91免费看视频| 国产精品久久久久一区二区三区共| 免费美女久久99| 欧美精品一卡二卡| 亚洲国产日韩在线一区模特| 91在线视频官网| 亚洲天堂久久久久久久| 成人午夜av电影| 国产欧美日韩精品在线| 毛片av中文字幕一区二区| 欧美日韩五月天| 午夜精品久久久久久久久久久| 欧美在线免费视屏| 亚洲激情欧美激情| 91在线播放网址| 亚洲男人天堂av| 91蝌蚪porny| 一区二区三区欧美在线观看| 99精品桃花视频在线观看| 国产精品黄色在线观看| fc2成人免费人成在线观看播放| 国产日韩欧美一区二区三区乱码| 韩国三级在线一区| 国产农村妇女精品| www.日韩大片| 一二三区精品视频| 3d成人h动漫网站入口| 青青青爽久久午夜综合久久午夜| 欧美一区二区三区色| 美女视频黄频大全不卡视频在线播放| 欧美色图激情小说| 日本成人超碰在线观看| 精品日本一线二线三线不卡| 国产综合久久久久影院| 国产亚洲综合性久久久影院| 岛国精品在线观看| 夜夜嗨av一区二区三区网页| 色哟哟精品一区| 青青国产91久久久久久| 久久精品人人做人人综合 | 国产成人高清在线| 国产精品美女久久久久aⅴ| 欧美艳星brazzers| 精品无码三级在线观看视频| 久久这里只精品最新地址| 91理论电影在线观看| 青青草国产成人99久久| 久久综合九色综合97_久久久| 成人性生交大片免费看中文网站| 亚洲精品菠萝久久久久久久| 日韩欧美国产午夜精品| 国产一区二区视频在线| 亚洲精品视频在线| 亚洲精品一区二区精华| 欧洲一区在线电影| 国产一区二区三区国产| 一区二区三区欧美视频| 久久久不卡网国产精品二区| 色综合激情久久| 国产精品原创巨作av| 午夜亚洲国产au精品一区二区| 国产亚洲欧美日韩俺去了| 欧美绝品在线观看成人午夜影视| 成人丝袜高跟foot| 久久精品国产亚洲a| 亚洲最大色网站| 国产精品麻豆网站| ww亚洲ww在线观看国产| 欧美亚洲丝袜传媒另类| 岛国av在线一区| 久久se精品一区精品二区| 亚洲狠狠丁香婷婷综合久久久| 国产亚洲精品超碰| 精品精品国产高清一毛片一天堂| 在线视频一区二区三| 粉嫩蜜臀av国产精品网站| 另类欧美日韩国产在线| 日本视频一区二区| 亚洲.国产.中文慕字在线| 亚洲少妇30p| 自拍偷拍亚洲综合| 国产精品青草综合久久久久99| 日韩一区二区电影| 91精品国产色综合久久不卡蜜臀| 欧美中文字幕一区二区三区| 日本精品裸体写真集在线观看| 成人白浆超碰人人人人| 成人动漫视频在线|