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

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

?? bulk_only.#1

?? 源碼 : KIEL C 單片機 : C8051F320 功能 : U盤 (64M) 關鍵字 : C8051F320,U盤,NANDFLASH,FAT,SCH 描述 : 源碼完全可運行
?? #1
字號:
#include "c8051F320.h"
#include "stdio.h"
#include "intrins.h"
/////////////////////////////
#include "Usb_FunDec.h"
#include "Usb_Parameter.h"
#include "Usb_Register.h"
#include "Usb_Request.h"
#include "Usb_SCSI_Descreptor.h"
///////////////////////////////////////////////////////////////////////////////////////////
sbit    LED			= P0^0;		//LED控制腳
// Bulk傳輸處理函數
void Interpret_CBW(void);		// 解釋CBW命令
void TransDataGoOn(void);		// 繼續傳輸
void TransCSW(void);			// 發送CSW
void Bulk_Receive_Data(void);	// 接收數據
void Copy(unsigned char *PEnd,unsigned char *PSource,unsigned int num);	// 在Bulk_Out過程中將Bulk_Buffer中的數據拷貝到Bulk_PACKET中
// 外部函數調用
extern void 			Flash_Read_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned int Data_Length);
extern unsigned char 	Flash_Write_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned int Data_Length);
extern unsigned char 	Flash_Erase_Block(unsigned int BlockNum);	
// 外部變量
extern unsigned char Ep_Status[3];
// BUlk傳輸變量
unsigned char Bulk_Status = BULK_IDLE;				// Bulk傳輸狀態
unsigned char Bulk_CSW[13]={0x55,0x53,0x42,0x53,};
xdata struct CBW
{
	unsigned char dCBWstagnature[4];
	unsigned char dCBWTag[4];
	unsigned char dCBWDataTransLength[4];
	unsigned char bmCBWFlags;
	unsigned char dCBWLun;
	unsigned char dCBWCBLength;
	unsigned char CBWCB[16];
}Bulk_CBW;
xdata unsigned char Bulk_PACKET[512];	// 讀寫FLASH時的數據緩沖區
xdata unsigned char Bulk_Buffer[64];	// FIFO緩沖區
unsigned int LBA=0;						// LBA
unsigned int Transfer_Length=0;			// 要傳輸的長度,單位為扇區
unsigned int nCurrentBlock=0;			// 當前的Block地址
unsigned int nCurrentPage=0;			// 當前的Page地址
unsigned char *pCurrentBuf;				// Bulk傳輸中的指針
unsigned int nBufCount=0;				// FIFO讀寫過程中傳輸的數據量
unsigned int nBegainPage=0;				// Bulk_Out傳輸中的開始Page地址
/////////////////////////////////////////////////////////////////////////////////////////////			
void Handle_In1()
{
    unsigned char ControlReg;
   	UWrite_Byte(INDEX, 1);           
   	URead_Byte(EINCSRL, ControlReg); 
   	if (Ep_Status[1] == EP_HALT)         
   	{
      	UWrite_Byte(EINCSRL, rbInSDSTL);
   	}
   	else                                 
   	{
		if (ControlReg & rbInSTSTL)       
      	{
         	UWrite_Byte(EINCSRL, rbInCLRDT);//清除SDSTL和STSTL,并將CLRDT寫1使toggle復位為0
      	}
		if (ControlReg & rbInUNDRUN)      	
      	{
         	UWrite_Byte(EINCSRL, 0x00);		// 清除UNDRUN,注意toggle位不復位
      	}
		if(!(ControlReg & rbInINPRDY))
		{
			switch(Bulk_Status)
			{
				case BULK_DATA_TRANS:	TransDataGoOn();	break;
				case BULK_DATA_END:		TransCSW();			break;
				default:									break;
			} 
		}                                      
   	}                                   
}
/////////////////////////////////////////////////////////////////////////////////////////////			
// Handle_Out2
void Handle_Out2()
{
	unsigned int   Count=0;
   	unsigned char  ControlReg;
   	UWrite_Byte(INDEX, 2);           		// Set index to endpoint 2 registers
   	URead_Byte(EOUTCSRL, ControlReg);
   	if (Ep_Status[2] == EP_HALT)         	// If endpoint is halted, send a stall
   	{
      	UWrite_Byte(EOUTCSRL, rbOutSDSTL);

   	}
	else
	{
	    if (ControlReg & rbOutSTSTL)      	
	    {
	         UWrite_Byte(EOUTCSRL, rbOutCLRDT);	//清除SDSTL和STSTL,并將CLRDT寫1使toggle復位為0
	    }
		  	////////////////////////////////////////////////////////////////
		if(ControlReg & rbOutOPRDY)
		{
			UWrite_Byte(INDEX, 2); 
			URead_Byte(EOUTCNTL, Count);
			Fifo_Read(FIFO_EP2, Count, Bulk_Buffer);
			UWrite_Byte(INDEX, 2);           
	      	UWrite_Byte(EOUTCSRL, 0);   	// Clear Out Packet ready bit
			if((Bulk_Status !=BULK_DATA_RECIEVE) && (Bulk_Buffer[0]==0x55))
			{
				Interpret_CBW();
			}	
			else
			{			
				Bulk_Receive_Data();
			}
		}
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void Interpret_CBW()
{
	unsigned char i=0;
	Bulk_CSW[4] = Bulk_Buffer[4];
	Bulk_CSW[5] = Bulk_Buffer[5];
	Bulk_CSW[6] = Bulk_Buffer[6];
	Bulk_CSW[7] = Bulk_Buffer[7];
	for(i=0;i<12;i++)							//提取SCSI命令字
	{
		Bulk_CBW.CBWCB[i] = Bulk_Buffer[15+i];
	}
	switch(Bulk_CBW.CBWCB[0])
	{
		case INQUIRY:					SCSI_Inquiry();					break;
		case MODE_SENSE:				SCSI_Mode_Sense();				break;
		case READ10:					SCSI_Read10();					break;
		case READ_CAPACITY: 			SCSI_Read_Capacity();			break;
		case TEST_UNIT_READY: 			SCSI_Test_Unit_Ready();			break;
		case VERIFY:					SCSI_Verify();					break;
		case WRITE10: 					SCSI_Write10();					break;
		case MEDIUM_REMOVAL: 			SCSI_Medium_Removal();			break;

		case Vender_Order:				SCSI_Vender_Order();			break;
		default:						SCSI_Reserved();				break;
	}	
}
///////////////////////////////////////////////////////////////////////////////////////////////////			
void SCSI_Inquiry(void)
{
	if(Bulk_CBW.CBWCB[4]!=0)
	{
		Bulk_Status=BULK_DATA_END;
		Fifo_Write(FIFO_EP1,sizeof(Device_InquiryData),Device_InquiryData);
		UWrite_Byte(INDEX, 1);
		UWrite_Byte(EINCSRL, rbInINPRDY);
	}
	else
	{}
}
void SCSI_Mode_Sense(void)
{
	Bulk_Status=BULK_DATA_END;
	Fifo_Write(FIFO_EP1,sizeof(Device_ModeSense),Device_ModeSense);
	UWrite_Byte(INDEX, 1);
	UWrite_Byte(EINCSRL, rbInINPRDY);
}
void SCSI_Read_Capacity(void)
{
	Bulk_Status=BULK_DATA_END;
	Fifo_Write(FIFO_EP1,sizeof(Device_Capacity),Device_Capacity);
	UWrite_Byte(INDEX, 1);
	UWrite_Byte(EINCSRL, rbInINPRDY);
}
void SCSI_Vender_Order()
{
	Bulk_Status=BULK_DATA_END;
	Fifo_Write(FIFO_EP1,sizeof(Vender_Order),Vender_Order);
	UWrite_Byte(INDEX, 1);
	UWrite_Byte(EINCSRL, rbInINPRDY);
}
void SCSI_Test_Unit_Ready(void)
{
	TransCSW();
}
void SCSI_Medium_Removal(void)
{
	TransCSW();
}
void SCSI_Verify(void)
{
	TransCSW();
}
void SCSI_Reserved(void)
{
}
void TransCSW()
{
	Fifo_Write(FIFO_EP1, 13, Bulk_CSW);
	UWrite_Byte(INDEX, 1);
	UWrite_Byte(EINCSRL, rbInINPRDY);   
	Bulk_Status=BULK_IDLE;                                 
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void SCSI_Read10()
{
	unsigned int i=0;
	LED=~LED;
	for(i=0;i<4;i++)						// 計算LBA,CBWCB的第2、3、4和5位代表LBA
	{
		LBA=(LBA<<8)+Bulk_CBW.CBWCB[2+i];
	}
	Transfer_Length = Bulk_CBW.CBWCB[7]*256 + Bulk_CBW.CBWCB[8];	//傳輸的長度,CBWCB的第6和7位代表傳輸長度
	nCurrentBlock = LBA / 32;		//計算FLASH的物理地址	
	nCurrentPage  = LBA % 32;

	Flash_Read_Page(nCurrentBlock,nCurrentPage,Bulk_PACKET,512);	//向頁緩沖區讀1頁

	Transfer_Length--;		//待傳輸的扇區數減1
	nCurrentPage++;			//當前頁序號加1

	Bulk_Status = BULK_DATA_TRANS;		//Bulk在傳輸狀態
	pCurrentBuf = Bulk_PACKET;			//指針指向頁緩沖區
	nBufCount=0;	

	Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);		//在雙緩沖方式,一次可以向FIFO寫兩個數據包
	UWrite_Byte(INDEX, 1);
	UWrite_Byte(EINCSRL, rbInINPRDY);
	nBufCount+=EP1_PACKET_SIZE;
	Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
	UWrite_Byte(INDEX, 1);
	UWrite_Byte(EINCSRL, rbInINPRDY);		
}
void TransDataGoOn()
{
	unsigned int i=0;

	if(nBufCount<384)
	{
		nBufCount+=EP1_PACKET_SIZE;		
		Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);	//在雙緩沖方式,一次可以向FIFO寫兩個數據包
		UWrite_Byte(INDEX, 1);
		UWrite_Byte(EINCSRL, rbInINPRDY);
		nBufCount+=EP1_PACKET_SIZE;
		Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
		UWrite_Byte(INDEX, 1);
		UWrite_Byte(EINCSRL, rbInINPRDY);			
	}
	else if(Transfer_Length>0)
	{
		if(nCurrentPage==32)
		{
			nCurrentBlock++;
			nCurrentPage=0;
		}
		else
		{}
		Flash_Read_Page(nCurrentBlock,nCurrentPage,Bulk_PACKET,512);
		nCurrentPage++;
		Transfer_Length--;
		nBufCount=0;
		pCurrentBuf=Bulk_PACKET;
		Bulk_Status=BULK_DATA_TRANS;
		Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);//在雙緩沖方式,一次可以向FIFO寫兩個數據包
		UWrite_Byte(INDEX, 1);
		UWrite_Byte(EINCSRL, rbInINPRDY);	
		nBufCount+=EP1_PACKET_SIZE;
		Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
		UWrite_Byte(INDEX, 1);
		UWrite_Byte(EINCSRL, rbInINPRDY);	
	}
	else
	{
		Bulk_Status=BULK_DATA_END;
		nBufCount=0;
		TransCSW();
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void SCSI_Write10(void)
{
	unsigned int i=0;
	LED=~LED;
	for(i=0;i<4;i++)
	{
		LBA=(LBA<<8)+Bulk_CBW.CBWCB[2+i];
	}
	Transfer_Length = Bulk_CBW.CBWCB[7]*256 + Bulk_CBW.CBWCB[8];
	nCurrentBlock=LBA/32;	
	nCurrentPage =LBA%32;
	nBegainPage = nCurrentPage;

	Bulk_Status = BULK_DATA_RECIEVE;
	pCurrentBuf = Bulk_PACKET;
	nBufCount   = 0;

	Flash_Erase_Block(Bufer_Block);			//擦除緩沖區BLOCK

}

void Bulk_Receive_Data()
{
	unsigned int i=0;
	Copy(pCurrentBuf+nBufCount,Bulk_Buffer,EP2_PACKET_SIZE);
	nBufCount+=EP2_PACKET_SIZE;
	if(nBufCount==512)							//如果一扇區內容接收完畢
	{
		Flash_Write_Page(Bufer_Block,nCurrentPage,Bulk_PACKET,512);	//將數據暫時寫到緩沖區BLOCK	
		nCurrentPage++;							//頁指針加1
		Transfer_Length--;						//待傳輸數據長度減1
		nBufCount=0;
	}

	if((Transfer_Length>0)&&(nCurrentPage == 32))		//如果一個BLOCK寫完畢
	{
		for(i=0;i<nBegainPage;i++)
		{
			Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
			Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
		}
		Flash_Erase_Block(nCurrentBlock);
		for(i=0;i<32;i++)
		{
			Flash_Read_Page(Bufer_Block,i,Bulk_PACKET,512);
			Flash_Write_Page(nCurrentBlock,i,Bulk_PACKET,512);
		}
		nCurrentBlock++;
		nCurrentPage=0;
		nBufCount=0;
		nBegainPage=0;
		Flash_Erase_Block(Bufer_Block);
	}

	if(Transfer_Length==0)
	{
		for(i=0;i<nBegainPage;i++)
		{
			Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
			Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
		}
		for(i=nCurrentPage;i<32;i++)
		{
			Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
			Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
		}
		Flash_Erase_Block(nCurrentBlock);
		for(i=0;i<32;i++)
		{
			Flash_Read_Page(Bufer_Block,i,Bulk_PACKET,512);
			Flash_Write_Page(nCurrentBlock,i,Bulk_PACKET,512);
		}
		TransCSW();	                                  
	}
}
void Copy(unsigned char *PEnd,unsigned char *PSource,unsigned int num)
{
	unsigned int i=0;
	for(i=0;i<num;i++)
	{
		*(PEnd+i)=*(PSource+i);
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人在线观看视频| 亚洲视频狠狠干| 在线播放视频一区| 色妞www精品视频| 成人丝袜18视频在线观看| 国产成人亚洲综合a∨猫咪| 国模少妇一区二区三区| 国产一区 二区 三区一级| 久久99热狠狠色一区二区| 激情综合一区二区三区| 国产在线精品一区二区夜色| 韩国欧美国产1区| 国产精品羞羞答答xxdd| 不卡的av网站| 色综合天天综合网国产成人综合天| caoporn国产精品| www.日韩精品| 欧美伊人久久大香线蕉综合69| 欧美日韩日日摸| 欧美sm极限捆绑bd| 国产欧美日韩麻豆91| 亚洲视频综合在线| 一区二区三区日本| 极品美女销魂一区二区三区免费| 国产精品一区二区久激情瑜伽| 国产91精品露脸国语对白| 91网站最新网址| 91麻豆精品91久久久久久清纯 | 欧美日韩中文另类| 欧美一区在线视频| 国产日韩欧美精品综合| 亚洲精品乱码久久久久| 日韩av在线发布| 九九**精品视频免费播放| 国产酒店精品激情| 在线一区二区视频| 26uuu国产在线精品一区二区| 欧美国产一区二区在线观看 | 欧美精品第1页| 久久久久国色av免费看影院| 亚洲婷婷综合色高清在线| 日本中文字幕一区二区视频| 国产乱人伦偷精品视频免下载| 99久久er热在这里只有精品15| 欧美一区二区大片| 亚洲激情自拍偷拍| 国产成人亚洲综合a∨婷婷| 欧美日韩精品欧美日韩精品一| 精品福利一区二区三区免费视频| ...中文天堂在线一区| 日本欧美韩国一区三区| 99久久99久久综合| 精品欧美一区二区久久| 一区二区三区欧美视频| 不卡的av中国片| 日韩欧美中文字幕一区| 亚洲网友自拍偷拍| 9i看片成人免费高清| 亚洲精品在线电影| 免费高清成人在线| 欧美日韩一区 二区 三区 久久精品| 国产亚洲综合性久久久影院| 日本亚洲三级在线| 欧美日韩一区二区三区四区| 亚洲少妇屁股交4| 国产91在线观看丝袜| www成人在线观看| 日韩国产欧美三级| 欧美精品一二三| 亚洲一区二区av在线| 日本韩国欧美一区二区三区| 国产精品美女视频| 国产精品18久久久久久vr| 欧美一区二区三区色| 五月天久久比比资源色| 欧美午夜精品一区| 亚洲福利视频三区| 欧美日韩精品二区第二页| 亚洲国产cao| 欧美日韩视频专区在线播放| 亚洲一区成人在线| 欧美美女黄视频| 丝袜国产日韩另类美女| 7777女厕盗摄久久久| 日韩综合小视频| 777欧美精品| 久久99国产精品免费| 亚洲精品一区二区三区在线观看 | 精品久久久久久久久久久久久久久久久 | 欧美激情中文字幕| 国产suv精品一区二区6| 国产精品妹子av| 色偷偷成人一区二区三区91 | 欧美日韩午夜影院| 日韩一区精品视频| 欧美电影免费观看高清完整版在线观看 | 成人免费黄色在线| 中文字幕一区在线观看| 色综合天天做天天爱| 亚洲成av人影院| 欧美xxxxxxxxx| 成人av资源站| 亚洲国产日韩综合久久精品| 91精品国产综合久久香蕉麻豆| 经典三级在线一区| 亚洲欧洲精品成人久久奇米网| 欧美综合久久久| 久久99国产精品久久| 国产精品久久夜| 欧美色综合网站| 国产精品影视天天线| 亚洲自拍另类综合| 久久久国际精品| 在线免费亚洲电影| 国产一区二区三区在线观看精品| 最新日韩av在线| 欧美一级片在线观看| jlzzjlzz亚洲日本少妇| 人人精品人人爱| 中文字幕一区三区| 精品国产一区二区亚洲人成毛片 | 亚洲乱码日产精品bd| 日韩欧美视频一区| 91福利在线观看| 国产成人精品aa毛片| 天堂午夜影视日韩欧美一区二区| 国产日韩欧美在线一区| 欧美一个色资源| 在线观看亚洲一区| 成人av网址在线| 国产在线乱码一区二区三区| 亚洲mv在线观看| 中文字幕制服丝袜一区二区三区| 亚洲精品一区二区三区四区高清 | 国产真实乱子伦精品视频| 亚洲精品v日韩精品| 日本一区二区三区dvd视频在线| 欧美精品高清视频| 欧美吞精做爰啪啪高潮| 色综合久久久网| 成人午夜看片网址| 国产剧情一区二区三区| 久久国产视频网| 日韩**一区毛片| 日韩 欧美一区二区三区| 午夜电影网一区| 亚洲影院理伦片| 亚洲精品欧美激情| 中文字幕亚洲成人| **性色生活片久久毛片| 亚洲欧美影音先锋| 国产欧美日本一区二区三区| 久久日一线二线三线suv| 日韩精品一区二区三区视频在线观看| 91精品欧美久久久久久动漫| 欧美三级日韩在线| 欧美日本一区二区| 91精品国产丝袜白色高跟鞋| 91麻豆精品久久久久蜜臀| 欧美一区二区在线不卡| 91精品国产欧美日韩| 日韩欧美一区在线观看| 91精品国产一区二区三区| 欧美一区二区三区免费| 欧美成人一级视频| 久久久久久99精品| 中文字幕二三区不卡| 中文字幕一区二区三区乱码在线| 中文字幕一区二区在线播放| 一二三区精品视频| 日韩制服丝袜av| 国产乱色国产精品免费视频| 成人av第一页| 在线视频观看一区| 日韩欧美电影一区| 国产精品免费网站在线观看| 亚洲女同ⅹxx女同tv| 日韩综合一区二区| 国产成人在线视频网址| 色婷婷av一区二区| 精品久久久久久久人人人人传媒 | 欧美人妇做爰xxxⅹ性高电影| 日韩亚洲国产中文字幕欧美| 国产色综合一区| 一区二区三区在线播放| 日韩制服丝袜av| 成人黄色在线视频| 欧美日韩第一区日日骚| 久久久www成人免费无遮挡大片| 亚洲欧美国产三级| 麻豆精品视频在线观看免费| 成人黄色网址在线观看| 在线观看国产一区二区| 精品国产凹凸成av人网站| 亚洲男人电影天堂| 国产综合久久久久久鬼色| 在线精品亚洲一区二区不卡| 久久综合色播五月| 亚洲一区二区三区小说| 丁香激情综合国产|