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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? scsi.h

?? 基于C51的U盤(pán)開(kāi)發(fā)源代碼!是從事移動(dòng)硬盤(pán)開(kāi)發(fā)者不可或缺的參考代碼!
?? H
字號(hào):
//傳輸方向
#define SCSI_CBW_IN				0x80
#define SCSI_CBW_OUT			0x00

//命令塊狀態(tài)
#define SCSI_CSW_PASSED			0x00
#define SCSI_CSW_FILED			0x01
#define SCSI_CSW_ERROR			0x02

//LUN相關(guān)參數(shù)
#define SCSI_MAX_LUN			0x00
#define SCSI_HDD1_LUN			0x00
#define SCSI_HDD2_LUN			0x01
#define SCSI_FLASH_LUN			0x02

//SCSI命令
#define SCSI_CMD_INQUIRY						0x12
#define SCSI_CMD_READ10							0x28
#define SCSI_CMD_WRITE10						0x2a
#define SCSI_CMD_READ_LONG						0x23
#define SCSI_CMD_READ_CAPACITY					0x25
#define SCSI_CMD_TEST_UNIT_READY				0x00
#define SCSI_CMD_REQUEST_SENSE					0x03
#define SCSI_CMD_MODE_SENSE6					0x1a

#define SCSI_CMD_EXTENDED_COPY					0x83
#define SCSI_CMD_LOG_SELECT						0x4c
#define SCSI_CMD_LOG_SENSE						0x4d
#define SCSI_CMD_MODE_SELECT6					0x15
#define SCSI_CMD_MODE_SELECT10					0x55
#define SCSI_CMD_MODE_SENSE10					0x5a
#define SCSI_CMD_PERSISTENT_RESERVE_IN			0x5e
#define SCSI_CMD_PERSISTENT_RESERVE_OUT			0x5f
#define SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL	0x12

struct SCSICBWStr					//命令塊包結(jié)構(gòu)
{
	DWORD	dSignature;				//包標(biāo)識(shí)符 USBC
	DWORD	dTag;					//包識(shí)別符
	DWORD	dDataLength;			//期望傳輸?shù)臄?shù)據(jù)
	BYTE	bmFlag;					//方向標(biāo)志
	BYTE	bLUN;					//LUN
	BYTE	bCBLength;				//命令塊大小
	BYTE	CBWCB[16];				//命令塊
};

struct SCSICSWStr					//命令狀態(tài)包
{
	DWORD	dSignature;				//包標(biāo)識(shí)符 USBS
	DWORD	dTag;					//包識(shí)別符
	DWORD	dDataResidue;			//實(shí)際處理的長(zhǎng)度
	BYTE	bStatus;				//命令狀態(tài)
};

struct SCSIRead10Str				//Read10命令數(shù)據(jù)結(jié)構(gòu)
{
	BYTE	OperateCode;			//命令代碼
	BYTE	Attribute;				//位屬性
	DWORD	LBA;					//LBA地址
	BYTE	Reserved;				//保留
	WORD	Length;					//返回長(zhǎng)度
	BYTE	Control;				//控制
};

struct SCSIWrite10Str				//Read10命令數(shù)據(jù)結(jié)構(gòu)
{
	BYTE	OperateCode;			//命令代碼
	BYTE	Attribute;				//位屬性
	DWORD	LBA;					//LBA地址
	BYTE	Reserved;				//保留
	WORD	Length;					//返回長(zhǎng)度
	BYTE	Control;				//控制
};

code BYTE temp1[]=
{
	0x00,0x00,0x00,0x10,0x00,0x01,0xf4,0x00,0x02,0x00,0x02,0x00,0x00,0x01,0xf4,0x00
};
code BYTE temp2[]=
{
	0x03,0x00,0x00,0x00
};

code BYTE SCSIStandardInquiry[]=
{
	0x00,
	0x00,				//removiable
	0x02,				//version
	0x02,				//response data format
	0x1f,				//additional length
	0x00,0x00,0x00,
	'M','a','s','h','i','m','a','r','o',' ','M','P','3',
	' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
	'1','.','0','0'
};

