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

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

?? msc_bot.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	Bulk-only-transfer layer for mass storage.		This layers sits between the generic USB layers and the SCSI layer	and performs data transfer according to the BOT protocol.*/#include <string.h>#include "type.h"#include "usbdebug.h"#include "usbapi.h"#include "msc_bot.h"#include "msc_scsi.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;/**	Resets the BOT state machine */void MSCBotReset(void){	DBG("BOT reset in state %d\n", eState);	// reset BOT state	eState = eCBW;	// reset SCSI	SCSIReset();}/**	Prepares a CSW, to be sent on next bulk-IN interrupt			@param [in]	bStatus	CSW status */static void SendCSW(U8 bStatus){	int iResidue;		iResidue = CBW.dwCBWDataTransferLength - dwTransferSize;		// construct CSW	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);	// next state	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 CheckCBW(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;}/*************************************************************************	BOTStall	========		Local function to stall ongoing transfer			Which endpoint to stall is determined by looking at the transfer	direction intended by the host.**************************************************************************/static void BOTStall(void){	if ((CBW.bmCBWFlags & 0x80) || (CBW.dwCBWDataTransferLength == 0)) {		// stall data-in or CSW		USBHwEPStall(MSC_BULK_IN_EP, TRUE);	}	else {		// stall data-out		USBHwEPStall(MSC_BULK_OUT_EP, TRUE);	}}/*************************************************************************	HandleDataIn	============		Handles data from device-to-host		**************************************************************************/static void HandleDataIn(void){	int iChunk;		// process data for host in SCSI layer	pbData = SCSIHandleData(CBW.CBWCB, CBW.bCBWCBLength, pbData, dwOffset);	if (pbData == NULL) {		BOTStall();		SendCSW(STATUS_FAILED);		return;	}	// send data to host?	if (dwOffset < dwTransferSize) {		iChunk = MIN(64, dwTransferSize - dwOffset);		USBHwEPWrite(MSC_BULK_IN_EP, pbData, iChunk);		dwOffset += iChunk;	}		// are we done now?	if (dwOffset == dwTransferSize) {		if (dwOffset != CBW.dwCBWDataTransferLength) {			// stall pipe			DBG("stalling DIN");			BOTStall();		}		// done		SendCSW(STATUS_PASSED);	}}/*************************************************************************	HandleDataOut	=============		Handles data from host-to-device		**************************************************************************/static void HandleDataOut(void){	int iChunk;		if (dwOffset < dwTransferSize) {		// get data from host		iChunk = USBHwEPRead(MSC_BULK_OUT_EP, pbData, dwTransferSize - dwOffset);		// process data in SCSI layer		pbData = SCSIHandleData(CBW.CBWCB, CBW.bCBWCBLength, pbData, dwOffset);		if (pbData == NULL) {			BOTStall();			SendCSW(STATUS_FAILED);			return;		}		dwOffset += iChunk;	}		// are we done now?	if (dwOffset == dwTransferSize) {		if (dwOffset != CBW.dwCBWDataTransferLength) {			// stall pipe			DBG("stalling DOUT");			BOTStall();		}		SendCSW(STATUS_PASSED);	}}				/**	Handles the BOT bulk OUT endpoint			@param [in]	bEP			Endpoint number	@param [in]	bEPStatus	Endpoint status (indicates NAK, STALL, etc)		 */void MSCBotBulkOut(U8 bEP, U8 bEPStatus){	int 	iLen, iChunk;	BOOL	fHostIn, fDevIn;		// ignore events on stalled EP	if (bEPStatus & EP_STATUS_STALLED) {		return;	}	switch (eState) {	case eCBW:		iLen = USBHwEPRead(bEP, (U8 *)&CBW, sizeof(CBW));		// check if we got a good CBW		if (!CheckCBW(&CBW, iLen)) {			// see 6.6.1			USBHwEPStall(MSC_BULK_IN_EP, TRUE);			USBHwEPStall(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		pbData = SCSIHandleCmd(CBW.CBWCB, CBW.bCBWCBLength, &iLen, &fDevIn);		if (pbData == NULL) {			// unknown command			BOTStall();			SendCSW(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");			BOTStall();			SendCSW(STATUS_PHASE_ERR);			break;		}		// rule: if D > H, send CSW with status 2		if (iLen > CBW.dwCBWDataTransferLength) {			DBG("Negative residue\n");			BOTStall();			SendCSW(STATUS_PHASE_ERR);			break;		}		dwTransferSize = iLen;		if ((dwTransferSize == 0) || fDevIn) {			// data from device-to-host			eState = eDataIn;			HandleDataIn();		}		else {			// data from host-to-device			eState = eDataOut;		}		break;			case eDataOut:		HandleDataOut();		break;			case eDataIn:	case eCSW:		iChunk = USBHwEPRead(bEP, NULL, 0);		DBG("Phase error in state %d, %d bytes\n", eState, iChunk);		eState = eCBW;		break;		case eStalled:		// keep stalling		USBHwEPStall(MSC_BULK_OUT_EP, TRUE);		break;			default:		DBG("Invalid state %d\n", eState);		ASSERT(FALSE);		break;	}}/**	Handles the BOT bulk IN endpoint			@param [in]	bEP			Endpoint number	@param [in]	bEPStatus	Endpoint status (indicates NAK, STALL, etc)		 */void MSCBotBulkIn(U8 bEP, U8 bEPStatus){	// ignore events on stalled EP	if (bEPStatus & EP_STATUS_STALLED) {		return;	}	switch (eState) {		case eCBW:	case eDataOut:		// ignore possibly old ACKs		break;		case eDataIn:		HandleDataIn();		break;		case eCSW:		// wait for an IN token, then send the CSW		USBHwEPWrite(MSC_BULK_IN_EP, (U8 *)&CSW, 13);		eState = eCBW;		break;			case eStalled:		// keep stalling		USBHwEPStall(MSC_BULK_IN_EP, TRUE);		break;			default:		DBG("Invalid state %d\n", eState);		ASSERT(FALSE);		break;	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区中文字幕| 91九色02白丝porn| 91官网在线免费观看| 精品国产亚洲一区二区三区在线观看| 国产精品无圣光一区二区| 天天av天天翘天天综合网| voyeur盗摄精品| 精品国产99国产精品| 丝袜美腿成人在线| 91国内精品野花午夜精品| 中文字幕精品三区| 国产精品夜夜嗨| 欧美不卡视频一区| 日韩av一区二| 欧美视频一区二区三区| 亚洲欧美韩国综合色| 懂色av中文字幕一区二区三区| 日韩限制级电影在线观看| 午夜精品一区二区三区电影天堂| 99久久精品国产导航| 国产精品情趣视频| 国产一区二区三区综合| 精品国产三级电影在线观看| 免费av网站大全久久| 日韩一区二区三区在线| 日韩av一区二区在线影视| 欧美老女人第四色| 日精品一区二区三区| 欧美性受极品xxxx喷水| 亚洲国产视频a| 在线播放国产精品二区一二区四区 | 91精品国产黑色紧身裤美女| 亚洲va欧美va国产va天堂影院| 在线视频国产一区| 亚洲综合偷拍欧美一区色| 在线精品国精品国产尤物884a| 亚洲一区二区综合| 91精品国产综合久久精品性色| 亚洲国产成人精品视频| 欧美午夜不卡视频| 日韩av电影免费观看高清完整版| 91精品国产综合久久婷婷香蕉| 日本色综合中文字幕| 337p日本欧洲亚洲大胆色噜噜| 国内精品在线播放| 国产精品久久网站| 色系网站成人免费| 亚洲综合免费观看高清完整版 | 丝袜美腿亚洲一区二区图片| 日韩一级免费一区| 国产美女一区二区三区| 国产精品青草综合久久久久99| 91首页免费视频| 亚洲第一福利视频在线| 精品国产1区二区| 99久久精品免费看| 日韩vs国产vs欧美| 国产亚洲精品7777| 91成人免费在线| 捆绑紧缚一区二区三区视频 | www.亚洲国产| 亚洲自拍偷拍综合| 久久你懂得1024| 色婷婷综合久久| 精品一区二区在线免费观看| 中文字幕在线不卡一区| 在线电影国产精品| av网站免费线看精品| 天天射综合影视| 最新国产精品久久精品| 在线不卡中文字幕播放| 成人国产精品免费观看动漫| 免费高清在线视频一区·| 国产精品久久久久久久久晋中| 91精品国产aⅴ一区二区| 成人免费精品视频| 免费观看在线综合色| 亚洲欧洲中文日韩久久av乱码| 欧美一区二区视频在线观看2022| www.欧美色图| 激情文学综合丁香| 亚洲v中文字幕| 国产精品国产三级国产aⅴ无密码| 91精品国产综合久久婷婷香蕉| 99久久精品国产一区二区三区| 久久精品国产精品亚洲综合| 亚洲精品ww久久久久久p站| 久久久久国产成人精品亚洲午夜| 欧美日韩亚州综合| 91小视频在线免费看| 国产在线观看免费一区| 视频一区二区三区中文字幕| 亚洲乱码国产乱码精品精98午夜 | 精品欧美久久久| 欧美在线观看你懂的| 99久久国产综合精品女不卡| 精品影院一区二区久久久| 亚洲福中文字幕伊人影院| 亚洲男人天堂av| 国产精品乱人伦中文| 久久久综合网站| 精品久久人人做人人爱| 日韩精品一区二区三区在线| 欧美精品一二三| 欧美人与性动xxxx| 欧美日韩二区三区| 在线中文字幕一区| 色婷婷av一区二区三区gif| 成人黄色在线网站| eeuss影院一区二区三区 | 麻豆精品精品国产自在97香蕉| 亚洲第一av色| 天堂av在线一区| 天堂成人国产精品一区| 日韩精品午夜视频| 视频在线观看国产精品| 日本中文字幕不卡| 美女视频网站久久| 久久成人免费日本黄色| 国产一区二区精品久久91| 国产高清久久久久| 成人免费毛片a| 色偷偷88欧美精品久久久| 91亚洲国产成人精品一区二三| 一本色道a无线码一区v| 在线观看av一区二区| 91精品国产综合久久香蕉麻豆 | 777午夜精品免费视频| 欧美猛男超大videosgay| 777午夜精品免费视频| 日韩精品最新网址| 国产三级一区二区| 中文字幕中文字幕中文字幕亚洲无线| **性色生活片久久毛片| 亚洲精品国产无天堂网2021| 舔着乳尖日韩一区| 国精产品一区一区三区mba桃花| 国产成人免费xxxxxxxx| 91久久精品午夜一区二区| 69堂亚洲精品首页| 久久伊99综合婷婷久久伊| 国产精品乱人伦一区二区| 亚洲一区视频在线观看视频| 久久99蜜桃精品| 99re这里只有精品6| 欧美一区二区视频免费观看| 国产欧美精品一区aⅴ影院| 亚洲精品国产一区二区精华液 | 99re成人在线| 日韩一区二区三区在线观看| 国产精品你懂的在线| 日韩精品乱码免费| 国产精品一区二区三区四区| 欧美亚洲国产一区二区三区 | 欧美精品在线一区二区三区| 久久免费偷拍视频| 亚洲影院久久精品| 国产精品资源网| 在线成人av影院| 综合久久一区二区三区| 美女一区二区三区在线观看| 99re6这里只有精品视频在线观看| 欧美一区二区三区婷婷月色| 日韩一区在线播放| 国产一区二区三区不卡在线观看| 欧美伊人精品成人久久综合97| 久久久久久亚洲综合| 午夜欧美大尺度福利影院在线看 | 欧美夫妻性生活| 中文字幕日韩av资源站| 日韩国产一二三区| 在线观看一区不卡| 中文字幕欧美一| 国产一区二区在线视频| 欧美一区二区三区在线看| 亚洲一区在线观看免费| 91无套直看片红桃| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美国产日韩亚洲一区| 久久er99热精品一区二区| 欧美日韩久久一区| 亚洲免费观看在线观看| 成人午夜视频福利| 国产午夜一区二区三区| 久久91精品国产91久久小草| 91精品国产黑色紧身裤美女| 亚洲福利视频三区| 在线精品亚洲一区二区不卡| 亚洲私人影院在线观看| 99re在线精品| 亚洲日本va午夜在线影院| 成人精品免费看| 国产欧美视频一区二区三区| 国产一区亚洲一区| 久久久久久电影| 国产精品99久久久久久有的能看| 精品福利一区二区三区| 国产一区日韩二区欧美三区| 久久久精品国产免费观看同学| 国产自产2019最新不卡|