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

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

?? usb_setup.c

?? 源碼 : KIEL C 單片機(jī) : C8051F320 功能 : U盤 (64M) 關(guān)鍵字 : C8051F320,U盤,NANDFLASH,FAT,SCH 描述 : 源碼完全可運(yùn)行
?? C
字號:
#include "c8051F320.h"
#include "stdio.h"
#include "intrins.h"
/////////////////////////////
#include "Usb_Descreptor.h"
#include "Usb_FunDec.h"
#include "Usb_Parameter.h"
#include "Usb_Register.h"
#include "Usb_Request.h"

//全局變量
static unsigned int   DataSize;                  		// 需要端點(diǎn)0發(fā)送的數(shù)據(jù)大小
static unsigned int   DataSent;                  		// 端點(diǎn)0已經(jīng)發(fā)送的數(shù)據(jù)大小
static unsigned char  *DataPtr;                  		// 端點(diǎn)0發(fā)送數(shù)據(jù)的指針
static unsigned char  ONES_PACKET[2] = {0x01, 0x00};    // 在Get_Status等命令中應(yīng)用的數(shù)組
static unsigned char  ZERO_PACKET[2] = {0x00, 0x00};    // 在Get_Status等命令中應(yīng)用的數(shù)組

unsigned char  Ep_Status[3]	={EP_IDLE,EP_STALL,EP_STALL};   // 定義端點(diǎn)的狀態(tài)
unsigned char  USB_State	=DEV_ATTACHED;	                // 定義設(shè)備的狀態(tài)
struct Usb_Setup						// Setup階段收到的8字節(jié)的命令,此處定義為結(jié)構(gòu)
{
	unsigned char bmRequestType;
	unsigned char bRequest;
	unsigned char wValue[2];
	unsigned char wIndex[2];
	unsigned char wLength[2];
}Setup;