code BYTE SCSICapacity[]=
{
	0x00,0xc1,0xe2,0xa6,0x00,0x00,0x02,0x00
};

extern struct USBEP1BufferStr USBEP1Buffer;
xdata struct SCSICBWStr *SCSICBW=USBEP1Buffer.In;
xdata struct SCSICSWStr *SCSICSW=USBEP1Buffer.In;

extern void USBEP1ReadPacket(void);
extern void USBEP1WritePacket(void);

void SCSICBWProcess(void);
void SCSICSWProcess(BYTE Status,BYTE DataResidue);

void SCSIInquiry(void);
void SCSIRead10(void);
void SCSIWrite10(void);
void SCSIReadLong(void);
void SCSIReadCapacity(void);
void SCSITestUnitReady(void);
void SCSIRequestSense(void);
void SCSIModeSense6(void);


void SCSICBWProcess(void)
{
	//驗(yàn)證CBW有效性
	if (USBEP1Buffer.InLength!=0x1f) return;		//31字節(jié)
	if (SCSICBW->dSignature!=0x55534243) return;	//包標(biāo)記  USBC
	//驗(yàn)證CBW有意義
	if (SCSICBW->bLUN>SCSI_MAX_LUN) return;			//錯(cuò)誤的LUN
	if (SCSICBW->bCBLength>0x10) return;				//CBWCB長(zhǎng)度錯(cuò)誤
	switch (SCSICBW->CBWCB[0])
	{
		case SCSI_CMD_INQUIRY			:
			SCSIInquiry();
			USBEP2WritePacket();
			SCSICSWProcess(SCSI_CSW_PASSED,0);
			break;
		case SCSI_CMD_READ10			:
			SCSIRead10();
			SCSICSWProcess(SCSI_CSW_PASSED,0);
			break;
		case SCSI_CMD_WRITE10			:
			SCSIWrite10();
			SCSICSWProcess(SCSI_CSW_PASSED,0);
			break;
		case SCSI_CMD_READ_LONG			:
			SCSIReadLong();
			USBEP2WritePacket();
			SCSICSWProcess(SCSI_CSW_PASSED,SCSICBW->dDataLength - USBEP1Buffer.OutLength);
			break;
		case SCSI_CMD_READ_CAPACITY		:
//			printf("request CAPACITY\n");
			SCSIReadCapacity();
			USBEP2WritePacket();
			SCSICSWProcess(SCSI_CSW_PASSED,0);
			break;
		case SCSI_CMD_TEST_UNIT_READY	:
			SCSICSWProcess(SCSI_CSW_PASSED,0);
			break;
		case SCSI_CMD_REQUEST_SENSE		:
			printf("request sense\n");
			SCSIRequestSense();
			break;
		case SCSI_CMD_MODE_SENSE6		:
			SCSIModeSense6();
			USBEP2WritePacket();
//			UEPNUM=0x02;
//			USB_SEND_STALL_PACKET;
			SCSICSWProcess(SCSI_CSW_PASSED,0xbc);
			break;
	}

}

void SCSICSWProcess(BYTE Status,BYTE DataResidue)
{
	SCSICSW->dSignature=0x55534253;
	SCSICSW->dDataResidue=DataResidue;
	SCSICSW->bStatus=Status;
	USBEP1Buffer.Out=(BYTE *)SCSICSW;
	USBEP1Buffer.OutLength=13;
	USBEP2WritePacket();
}

void SCSIInquiry(void)
{
	if (SCSICBW->CBWCB[1]==0x00&&SCSICBW->CBWCB[2]==0)		//EVPD=0 CMDDT=0 PAGECODE=0
	{//STANDARD
		USBEP1Buffer.Out=SCSIStandardInquiry;
		USBEP1Buffer.OutLength=sizeof(SCSIStandardInquiry);
	}
	else if (SCSICBW->CBWCB[1]==0x00&&SCSICBW->CBWCB[2]!=0)	//EVPD=0 CMDDT=0 PAGECODE!=0
	{//CHECK CONDITION

	}
	else if (SCSICBW->CBWCB[1]==0x01)		//EVPD=0 CMDDT=1
	{//CHECK CONDITION

	}
	else if (SCSICBW->CBWCB[1]==0x02)		//EVPD=1 CMDDT=0
	{

	}
	else									//EVPD=1	CMDDT=1
	{

	}
}

