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

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

?? bulk_only.c

?? 源碼 : KIEL C 單片機 : C8051F320 功能 : U盤 (64M) 關鍵字 : C8051F320,U盤,NANDFLASH,FAT,SCH 描述 : 源碼完全可運行
?? C
字號:
#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的第7和8位代表傳輸長度
	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一区二区三区免费野_久草精品视频
国产精品麻豆网站| 久久久另类综合| 在线视频综合导航| 97久久超碰国产精品| 国产成人精品亚洲日本在线桃色| 激情小说欧美图片| 久久国产精品72免费观看| 日本最新不卡在线| 久久av资源网| 国产不卡高清在线观看视频| 不卡视频一二三四| 91麻豆swag| 欧美日韩亚洲高清一区二区| 欧美一二三区在线| 26uuu亚洲| 国产精品久久网站| 亚洲色图色小说| 午夜久久久久久| 久久国产精品99久久久久久老狼 | 性久久久久久久久久久久| 一区二区中文视频| 亚洲国产美国国产综合一区二区| 日韩中文字幕av电影| 国产在线不卡一区| 91蜜桃网址入口| 欧美精三区欧美精三区| 欧美电影免费观看高清完整版在线观看| 精品国产第一区二区三区观看体验| 国产午夜精品在线观看| 一区二区三区四区视频精品免费| 日本va欧美va欧美va精品| 国产精品影视网| 欧美无人高清视频在线观看| 精品国产乱码久久久久久图片 | 亚洲午夜一区二区三区| 蜜臀久久99精品久久久久久9| 国产经典欧美精品| 欧美主播一区二区三区| 久久色.com| 亚洲午夜电影在线| 国产精品 欧美精品| 欧美日本精品一区二区三区| 国产欧美日韩中文久久| 亚洲午夜久久久久| 春色校园综合激情亚洲| 欧美一区国产二区| 亚洲男同性视频| 国产精品一线二线三线精华| 欧美日韩国产123区| 日本一区二区三区dvd视频在线| 亚洲国产wwwccc36天堂| 粉嫩aⅴ一区二区三区四区五区| 5858s免费视频成人| 最近中文字幕一区二区三区| 国产一区二区三区久久久| 欧美精品99久久久**| 亚洲欧洲日韩综合一区二区| 久久精品av麻豆的观看方式| 欧美欧美欧美欧美首页| 一区二区三区资源| 成人高清免费观看| 欧美极品xxx| 日本高清不卡视频| 亚洲国产精品ⅴa在线观看| 久久国内精品自在自线400部| 欧美久久久久免费| 亚洲国产一区在线观看| 色婷婷综合久色| 亚洲日本丝袜连裤袜办公室| jlzzjlzz亚洲日本少妇| 国产欧美一区二区三区沐欲| 国产精品一卡二卡| 久久久久久久久久美女| 国产高清久久久| 国产婷婷色一区二区三区| 国产一区二区影院| 国产欧美日本一区视频| 国产白丝精品91爽爽久久 | 99视频在线精品| 国产精品久久久99| 91毛片在线观看| 一区二区在线观看免费| 色拍拍在线精品视频8848| 一区二区三区精品在线观看| 欧美影院午夜播放| 日本女优在线视频一区二区| 日韩美女视频在线| 国产成都精品91一区二区三| 中文字幕一区不卡| 欧美三电影在线| 精品在线播放免费| 国产日产精品1区| 91丨porny丨国产| 亚洲电影欧美电影有声小说| 欧美日本国产视频| 国产一区亚洲一区| 最好看的中文字幕久久| 欧美日韩国产在线观看| 精品系列免费在线观看| 中文字幕在线不卡一区| 欧美另类z0zxhd电影| 九九国产精品视频| 自拍偷拍欧美精品| 欧美精品aⅴ在线视频| 国产精品综合二区| 亚洲免费av高清| 69堂国产成人免费视频| 懂色av中文一区二区三区| 亚洲一区二区三区美女| 精品国产乱码久久久久久蜜臀| 成人一区二区三区中文字幕| 亚洲福利电影网| 中文字幕欧美国产| 欧美日韩国产天堂| 成人激情视频网站| 免费av成人在线| 亚洲免费在线视频| 久久久三级国产网站| 欧美日韩一卡二卡三卡 | 亚洲超碰精品一区二区| 国产丝袜美腿一区二区三区| 欧美日韩午夜在线视频| 国产91丝袜在线观看| 日本色综合中文字幕| 亚洲主播在线观看| 国产精品久久久久久久久免费丝袜| 日韩一区二区三区观看| 一本一本大道香蕉久在线精品| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲国产精品一区二区久久恐怖片| 久久亚洲精品小早川怜子| 欧美日韩久久久| 色伊人久久综合中文字幕| 成人深夜在线观看| 91在线精品一区二区| 精品亚洲成a人| 老司机精品视频一区二区三区| 亚洲综合激情另类小说区| 国产精品色在线观看| 久久品道一品道久久精品| 这里只有精品99re| 欧美三级日韩三级| 欧美主播一区二区三区| 色系网站成人免费| 91免费看`日韩一区二区| 成人av资源站| 成人免费高清在线| 高清日韩电视剧大全免费| 国产高清精品网站| 国产精品一级片| 丁香五精品蜜臀久久久久99网站| 激情六月婷婷综合| 国产在线精品一区二区夜色| 麻豆91免费观看| 激情五月婷婷综合网| 国产麻豆视频精品| 国产电影一区二区三区| 成人晚上爱看视频| 色综合天天综合狠狠| 色综合婷婷久久| 欧美色大人视频| 欧美一级在线观看| 久久久久亚洲蜜桃| 欧美国产乱子伦| 亚洲啪啪综合av一区二区三区| 亚洲免费av网站| 日日夜夜一区二区| 九色综合狠狠综合久久| 国产伦精品一区二区三区在线观看| 国产精品小仙女| 91网上在线视频| 欧美美女一区二区三区| 欧美成人精品1314www| 久久综合色婷婷| ㊣最新国产の精品bt伙计久久| 一区二区三区在线视频免费观看 | 欧美色倩网站大全免费| 91精品国产欧美一区二区成人| 日韩一区二区三区av| 久久综合色婷婷| 亚洲女人的天堂| 美女在线一区二区| 国产精品1024| 欧美日韩中文字幕一区| 欧美一三区三区四区免费在线看| 久久亚洲精品小早川怜子| 亚洲精品欧美激情| 麻豆91在线播放| 一本到不卡精品视频在线观看| 91精品国产入口| 亚洲同性gay激情无套| 免费一级片91| av成人动漫在线观看| 欧美一区二区福利在线| 亚洲日本免费电影| 狠狠色丁香久久婷婷综合_中| 欧美在线视频日韩| 国产拍揄自揄精品视频麻豆| 午夜欧美一区二区三区在线播放| 国产九色sp调教91|