///////////////////////////////////////////////////////////////////////////////////////////////
void Handle_Setup()						//端點(diǎn)0中斷處理函數(shù)
{
    unsigned char ControlReg=0;         // 存放端點(diǎn)0控制/狀態(tài)寄存器值的變量
    UWrite_Byte(INDEX, 0);           	// 指向端點(diǎn)0
    URead_Byte(E0CSR, ControlReg);  	// 讀端點(diǎn)0控制寄存器
    if (ControlReg & rbSUEND)           // 如果上次數(shù)據(jù)階段提前結(jié)束
    {  
		UWrite_Byte(E0CSR, rbDATAEND);  // 當(dāng)前數(shù)據(jù)傳完                                
        UWrite_Byte(E0CSR, rbSSUEND);   // 清除SUEND標(biāo)志
        Ep_Status[0] = EP_IDLE;         // 端點(diǎn)返回到空閑狀態(tài)
    }
    if (ControlReg & rbSTSTL)           // 如果上次傳輸因錯誤而發(fā)送了STALL使傳輸提前結(jié)束
    {                                  
        UWrite_Byte(E0CSR, 0);          // 清除STALL
        Ep_Status[0] = EP_IDLE;			// 端點(diǎn)0返回到空閑狀態(tài)
    }

	if (ControlReg & rbOPRDY)           // 如果接收到輸出數(shù)據(jù)包
	{
	    if (Ep_Status[0] == EP_IDLE)    // 如果端點(diǎn)0空閑
		{
			Fifo_Read(FIFO_EP0,8,(unsigned char *)&Setup);		// 讀取設(shè)置數(shù)據(jù)包,8個(gè)字節(jié)
			switch(Setup.bRequest)  				    // 判斷請求類型   
			{                              
				case GET_STATUS:		Get_Status();		break;				     	
				case CLEAR_FEATURE:		Clear_Feature();	break;
				case SET_FEATURE:    	Set_Feature(); 		break;   
				case SET_ADDRESS:		Set_Address();	 	break;	
				case GET_DESCRIPTOR:	Get_Descriptor();	break;	
				case GET_CONFIGURATION:	Get_Configuration();break;
				case SET_CONFIGURATION:	Set_Configuration();break;
				case GET_INTERFACE:		Get_Interface();	break;
				case SET_INTERFACE:		Set_Interface();	break;		
				case GET_MAXLUN:		Get_Maxlun();		break;
				default:				Force_Stall();		break;			
	     	}	
			                 
		/////////////////////////////////////////////////////////////////////////////////////////////
		}
		else if(Ep_Status[0]==EP_RX)	// 如果在OUT狀態(tài),此程序中不會從端點(diǎn)0接收其它信息,所以沒相關(guān)的操作
		{}
	}
	if (Ep_Status[0] == EP_TX)			// 如果在IN狀態(tài)
	{
		    unsigned char ControlReg=0,TempReg=0;	// 存放寄存器值的變量                                      
			URead_Byte(E0CSR, ControlReg);			// 讀端點(diǎn)0控制寄存器                              
			TempReg = rbINPRDY;                     // 輸出數(shù)據(jù)準(zhǔn)備好           
			if (DataSize >= EP0_PACKET_SIZE)		// 如果待發(fā)送數(shù)據(jù)的長度大于端點(diǎn)0長度
			{
				Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE,DataPtr);	// 發(fā)送數(shù)據(jù)包
		        DataPtr  += EP0_PACKET_SIZE;                    // 更新數(shù)據(jù)指針
		        DataSize -= EP0_PACKET_SIZE;                    // 更新待發(fā)送的數(shù)據(jù)量
		        DataSent += EP0_PACKET_SIZE;                    // 更新已發(fā)送的數(shù)據(jù)量
		    }
			else                        			// 如果待發(fā)送數(shù)據(jù)的長度小于端點(diǎn)0長度
			{
				Fifo_Write(FIFO_EP0, DataSize,DataPtr);	// 發(fā)送剩余的數(shù)據(jù)       
		        TempReg |= rbDATAEND;                  	// 指示數(shù)據(jù)發(fā)送完備,進(jìn)入狀態(tài)階段		               
		        Ep_Status[0] = EP_IDLE;                 // 端點(diǎn)返回到空閑狀態(tài)               
			}
			if (DataSent == (Setup.wLength[0]+256*Setup.wLength[1]))	//如果發(fā)送的數(shù)據(jù)量正好是端點(diǎn)0的整數(shù)倍
			                            
		    {
		        TempReg |= rbDATAEND;    // 指示數(shù)據(jù)發(fā)送完備,進(jìn)入狀態(tài)階段
		        Ep_Status[0] = EP_IDLE;  // 端點(diǎn)返回到空閑狀態(tài)
		    }
		        UWrite_Byte(E0CSR, TempReg);  // 寫端點(diǎn)0控制寄存器
    }
}

void Force_Stall()
{
	UWrite_Byte(INDEX, 0);
    UWrite_Byte(E0CSR, rbSDSTL);       // 發(fā)送STALL
    Ep_Status[0] = EP_STALL;           // 端點(diǎn)0到STALL狀態(tài),直到下次復(fù)位
}