void SCSIRead10(void)
{
	data WORD i;
	data BYTE m,n;
	xdata BYTE *sector;

	xdata struct SCSIRead10Str *SCSICmdRead10=SCSICBW->CBWCB;

	while (!IDEStatus(IDE_STATUS_BSY,IDE_WAIT,FALSE,255));
	while (!IDEStatus(IDE_STATUS_DRDY,IDE_WAIT,TRUE,255));
	sector=(BYTE *)&SCSICmdRead10->LBA;
//	printf("read sector:%08lx,%02bx...",*(DWORD *)sector,(BYTE)SCSICmdRead10->Length);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA0,sector[3]);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA1,sector[2]);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA2,sector[1]);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA3,0xe0|(sector[0]&0x0f));
	IDE_WRITE_LSB(IDE_ADDR_CMD_SECCNT,(BYTE)(SCSICmdRead10->Length));
	IDE_WRITE_LSB(IDE_ADDR_CMD_COMMAND,IDE_CMD_READ);

	UEPNUM=0x02;
	for(i=0;i<SCSICmdRead10->Length;i++)
	{
		while (!IDEStatus(IDE_STATUS_BSY,IDE_WAIT,FALSE,255));
		while (!IDEStatus(IDE_STATUS_DRDY,IDE_WAIT,TRUE,255));
		for(m=0;m<8;m++)
		{
			SET_BIT_7(UEPSTAX);						//設(shè)置DIR
			for(n=0;n<32;n++)
			{
				
				IDE_READ_WORD(IDE_ADDR_CMD_DATA,UEPDATX,UEPDATX);
			}
			SET_BIT_4(UEPSTAX);						//設(shè)置TXRDY
			while(!( UEPSTAX & 0x01 ));				//等待TXCMP
			CLEAR_BIT_0(UEPSTAX);					//清除TXCMP
		}
	}
}

void SCSIWrite10(void)
{
	register WORD i;
	register BYTE m,n,hi;
	xdata BYTE *sector;
	bit k;
	xdata struct SCSIWrite10Str *SCSICmdWrite10=SCSICBW->CBWCB;

	sector=(BYTE *)&SCSICmdWrite10->LBA;
//	printf("write sector:%08lx,%02bx...",*(DWORD *)sector,(BYTE)SCSICmdWrite10->Length);
	while (!IDEStatus(IDE_STATUS_BSY,IDE_WAIT,FALSE,255));
//	printf("BSY ok ");
	while (!IDEStatus(IDE_STATUS_DRDY,IDE_WAIT,TRUE,255));
//	printf("DRDY ok ");
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA0,sector[3]);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA1,sector[2]);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA2,sector[1]);
	IDE_WRITE_LSB(IDE_ADDR_CMD_LBA3,0xe0|(sector[0]&0x0f));
	IDE_WRITE_LSB(IDE_ADDR_CMD_SECCNT,(BYTE)(SCSICmdWrite10->Length));
	IDE_WRITE_LSB(IDE_ADDR_CMD_COMMAND,IDE_CMD_WRITE);
	while (!IDEStatus(IDE_STATUS_BSY,IDE_WAIT,FALSE,255));
//	printf("BSY ok ");
	while(!IDEStatus(IDE_STATUS_DRQ,IDE_WAIT,TRUE,255));
