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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mscscsi.c

?? 最新的LPC214X USBMASS驅動程序
?? C
字號:
////  $Id: mscscsi.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/mscscsi.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 "../fatfs/disk.h"#include "mscdebug.h"#include "mscscsi.h"//////#define BLOCKSIZE   512////  SBC2 mandatory SCSI commands//#define SCSI_CMD_TEST_UNIT_READY  0x00#define SCSI_CMD_REQUEST_SENSE    0x03#define SCSI_CMD_FORMAT_UNIT      0x04#define SCSI_CMD_READ_6           0x08  /* not implemented yet */#define SCSI_CMD_INQUIRY          0x12#define SCSI_CMD_SEND_DIAGNOSTIC  0x1D  /* not implemented yet */#define SCSI_CMD_READ_CAPACITY_10 0x25#define SCSI_CMD_READ_10          0x28#define SCSI_CMD_REPORT_LUNS      0xa0  /* not implemented yet */////  SBC2 optional SCSI commands//#define SCSI_CMD_WRITE_6          0x0a  /* not implemented yet */#define SCSI_CMD_WRITE_10         0x2a#define SCSI_CMD_VERIFY_10        0x2f  /* required for windows format */////  Sense codes//#define WRITE_ERROR           0x030C00#define READ_ERROR            0x031100#define INVALID_CMD_OPCODE    0x052000#define INVALID_FIELD_IN_CDB  0x052400////  Sense code, which is set on error conditions//  Hex: 00aabbcc, where aa=KEY, bb=ASC, cc=ASCQ//static U32 dwSense;  static const U8   abInquiry [] = {  0x00,   // PDT = direct-access device  0x80,   // removeable medium bit = set  0x05,   // version = complies to SPC3  0x02,   // response data format = SPC3  0x1F,   // additional length  0x00,  0x00,  0x00,  'L','P','C','U','S','B',' ',' ',  // vendor  'M','a','s','s',' ','s','t','o',  // product  'r','a','g','e',' ',' ',' ',' ',  '0','.','1',' '                   // revision};////  Data for "request sense" command. The 0xff are filled in later//static const U8 abSense [] = { 0x70, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0a,                                0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,                               0x00, 0x00 };////  Buffer for holding one block of disk data//static U8 abBlockBuf [512];typedef struct {  U8    bOperationCode;  U8    abLBA [3];  U8    bLength;  U8    bControl;} TCDB6;//////void mscscsiReset (void){  dwSense = 0;}////  SCSIHandleCmd//    Verifies a SCSI CDB and indicates the direction and amount of data//    that the device wants to transfer.//    //  If this call fails, a sense code is set in dwSense.////  IN  pbCDB     - Command data block//      iCDBLen   - Command data block len//  OUT *piRspLen - Length of intended response data://      *pfDevIn  - TRUE if data is transferred from device-to-host//  //  Returns a pointer to the data exchange buffer if successful,//  return NULL otherwise.//U8 *mscscsiHandleCmd (U8 *pbCDB, U8 iCDBLen, unsigned int *piRspLen, BOOL *pfDevIn){  static const U8 aiCDBLen [] = {6, 10, 10, 0, 16, 12, 0, 0};  int   i;  TCDB6 *pCDB;  U32   dwLen, dwLBA;  U8    bGroupCode;  pCDB = (TCDB6 *) pbCDB;  // default direction is from device to host  *pfDevIn = TRUE;  // check CDB length  bGroupCode = (pCDB->bOperationCode >> 5) & 0x7;  if (iCDBLen < aiCDBLen [bGroupCode])   {    DBG ("Invalid CBD len (expected %d)!\n", aiCDBLen [bGroupCode]);    return NULL;  }  switch (pCDB->bOperationCode)   {    case SCSI_CMD_TEST_UNIT_READY :      {        DBG ("TEST UNIT READY\n");        *piRspLen = 0;      }      break;    case SCSI_CMD_REQUEST_SENSE :      {        DBG ("REQUEST SENSE (%06X)\n", dwSense);        *piRspLen = MIN (18, pCDB->bLength);      }      break;    case SCSI_CMD_FORMAT_UNIT :      {        DBG ("FORMAT UNIT %02X\n", pbCDB [1]);        *piRspLen = 0;      }      break;    case SCSI_CMD_INQUIRY :      {        DBG ("INQUIRY\n");        *piRspLen = MIN (36, pCDB->bLength);      }      break;    case SCSI_CMD_READ_CAPACITY_10 :      {        DBG ("READ CAPACITY\n");        *piRspLen = 8;      }      break;    case SCSI_CMD_READ_10 :      {        dwLBA = (pbCDB [2] << 24) | (pbCDB [3] << 16) | (pbCDB [4] << 8) | (pbCDB [5]);        dwLen = (pbCDB [7] << 8) | pbCDB [8];        DBG ("READ10, LBA=%d, len=%d\n", dwLBA, dwLen);        *piRspLen = dwLen * BLOCKSIZE;      }      break;    case SCSI_CMD_WRITE_10 :      {        dwLBA = (pbCDB [2] << 24) | (pbCDB [3] << 16) | (pbCDB [4] << 8) | (pbCDB [5]);        dwLen = (pbCDB [7] << 8) | pbCDB [8];        DBG ("WRITE10, LBA=%d, len=%d\n", dwLBA, dwLen);        *piRspLen = dwLen * BLOCKSIZE;        *pfDevIn = FALSE;      }      break;    case SCSI_CMD_VERIFY_10 :      {        DBG ("VERIFY10\n");        if ((pbCDB [1] & (1 << 1)) != 0)         {          DBG ("BYTCHK not supported\n");          return NULL;        }        *piRspLen = 0;      }      break;    default :      {        DBG ("Unhandled SCSI: ");            for (i = 0; i < iCDBLen; i++)          DBG (" %02X", pbCDB [i]);        DBG ("\n");        dwSense = INVALID_CMD_OPCODE;        *piRspLen = 0;      }      return NULL;  }  return abBlockBuf;}////  SCSIHandleData//    Handles a block of SCSI data.//    //  IN      pbCDB    . Command data block//          iCDBLen  - Command data block len//  IN/OUT  pbData   - Data buffer//  IN      dwOffset - Offset in data//  //  Returns a pointer to the next data to be exchanged if successful,//  returns NULL otherwise.//U8 *mscscsiHandleData (U8 *pbCDB, U8 iCDBLen __attribute__ ((unused)), U8 *pbData, U32 dwOffset){  switch (((TCDB6 *) pbCDB)->bOperationCode)   {    case SCSI_CMD_TEST_UNIT_READY :      {        if (dwSense != 0)           return NULL;      }      break;    case SCSI_CMD_REQUEST_SENSE :      {        memcpy (pbData, abSense, 18);        pbData [2]  = (dwSense >> 16) & 0xff;        pbData [12] = (dwSense >> 8) & 0xff;        pbData [13] = (dwSense >> 0) & 0xff;        dwSense = 0;      }      break;    case SCSI_CMD_FORMAT_UNIT :      break;    case SCSI_CMD_INQUIRY :      {        memcpy (pbData, abInquiry, sizeof (abInquiry));      }      break;    case SCSI_CMD_READ_CAPACITY_10:      {        U32 dwBlockCount;        if (diskIoctl (0, IOCTL_GET_SECTOR_COUNT, &dwBlockCount) != DRESULT_OK)          return NULL;        pbData [0] = (dwBlockCount >> 24) & 0xff;        pbData [1] = (dwBlockCount >> 16) & 0xff;        pbData [2] = (dwBlockCount >> 8) & 0xff;        pbData [3] = (dwBlockCount >> 0) & 0xff;        pbData [4] = (BLOCKSIZE >> 24) & 0xff;        pbData [5] = (BLOCKSIZE >> 16) & 0xff;        pbData [6] = (BLOCKSIZE >> 8) & 0xff;        pbData [7] = (BLOCKSIZE >> 0) & 0xff;      }      break;    case SCSI_CMD_READ_10 :      {        U32 dwLBA = (pbCDB [2] << 24) | (pbCDB [3] << 16) | (pbCDB [4] << 8) | (pbCDB [5]);        U32 dwBufPos = (dwOffset & (BLOCKSIZE - 1));        if (dwBufPos == 0)         {          U32 dwBlockNr = dwLBA + (dwOffset / BLOCKSIZE);          DBG ("R");          if (diskRead (0, abBlockBuf, dwBlockNr, 1))          {            dwSense = READ_ERROR;            DBG ("mscblockRead failed\n");            return NULL;          }        }        return abBlockBuf + dwBufPos;      }    case SCSI_CMD_WRITE_10:      {        U32 dwLBA = (pbCDB [2] << 24) | (pbCDB [3] << 16) | (pbCDB [4] << 8) | (pbCDB [5]);        U32 dwBufPos = (dwOffset + 64) & (BLOCKSIZE - 1);        if (dwBufPos == 0)        {          U32 dwBlockNr = dwLBA + (dwOffset / BLOCKSIZE);          DBG ("W");          if (diskWrite (0, abBlockBuf, dwBlockNr, 1))          {            dwSense = WRITE_ERROR;            DBG ("mscblockWrite failed\n");            return NULL;          }        }        return abBlockBuf + dwBufPos;      }    case SCSI_CMD_VERIFY_10 :      break;    default :      {        dwSense = INVALID_CMD_OPCODE;      }      return NULL;  }  return abBlockBuf;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91无套直看片红桃| 国产亚洲一区二区三区四区| jizzjizzjizz欧美| 国产成人精品网址| 国产一区二区三区在线观看精品| 日韩不卡在线观看日韩不卡视频| 一区二区三区精品在线| 亚洲视频在线一区| 亚洲欧洲制服丝袜| 亚洲欧美电影一区二区| 亚洲欧洲国产日本综合| 自拍偷拍亚洲欧美日韩| 亚洲情趣在线观看| 一区二区不卡在线播放 | 国产精品国产三级国产有无不卡 | 91丨porny丨最新| 99久久精品国产麻豆演员表| 不卡影院免费观看| 91婷婷韩国欧美一区二区| 91在线观看免费视频| 91亚洲精华国产精华精华液| 色吧成人激情小说| 欧美日本国产一区| 717成人午夜免费福利电影| 91精品国产综合久久香蕉麻豆| 欧美一级片免费看| 精品国产一区二区三区久久久蜜月| 精品国产一区二区三区不卡| 亚洲国产精品成人综合色在线婷婷 | 日韩片之四级片| 精品盗摄一区二区三区| 中文字幕欧美三区| 亚洲精品免费一二三区| 日韩电影免费一区| 国产成人综合网站| 一本大道久久a久久精二百| 欧美日韩中文精品| 精品国产乱码久久久久久久| 日本一区二区三区四区| 亚洲激情五月婷婷| 日本中文字幕一区| 懂色av噜噜一区二区三区av| 一本久久综合亚洲鲁鲁五月天 | 精品国产制服丝袜高跟| 中日韩免费视频中文字幕| 亚洲欧美激情小说另类| 日韩av中文字幕一区二区| 国内久久精品视频| 日本韩国欧美国产| 日韩一区二区高清| 综合久久国产九一剧情麻豆| 在线观看成人免费视频| wwww国产精品欧美| 一区二区三区免费观看| 国产揄拍国内精品对白| 色吧成人激情小说| 久久精品欧美日韩精品| 亚洲一区二三区| 国产在线观看免费一区| 欧美自拍偷拍一区| 久久午夜老司机| 香蕉成人伊视频在线观看| 国内精品伊人久久久久av影院| 色哟哟欧美精品| 久久嫩草精品久久久久| 亚洲国产成人av网| 成人激情动漫在线观看| 欧美一区二区三区系列电影| 中文字幕日本不卡| 极品少妇xxxx偷拍精品少妇| 欧美在线999| 国产精品欧美综合在线| 精品一二线国产| 欧美这里有精品| 国产精品美女www爽爽爽| 另类中文字幕网| 欧美日本不卡视频| 亚洲免费在线看| 成人福利视频在线看| 精品国产乱码久久久久久久| 午夜精品国产更新| 色先锋aa成人| 成人欧美一区二区三区1314| 国产精品自拍av| 精品久久久久久久久久久久久久久 | 欧美电影在线免费观看| 在线播放中文字幕一区| 一区二区三区四区在线免费观看| 国产在线精品视频| 91麻豆精品国产91久久久久 | 国产精品资源网| 91精品国产一区二区| 亚洲欧美日韩系列| 国产精品一卡二| 欧美一级日韩一级| 日韩一区中文字幕| av高清久久久| 久久久久久久综合狠狠综合| 午夜久久久久久久久久一区二区| 国产+成+人+亚洲欧洲自线| 91精品国产欧美一区二区18| 亚洲视频一二三区| 国产成人鲁色资源国产91色综| 色综合久久久网| 国产女人18毛片水真多成人如厕| 免费成人结看片| 欧美日韩国产三级| 亚洲高清免费在线| 91年精品国产| 国产精品丝袜黑色高跟| 日韩一区精品视频| 日韩免费一区二区三区在线播放| 亚洲电影一级片| 亚洲人123区| 成人激情校园春色| 国产精品视频在线看| 国产aⅴ综合色| 欧美哺乳videos| 国产麻豆视频一区| 久久婷婷成人综合色| 国内偷窥港台综合视频在线播放| 精品人伦一区二区色婷婷| 男人的天堂久久精品| 日韩天堂在线观看| 亚洲一区二区视频在线| 欧美日韩国产小视频| 五月天视频一区| 欧美美女激情18p| 五月天精品一区二区三区| 69堂精品视频| 久久国产夜色精品鲁鲁99| 久久色成人在线| 国产精品一区二区黑丝| 国产欧美日韩中文久久| 国产99久久久精品| 最近日韩中文字幕| 在线观看一区日韩| 亚洲一区在线观看视频| 欧美一区二区日韩| 狠狠狠色丁香婷婷综合激情| 久久精品亚洲一区二区三区浴池| 国产高清视频一区| 国产精品国产三级国产aⅴ入口 | av电影在线不卡| 夜夜嗨av一区二区三区中文字幕| 欧美日韩在线电影| 久久国产视频网| 国产精品美女久久久久久久网站| 国产+成+人+亚洲欧洲自线| 亚洲一区二区三区不卡国产欧美| 欧美福利一区二区| 国产呦萝稀缺另类资源| 国产精品美女一区二区| 欧美三电影在线| 国产自产高清不卡| 亚洲同性gay激情无套| 欧美三级电影在线看| 国产成人一级电影| 亚洲在线视频免费观看| 欧美一级夜夜爽| 成人深夜视频在线观看| 亚洲与欧洲av电影| 久久久久国产精品厨房| 91社区在线播放| 性感美女极品91精品| 久久久久99精品国产片| 色婷婷av一区| 国内成人精品2018免费看| 国产精品第五页| 欧美性色综合网| 福利一区二区在线| 亚洲成av人片在线| 国产精品天天看| 制服丝袜av成人在线看| 粉嫩av一区二区三区在线播放| 亚洲综合精品久久| 久久婷婷国产综合精品青草| 在线一区二区视频| 国产一区不卡视频| 亚洲国产综合色| 久久久午夜电影| 欧美一区二区三区在线观看 | 成人av网址在线观看| 久久成人久久爱| 亚洲最大色网站| 亚洲国产精品成人综合| 欧美高清激情brazzers| 懂色av噜噜一区二区三区av| 日韩欧美国产精品一区| 91在线播放网址| 激情图片小说一区| 亚洲v中文字幕| 一区在线中文字幕| 日韩欧美在线1卡| 欧美日韩成人综合天天影院| 99视频精品在线| 国产福利91精品一区二区三区| 日韩精品电影在线观看| 国产精品理论在线观看| 欧美国产精品v|