//處理標(biāo)準(zhǔn)請求的函數(shù)
void Get_Status()
{	
   	switch(Setup.bmRequestType)                  
   	{
      	case IN_DEVICE:                          	// 如果是設(shè)備的狀態(tài)
           	DataPtr = ZERO_PACKET;               	// 發(fā)送 0x00, 總線供電,不支持遠(yuǎn)程喚醒
           	DataSize = 2;                        	
           	break;      
      	case IN_INTERFACE:                       	// 接口狀態(tài)
           	DataPtr = ZERO_PACKET;               	// 接口狀態(tài)永遠(yuǎn)返回0
           	DataSize = 2;         
           	break;  
      	case IN_ENDPOINT:                        	// 端點(diǎn)狀態(tài)
           	if (Setup.wIndex[0] == IN_EP1)          // 如果是端點(diǎn)1
			{
				if (Ep_Status[1] == EP_HALT)
				{                               // 如果端點(diǎn)1在EN_HALT狀態(tài)
					DataPtr = ONES_PACKET;		// 發(fā)送ONES_PACKET,指示端點(diǎn)1在HALT狀態(tài)
	                DataSize = 2;
	            }
	            else
	            {
	                DataPtr = ZERO_PACKET;		// 否則發(fā)送ZERO_PACKET,指示端點(diǎn)1在空閑狀態(tài)
	                DataSize = 2;
	            }
			}
	        if (Setup.wIndex[0] == OUT_EP2)
	        {                                 
				if (Ep_Status[2] == EP_HALT) 
				{
					DataPtr = ONES_PACKET;
	                DataSize = 2;
				}
	            else
				{
					DataPtr = ZERO_PACKET;
					DataSize = 2;
				}
			}
            break;
      default:	Force_Stall();	break;           
	}
   if (Ep_Status[0] != EP_STALL)
   {
   		UWrite_Byte(E0CSR, rbSOPRDY);                       
      	Ep_Status[0] = EP_TX;                     // 端點(diǎn)0在EP_TX狀態(tài)
      	DataSent = 0;								// 已發(fā)送數(shù)據(jù)量清零
   }
}