//	printf("DRQ ok \n");
	UEPNUM=0x01;
		while((UEPSTAX&(USB_INT_RXOUTB0|USB_INT_RXOUTB1))!=0x42);
		if (UEP_BIT_DTGL) k=1; else k=0;
	for(i=0;i<SCSICmdWrite10->Length;i++)
	{
		for(m=0;m<8;m++)
		{
//			if (UEP_BIT_DTGL)
			{
				while(!(UEPSTAX&(USB_INT_RXOUTB0|USB_INT_RXOUTB1)));
//				printf("RX%bd--%02bx-%02bx-%02bx ",k,UBYCTX,UEPSTAX,UEPCONX);
				for(n=0;n<UBYCTX;n+=2)
				{
					hi=UEPDATX;
//					lo=UEPDATX;
//					printf("%02bx %02bx ",hi,lo);
					IDE_WRITE_WORD(IDE_ADDR_CMD_DATA,hi,UEPDATX);
				}
//				printf("\n");
				if (k) CLEAR_BIT_6(UEPSTAX); else CLEAR_BIT_1(UEPSTAX);			//清RXOUTB0
				k=!k;
//				printf("RB0 CLEARED %04d,%02bd\n",k++,m);
			}
/*			else
			{
//			while(!UEPSTAX&USB_INT_RXOUTB1);
				printf("RX1--%02bx-%02bx-%02bx \n",UBYCTX,UEPSTAX,UEPCONX);
				for(n=0;n<UBYCTX;n+=2)
				{
					hi=UEPDATX;
					lo=UEPDATX;
//					printf("%02bx %02bx ",hi,lo);
//					IDE_WRITE_WORD(IDE_ADDR_CMD_DATA,hi,lo);
				}
				m++;
				CLEAR_BIT_1(UEPSTAX);				//清RXOUTB1
//				printf("RB1 CLEARED %04d,%02bd\n",k++,m);
			}*/
		}
	}
//	printf("write ok\n");
}
								
void SCSIReadLong(void)
{
	USBEP1Buffer.Out=temp1;
	USBEP1Buffer.OutLength=sizeof(temp1);
}

void SCSIReadCapacity(void)
{
	USBEP1Buffer.Out=SCSICapacity;
	USBEP1Buffer.OutLength=sizeof(SCSICapacity);
}

void SCSIRequestSense(void)
{

}

void SCSIModeSense6(void)
{
	USBEP1Buffer.Out=temp2;
	USBEP1Buffer.OutLength=sizeof(temp2);
}


