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

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

?? msc_scsi.c

?? Free Usb Stack for NXP LPC2xxx microcontrollers.
?? 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.*//**	@file	This is the SCSI layer of the USB mass storage application example.	This layer depends directly on the blockdev layer.		Windows peculiarities:	* Size of REQUEST SENSE CDB is 12 bytes instead of expected 6	* Windows requires VERIFY(10) command to do a format.	  This command is not mandatory in the SBC/SBC-2 specification.*/#include <string.h>		// memcpy#include "type.h"#include "usbdebug.h"#include "blockdev.h"#include "msc_scsi.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 conditionsstatic U32			dwSense;	// hex: 00aabbcc, where aa=KEY, bb=ASC, cc=ASCQstatic 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 laterstatic 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 datastatic U8 abBlockBuf[512];typedef struct {	U8		bOperationCode;	U8		abLBA[3];	U8		bLength;	U8		bControl;} TCDB6;/*************************************************************************	SCSIReset	=========		Resets any SCSI state		**************************************************************************/void SCSIReset(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 * SCSIHandleCmd(U8 *pbCDB, U8 iCDBLen, 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) {	// test unit ready (6)	case SCSI_CMD_TEST_UNIT_READY:		DBG("TEST UNIT READY\n");		*piRspLen = 0;		break;		// request sense (6)	case SCSI_CMD_REQUEST_SENSE:		DBG("REQUEST SENSE (%06X)\n", dwSense);		// check params		*piRspLen = MIN(18, pCDB->bLength);		break;		case SCSI_CMD_FORMAT_UNIT:		DBG("FORMAT UNIT %02X\n", pbCDB[1]);		*piRspLen = 0;		break;		// inquiry (6)	case SCSI_CMD_INQUIRY:		DBG("INQUIRY\n");		// see SPC3r23, 4.3.4.6		*piRspLen = MIN(36, pCDB->bLength);		break;			// read capacity (10)	case SCSI_CMD_READ_CAPACITY_10:		DBG("READ CAPACITY\n");		*piRspLen = 8;		break;			// read (10)	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;	// write (10)	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) {			// we don't support BYTCHK			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");		// unsupported command		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 * SCSIHandleData(U8 *pbCDB, U8 iCDBLen, U8 *pbData, U32 dwOffset){	TCDB6	*pCDB;	U32		dwLBA;	U32		dwBufPos, dwBlockNr;	U32		dwDevSize, dwMaxBlock;		pCDB = (TCDB6 *)pbCDB;		switch (pCDB->bOperationCode) {	// test unit ready	case SCSI_CMD_TEST_UNIT_READY:		if (dwSense != 0) {			return NULL;		}		break;		// request sense	case SCSI_CMD_REQUEST_SENSE:		memcpy(pbData, abSense, 18);		// fill in KEY/ASC/ASCQ		pbData[2] = (dwSense >> 16) & 0xFF;		pbData[12] = (dwSense >> 8) & 0xFF;		pbData[13] = (dwSense >> 0) & 0xFF;		// reset sense data		dwSense = 0;		break;		case SCSI_CMD_FORMAT_UNIT:		// nothing to do, ignore this command		break;		// inquiry	case SCSI_CMD_INQUIRY:		memcpy(pbData, abInquiry, sizeof(abInquiry));		break;			// read capacity	case SCSI_CMD_READ_CAPACITY_10:		// get size of drive (bytes)		BlockDevGetSize(&dwDevSize);		// calculate highest LBA		dwMaxBlock = (dwDevSize - 1) / 512;				pbData[0] = (dwMaxBlock >> 24) & 0xFF;		pbData[1] = (dwMaxBlock >> 16) & 0xFF;		pbData[2] = (dwMaxBlock >> 8) & 0xFF;		pbData[3] = (dwMaxBlock >> 0) & 0xFF;		pbData[4] = (BLOCKSIZE >> 24) & 0xFF;		pbData[5] = (BLOCKSIZE >> 16) & 0xFF;		pbData[6] = (BLOCKSIZE >> 8) & 0xFF;		pbData[7] = (BLOCKSIZE >> 0) & 0xFF;		break;			// read10	case SCSI_CMD_READ_10:		dwLBA = (pbCDB[2] << 24) | (pbCDB[3] << 16) | (pbCDB[4] << 8) | (pbCDB[5]);		// copy data from block buffer		dwBufPos = (dwOffset & (BLOCKSIZE - 1));		if (dwBufPos == 0) {			// read new block			dwBlockNr = dwLBA + (dwOffset / BLOCKSIZE);			DBG("R");			if (BlockDevRead(dwBlockNr, abBlockBuf) < 0) {				dwSense = READ_ERROR;				DBG("BlockDevRead failed\n");				return NULL;			}		}		// return pointer to data		return abBlockBuf + dwBufPos;	// write10	case SCSI_CMD_WRITE_10:		dwLBA = (pbCDB[2] << 24) | (pbCDB[3] << 16) | (pbCDB[4] << 8) | (pbCDB[5]);				// copy data to block buffer		dwBufPos = ((dwOffset + 64) & (BLOCKSIZE - 1));		if (dwBufPos == 0) {			// write new block			dwBlockNr = dwLBA + (dwOffset / BLOCKSIZE);			DBG("W");			if (BlockDevWrite(dwBlockNr, abBlockBuf) < 0) {				dwSense = WRITE_ERROR;				DBG("BlockDevWrite failed\n");				return NULL;			}		}		// return pointer to next data		return abBlockBuf + dwBufPos;			case SCSI_CMD_VERIFY_10:		// dummy implementation		break;			default:		// unsupported command		dwSense = INVALID_CMD_OPCODE;		return NULL;	}		// default: return pointer to start of block buffer	return abBlockBuf;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
538prom精品视频线放| 一区二区免费在线| 一区二区三区在线影院| 精东粉嫩av免费一区二区三区| 99免费精品视频| 精品不卡在线视频| 免费成人你懂的| 在线免费观看一区| 国产精品动漫网站| 国产一区二区中文字幕| 欧美精品免费视频| 亚洲一区二区四区蜜桃| 99久久免费国产| 国产色婷婷亚洲99精品小说| 日本不卡一二三| 欧美日韩国产一区二区三区地区| 国产精品区一区二区三| 久久久亚洲综合| 色婷婷激情一区二区三区| 成人久久18免费网站麻豆 | 日韩码欧中文字| 国产盗摄一区二区三区| 欧美一级免费观看| 国产午夜精品理论片a级大结局| 久久不见久久见免费视频1| 国产精品婷婷午夜在线观看| 欧美日韩一本到| 国产一区二区女| 亚洲视频在线一区| 日韩欧美在线网站| 91麻豆6部合集magnet| 五月天丁香久久| 国产精品高潮呻吟| 日韩一级大片在线观看| 91蜜桃视频在线| 国产九九视频一区二区三区| 亚洲综合在线免费观看| 国产校园另类小说区| 精品视频在线免费观看| 成人免费视频视频| 久久精品999| 婷婷综合久久一区二区三区| 国产精品久久国产精麻豆99网站| 69p69国产精品| 在线观看日韩国产| www.欧美日韩国产在线| 极品少妇xxxx精品少妇偷拍| 亚洲成精国产精品女| 中文字幕一区免费在线观看| 亚洲精品在线免费播放| 欧美日韩一区国产| 色婷婷国产精品| av不卡在线播放| 国产精品亚洲第一区在线暖暖韩国| 午夜免费久久看| 亚洲精品国产无套在线观| 日本一区二区综合亚洲| 久久影视一区二区| 日韩美女视频一区二区在线观看| 欧美午夜免费电影| 色综合久久中文综合久久97| av在线免费不卡| 国产aⅴ综合色| 精品一区二区三区视频| 日本aⅴ亚洲精品中文乱码| 亚洲自拍都市欧美小说| 亚洲欧美日韩综合aⅴ视频| 国产女人aaa级久久久级| 久久人人超碰精品| 久久综合色之久久综合| 欧美成人福利视频| 欧美大片在线观看一区二区| 欧美一级日韩不卡播放免费| 678五月天丁香亚洲综合网| 欧美在线小视频| 欧美日韩国产系列| 在线综合亚洲欧美在线视频| 欧美一区二区在线看| 欧美挠脚心视频网站| 欧美一区中文字幕| 日韩欧美一级精品久久| 精品国产欧美一区二区| 精品99久久久久久| 国产午夜亚洲精品不卡| 国产精品久久久久aaaa| 中文字幕一区二区不卡| 一区二区三区久久久| 亚洲第一二三四区| 日本不卡免费在线视频| 久久99国产精品麻豆| 国产乱一区二区| youjizz久久| 欧美性感一区二区三区| 欧美一区二区三区在线观看| 亚洲精品一线二线三线| 中文字幕免费在线观看视频一区| 综合中文字幕亚洲| 午夜视频在线观看一区二区| 蜜桃视频一区二区三区| 国产精品99久久久久久久女警 | 欧美激情资源网| 综合欧美一区二区三区| 亚洲一区二区成人在线观看| 美女视频免费一区| 成人福利视频网站| 欧美日韩一卡二卡三卡| 久久综合网色—综合色88| 中文字幕佐山爱一区二区免费| 亚洲午夜精品一区二区三区他趣| 免费在线观看不卡| 99久久伊人网影院| 欧美一区二区三区免费在线看 | 亚洲国产精品一区二区www| 日韩va欧美va亚洲va久久| 国产91精品一区二区麻豆网站| 91免费国产视频网站| 欧美一级夜夜爽| 亚洲视频1区2区| 精品一区二区三区免费观看| 91玉足脚交白嫩脚丫在线播放| 日韩午夜激情免费电影| 日韩毛片在线免费观看| 激情综合色播五月| 在线观看精品一区| 久久九九久久九九| 亚洲一区二区三区精品在线| 国产精品456| 91精品国产一区二区三区香蕉| 国产精品久久久久久户外露出 | 亚洲品质自拍视频| 久久99国产精品成人| 日本韩国欧美一区| 欧美激情一区不卡| 久久成人av少妇免费| 欧美性生活影院| 亚洲欧洲在线观看av| 国产一区二区福利视频| 欧美狂野另类xxxxoooo| 综合欧美亚洲日本| 高清不卡一区二区在线| 欧美岛国在线观看| 日韩国产精品久久| 欧美视频第二页| 亚洲男同性视频| proumb性欧美在线观看| 日韩一级免费观看| 青青草97国产精品免费观看 | 国产欧美综合在线观看第十页| 天天做天天摸天天爽国产一区 | 成人一二三区视频| 精品88久久久久88久久久| 视频一区二区三区入口| 色婷婷综合在线| 中文字幕中文字幕中文字幕亚洲无线| 久久99精品视频| 日韩免费视频线观看| 日本在线不卡一区| 欧美三片在线视频观看| 亚洲综合色噜噜狠狠| 91美女片黄在线观看| 国产精品护士白丝一区av| 国产成人免费视频精品含羞草妖精| 精品国精品国产尤物美女| 人人狠狠综合久久亚洲| 91精品国产黑色紧身裤美女| 五月婷婷综合网| 777久久久精品| 免费在线视频一区| 精品少妇一区二区三区视频免付费 | 亚洲最大色网站| 欧美午夜精品免费| 亚洲国产精品欧美一二99| 91国内精品野花午夜精品| 亚洲乱码国产乱码精品精可以看| 97国产一区二区| 亚洲国产精品久久艾草纯爱| 欧美日韩免费一区二区三区 | 国产很黄免费观看久久| 久久精品这里都是精品| 国产福利一区二区三区| 国产精品无遮挡| 91麻豆成人久久精品二区三区| 一区二区三区四区亚洲| 欧美日韩精品系列| 久久精品国产77777蜜臀| wwwwxxxxx欧美| 99久久精品国产网站| 亚洲va欧美va国产va天堂影院| 欧美高清视频在线高清观看mv色露露十八| 午夜免费久久看| 久久嫩草精品久久久精品一| 成人自拍视频在线| 亚洲最色的网站| 精品久久人人做人人爰| 成人av电影在线观看| 亚洲bt欧美bt精品| 国产亚洲欧美中文| 91国产视频在线观看| 免费在线视频一区| 日韩美女久久久|