void Clear_Feature()
{
	if ((Setup.bmRequestType & 0x02)&&			// 如果是端點(diǎn)
        (Setup.wValue[0] == ENDPOINT_HALT)  && 	// 并且這些端點(diǎn)的狀態(tài)是EP_HALT
       ((Setup.wIndex[0] == IN_EP1) ||         	// 并且選擇的是端點(diǎn)1 IN
        (Setup.wIndex[0] == OUT_EP2)))         	// 或端點(diǎn)2 OUT 
	{
         if (Setup.wIndex[0] == IN_EP1) 
         {
            UWrite_Byte (INDEX, 1);             // 使toggle復(fù)位為零
            UWrite_Byte (EINCSRL, rbInCLRDT);       
            Ep_Status[1] = EP_IDLE;             // 端點(diǎn)1到空閑狀態(tài)                    
         }
         else
         {
            UWrite_Byte (INDEX, 2);         
            UWrite_Byte (EOUTCSRL, rbOutCLRDT);         
            Ep_Status[2] = EP_IDLE;             
         }
	}
	else
    { 
         Force_Stall();                         
    }
   if (Ep_Status[0] != EP_STALL)
   {
   		UWrite_Byte(E0CSR, rbSOPRDY);
		UWrite_Byte(E0CSR, rbDATAEND);                       
   }
}
void Set_Feature()
{
	if ((Setup.bmRequestType  & 0x02) && 		// 意義同上
        (Setup.wValue[0] == ENDPOINT_HALT) &&  
       ((Setup.wIndex[0] == IN_EP1)      || 
        (Setup.wIndex[0] == OUT_EP2)))
	{
         if (Setup.wIndex[0] == IN_EP1) 
         {
            UWrite_Byte (INDEX, 1);         	  
            UWrite_Byte (EINCSRL, rbInSDSTL);   // rbInSDSTL=1,發(fā)送STALL作為對IN令牌的響應(yīng),
												// 在端點(diǎn)1中斷處理函數(shù)中將rbInSDSTl和rbInSTSTL清零    
            Ep_Status[1] = EP_HALT;             // 端點(diǎn)1到HALT狀態(tài)                     
         }
         else
         {
            UWrite_Byte(INDEX, 2);         		
            UWrite_Byte (EOUTCSRL, rbOutSDSTL); // 同上       
            Ep_Status[2] = EP_HALT;  		    
         }
	}
	else
    { 
		Force_Stall();                         	
    }  
   if (Ep_Status[0] != EP_STALL)
   {
   		UWrite_Byte(E0CSR, rbSOPRDY);
		UWrite_Byte(E0CSR, rbDATAEND);                       
   }
}
void Set_Address()
{
   	if (Setup.wValue[0] != 0) 
   	{
      	USB_State = DEV_ADDRESS;            // 收到不為0的地址,設(shè)備處于地址狀態(tài),此次傳輸?shù)?      	UWrite_Byte(FADDR, Setup.wValue[0]);// 狀態(tài)階段結(jié)束后新地址將起作用
      	Ep_Status[0] = EP_IDLE;

   	}
   	else 
   	{
     	USB_State = DEV_DEFAULT;            // 收到的地址為0,設(shè)備仍舊處于默認(rèn)狀態(tài)
   	}
   	UWrite_Byte(E0CSR, rbSOPRDY);
	UWrite_Byte(E0CSR, rbDATAEND);                       
                                              
}
void Get_Descriptor()
{
	unsigned int In_DataSize=0;			// 要發(fā)送的數(shù)據(jù)總量
	In_DataSize=Setup.wLength[0]+Setup.wLength[1]*256;
	switch(Setup.wValue[1])             // 判斷描述符的類型
    {                                            
		case DSC_DEVICE:         		// 設(shè)備描述符  
	       	DataPtr  = DeviceDesc;
			if(In_DataSize>18)
			{DataSize = 18;	}       
			else
			{DataSize = In_DataSize;}
        break;      
		case DSC_CONFIG:				// 配置描述符
        	DataPtr  = ConfigDesc;
			if(In_DataSize==0x09)
			{
			 	DataSize=0x09;
			}
			else if(In_DataSize==0x20)
			{
			 	DataSize=0x20;
			}
			else if(In_DataSize==0xff)
			{
			 	DataSize=0x20;
			}
        break;
		case DSC_STRING:				// 字符串描述符
			 DataPtr=&StringDes[Setup.wValue[0]];
			 DataSize=In_DataSize;
			 break;
		default:	         break;
   	}
	UWrite_Byte(E0CSR, rbSOPRDY);
    Ep_Status[0] = EP_TX;                      // 端點(diǎn)0在發(fā)送狀態(tài)
    DataSent = 0;                              
}
void Get_Configuration()
{
   if (USB_State == DEV_CONFIGURED)   // If the device is configured, then return value 0x01
   {                                  // since this software only supports one configuration
         DataPtr  = ONES_PACKET;
         DataSize = 1;
   }
   if (USB_State == DEV_ADDRESS)      // If the device is in address state, it is not
   {                                  // configured, so return 0x00
         DataPtr  = ZERO_PACKET;
         DataSize = 1;
   }
   if (Ep_Status[0] != EP_STALL)
   {
   		UWrite_Byte(E0CSR, rbSOPRDY);
        Ep_Status[0] = EP_TX;                 
        DataSent = 0;                         
   }
}
void Set_Configuration()
{
   if (Setup.wValue[0] > 0)                  // Any positive configuration request
   {                                         // results in configuration being set to 1
         USB_State = DEV_CONFIGURED;
		 ///////////////////////////////////////////////////////////////////////////////////
         UWrite_Byte(INDEX, 1);     
         UWrite_Byte(EINCSRH,0xa0); // 雙緩沖、ISO、FIFO分割和強(qiáng)制數(shù)據(jù)Toggle禁止,IN端點(diǎn)
		 Ep_Status[1]=EP_IDLE;
		  
         UWrite_Byte(INDEX, 2);            
         UWrite_Byte(EOUTCSRH, 0x80);      // 雙緩沖和ISO禁止,OUT端點(diǎn)
		 Ep_Status[2]=EP_IDLE; 
		 ///////////////////////////////////////////////////////////////////////////////////
         UWrite_Byte(INDEX, 0);           
   }
   else
   {
         USB_State = DEV_ADDRESS;         // 設(shè)備仍舊在地址狀態(tài)
		 Ep_Status[1]=EP_STALL;
		 Ep_Status[2]=EP_STALL;
   }
   if (Ep_Status[0] != EP_STALL)
   {
   		UWrite_Byte(E0CSR, rbSOPRDY);
		UWrite_Byte(E0CSR, rbDATAEND);                
   }
}
void Get_Interface()
{
	DataPtr = ZERO_PACKET;            
	DataSize = 1;
    if (Ep_Status[0] != EP_STALL)
    { 
   		UWrite_Byte(E0CSR, rbSOPRDY);                  
        Ep_Status[0] = EP_TX;          
        DataSent = 0;
    }
}
void Set_Interface()
{
   	UWrite_Byte(E0CSR, rbSOPRDY);
	UWrite_Byte(E0CSR, rbDATAEND);             
}