?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产麻豆9l精品三级站| 一区二区三区免费网站| 91麻豆成人久久精品二区三区| 日韩国产欧美三级| 国产精品久久久久婷婷二区次| 欧美人妇做爰xxxⅹ性高电影| 国产91丝袜在线播放0| 亚洲福利视频三区| 国产精品久99| 精品成人a区在线观看| 欧美性三三影院| 99精品国产视频| 国产一区免费电影| 男女性色大片免费观看一区二区 | 97久久人人超碰| 麻豆91免费看| 午夜国产精品影院在线观看| 日韩一区在线免费观看| 久久精品欧美一区二区三区麻豆| 欧美日免费三级在线| 99视频精品在线| 高清在线观看日韩| 国产精品123| 国产精一区二区三区| 久久成人久久鬼色| 久久精品99国产国产精| 蜜芽一区二区三区| 日本不卡的三区四区五区| 首页综合国产亚洲丝袜| 午夜成人免费视频| 亚洲国产精品一区二区久久恐怖片| 亚洲欧美日韩在线| 依依成人精品视频| 亚洲男同性恋视频| 亚洲一区二区三区三| 一个色综合av| 亚洲国产日韩一区二区| 亚洲高清视频在线| 日韩激情一二三区| 日韩高清电影一区| 日韩电影免费在线| 日韩精品电影在线观看| 欧美a一区二区| 国内精品视频一区二区三区八戒| 久草这里只有精品视频| 精品一区二区三区的国产在线播放| 日韩福利视频导航| 麻豆freexxxx性91精品| 国产精品18久久久| 99久久精品国产网站| 91精品91久久久中77777| 欧洲生活片亚洲生活在线观看| 91九色02白丝porn| 欧美人体做爰大胆视频| 欧美v国产在线一区二区三区| 欧美成人欧美edvon| 国产无人区一区二区三区| 国产精品久久网站| 亚洲一区二区不卡免费| 麻豆精品一区二区av白丝在线| 久草热8精品视频在线观看| 国产精品亚洲第一区在线暖暖韩国| 波多野结衣在线一区| 91久久香蕉国产日韩欧美9色| 欧美丝袜自拍制服另类| 欧美成人官网二区| 国产精品青草久久| 天天免费综合色| 国产一区二区导航在线播放| 91在线观看下载| 欧美福利一区二区| 久久久亚洲精华液精华液精华液 | 中文字幕日韩av资源站| 亚洲国产欧美在线| 激情五月婷婷综合网| 91亚洲精品乱码久久久久久蜜桃 | 久久一二三国产| 亚洲欧美一区二区在线观看| 日韩专区在线视频| 成人网男人的天堂| 欧美一区二视频| 欧美激情综合在线| 天堂成人免费av电影一区| 国产成a人亚洲| 欧美精品亚洲一区二区在线播放| 国产色一区二区| 日韩中文字幕av电影| 99精品视频在线观看免费| 日韩一区二区三区观看| 亚洲精品伦理在线| 国内精品视频一区二区三区八戒| 欧日韩精品视频| 国产精品视频一二| 久久99精品一区二区三区三区| 色哟哟精品一区| 国产日韩欧美精品在线| 日韩成人一级大片| 欧美又粗又大又爽| 亚洲国产成人午夜在线一区| 日本伊人精品一区二区三区观看方式| 成人国产在线观看| 精品美女一区二区| 石原莉奈一区二区三区在线观看| av在线不卡免费看| 久久综合久久99| 奇米影视一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 成人欧美一区二区三区白人| 国产乱子伦视频一区二区三区| 在线观看91av| 一区二区三区高清在线| 99re这里只有精品视频首页| 久久久久久9999| 奇米影视一区二区三区| 欧美丝袜丝交足nylons| 亚洲精品v日韩精品| 丁香亚洲综合激情啪啪综合| 精品乱人伦一区二区三区| 视频一区国产视频| 欧美日韩国产首页| 亚洲国产裸拍裸体视频在线观看乱了| 91色九色蝌蚪| 亚洲欧美日韩国产一区二区三区| jizz一区二区| 一区在线播放视频| av电影在线观看一区| 中文字幕五月欧美| 99国产精品国产精品毛片| 成人欧美一区二区三区视频网页| 福利91精品一区二区三区| 久久精品免费在线观看| 国产成a人亚洲精| 国产精品久久免费看| 91在线观看美女| 亚洲在线免费播放| 欧美日韩国产成人在线91| 亚洲va国产天堂va久久en| 欧美高清dvd| 久久se精品一区精品二区| 精品国产乱码久久久久久图片| 狠狠色狠狠色综合| 国产女主播一区| 91免费视频网址| 亚洲国产日韩一区二区| 欧美一区日韩一区| 国内精品免费在线观看| 国产亚洲综合av| 99久久精品免费看国产免费软件| 中文字幕日韩av资源站| 在线观看日韩精品| 欧美aⅴ一区二区三区视频| 2021久久国产精品不只是精品| 国产精品一区二区三区乱码| 国产精品二区一区二区aⅴ污介绍| www.欧美精品一二区| 亚洲在线观看免费| 日韩色在线观看| 国产成人亚洲精品狼色在线| 欧美高清在线精品一区| 在线看国产一区二区| 青青草国产精品97视觉盛宴| 国产日韩精品一区二区浪潮av| www.亚洲色图| 日本女人一区二区三区| 国产亚洲1区2区3区| 91久久免费观看| 免费成人结看片| 国产精品成人免费| 欧美精品日韩综合在线| 国产a视频精品免费观看| 亚洲精品成a人| 久久综合网色—综合色88| 91免费国产视频网站| 日本在线观看不卡视频| 欧美国产视频在线| 欧美少妇一区二区| 国产精品996| 亚洲国产精品天堂| 国产日产精品一区| 欧美视频你懂的| 盗摄精品av一区二区三区| 亚洲国产sm捆绑调教视频| 久久综合九色综合97婷婷| 色av成人天堂桃色av| 国产一区二区91| 亚洲成人免费视| 国产精品进线69影院| 日韩精品一区在线| 日本久久一区二区三区| 精品一区免费av| 亚洲一二三四在线| 欧美激情在线免费观看| 777久久久精品| 一本色道久久综合亚洲aⅴ蜜桃| 国内精品久久久久影院薰衣草 | 国产91高潮流白浆在线麻豆| 亚洲成人黄色影院| 亚洲精品va在线观看| 中文字幕欧美区| 精品伦理精品一区|