void Get_Maxlun()			// U盤支持一個(gè)邏輯單元,返回1即可
{
	DataPtr = ZERO_PACKET;            
	DataSize = 1;
    if (Ep_Status[0] != EP_STALL)
    {                       
        Ep_Status[0] = EP_TX;           
        DataSent = 0;
    }
   	UWrite_Byte(E0CSR, rbSOPRDY);
}////////////////////////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性感美女极品91精品| 亚洲国产精品成人综合| 亚洲午夜免费福利视频| 91麻豆免费看片| 亚洲国产一区在线观看| 欧美丰满嫩嫩电影| 日韩av午夜在线观看| 欧美电影免费观看高清完整版| 国产一区二区三区在线观看精品| 国产亚洲一二三区| 99久久精品99国产精品| 亚洲一区二区欧美激情| 91麻豆精品国产综合久久久久久| 精品一区二区三区免费| 中文字幕乱码一区二区免费| 99re热这里只有精品免费视频| 一区二区三区**美女毛片| 337p亚洲精品色噜噜噜| 国精产品一区一区三区mba视频 | 久久精工是国产品牌吗| 久久影院电视剧免费观看| 99久久精品情趣| 亚洲国产精品麻豆| 精品国产乱码久久久久久久久 | 石原莉奈一区二区三区在线观看| 欧美一区2区视频在线观看| 国产精品99久久久久久有的能看| 一个色综合av| xfplay精品久久| 在线视频亚洲一区| 国产一区美女在线| 亚洲香肠在线观看| 国产视频一区二区在线观看| 欧美亚洲一区二区在线观看| 精品亚洲成a人| 亚洲女女做受ⅹxx高潮| 日韩欧美高清在线| 972aa.com艺术欧美| 另类小说综合欧美亚洲| 亚洲日本一区二区三区| 日韩欧美中文一区二区| 色国产精品一区在线观看| 国内精品国产成人国产三级粉色| 亚洲人成网站在线| 久久久国产一区二区三区四区小说 | 欧美大肚乱孕交hd孕妇| 一本一道久久a久久精品综合蜜臀| 另类小说图片综合网| 亚洲欧美日本在线| 国产亚洲一区二区三区| 欧美一区二区三区播放老司机| 99视频一区二区三区| 国内精品嫩模私拍在线| 三级亚洲高清视频| 一区二区在线观看视频| 国产亚洲一区二区三区在线观看| 欧美一区二视频| 欧美色涩在线第一页| 波多野结衣在线一区| 国产一区二区免费看| 日韩精品成人一区二区在线| 亚洲毛片av在线| 国产精品动漫网站| 久久综合色8888| 欧美不卡在线视频| 日韩欧美高清dvd碟片| 这里是久久伊人| 欧美日韩国产另类一区| 91国偷自产一区二区三区观看| 99精品久久99久久久久| 大美女一区二区三区| 国产91露脸合集magnet| 丁香婷婷综合五月| 成人午夜电影网站| 成人教育av在线| 白白色亚洲国产精品| av中文字幕在线不卡| 成人av免费网站| 成人午夜av影视| 成a人片国产精品| 97久久超碰国产精品| 一本大道综合伊人精品热热| 色菇凉天天综合网| 欧美视频在线一区| 8v天堂国产在线一区二区| 欧美一二三区在线观看| 日韩欧美高清一区| 久久久噜噜噜久噜久久综合| 国产喷白浆一区二区三区| 国产午夜亚洲精品理论片色戒 | 日韩高清在线不卡| 奇米影视一区二区三区| 日本在线不卡一区| 韩国v欧美v亚洲v日本v| 国产精品一级黄| 91视频免费播放| 色综合久久中文综合久久牛| 欧美亚洲高清一区二区三区不卡| 欧美日韩的一区二区| 欧美刺激午夜性久久久久久久| 精品日韩在线观看| 中文久久乱码一区二区| 一区二区在线观看视频在线观看| 婷婷夜色潮精品综合在线| 麻豆91精品视频| 成人小视频免费观看| 色噜噜狠狠色综合中国| 日韩欧美在线1卡| 久久久久国产精品厨房| 一区二区三区在线视频免费| 日韩精品一二区| 国产不卡视频在线播放| 91久久久免费一区二区| 欧美一区二区三区在线电影| 欧美激情一区二区| 亚洲成人tv网| 国产电影精品久久禁18| 欧美视频三区在线播放| 久久蜜桃av一区二区天堂| 亚洲女同女同女同女同女同69| 蜜臀va亚洲va欧美va天堂| 成人免费看黄yyy456| 欧美丰满少妇xxxbbb| 国产精品久久久久久久久免费相片| 亚洲国产日韩综合久久精品| 国产乱码字幕精品高清av| 91激情五月电影| 国产农村妇女毛片精品久久麻豆| 亚洲精品高清在线| 国产成人精品免费看| 欧美日韩国产电影| √…a在线天堂一区| 九一久久久久久| 欧美系列日韩一区| 国产精品久久午夜夜伦鲁鲁| 日本欧美久久久久免费播放网| 99这里只有久久精品视频| 精品国产露脸精彩对白| 亚洲黄一区二区三区| 国产成人免费在线观看| 91精品婷婷国产综合久久竹菊| 亚洲少妇屁股交4| 国产精品自在欧美一区| 3d成人h动漫网站入口| 艳妇臀荡乳欲伦亚洲一区| 国产二区国产一区在线观看| 日韩欧美成人午夜| 亚洲成人综合在线| 一本久久a久久精品亚洲| 欧美激情综合五月色丁香小说| 日韩经典一区二区| 欧美体内she精视频| 一区二区三区四区视频精品免费 | 成人在线视频一区二区| 久久综合久久久久88| 免费一级欧美片在线观看| 欧美日韩精品免费| 亚洲第一成年网| 欧美日韩亚洲丝袜制服| 一级日本不卡的影视| 91丨九色丨黑人外教| 中文字幕一区二区三区在线不卡| 久久黄色级2电影| 欧美成人a∨高清免费观看| 日本中文一区二区三区| 69成人精品免费视频| 日韩精品亚洲专区| 91精品久久久久久久99蜜桃| 日日摸夜夜添夜夜添国产精品| 欧美色老头old∨ideo| 亚洲成人自拍一区| 8v天堂国产在线一区二区| 日韩高清一区二区| 日韩欧美中文一区| 国模套图日韩精品一区二区| 久久亚洲免费视频| 国产福利一区在线| 国产欧美日本一区视频| 成人午夜视频福利| 亚洲乱码国产乱码精品精小说 | youjizz国产精品| 国产精品美女久久久久久久| av在线播放成人| 亚洲综合色婷婷| 制服丝袜亚洲精品中文字幕| 六月丁香综合在线视频| 久久久www成人免费毛片麻豆| 成人性生交大片免费看视频在线 | 91伊人久久大香线蕉| 亚洲精品久久久蜜桃| 欧美曰成人黄网| 日韩高清在线一区| www精品美女久久久tv| 国产精品系列在线观看| 亚洲品质自拍视频网站| 欧美日韩国产另类不卡| 国产一区二区调教| 亚洲欧美在线aaa| 欧美丰满少妇xxxbbb| 国产一区二区久久|