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

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

?? usb_setup.#3

?? 源碼 : KIEL C 單片機 : C8051F320 功能 : U盤 (64M) 關鍵字 : C8051F320,U盤,NANDFLASH,FAT,SCH 描述 : 源碼完全可運行
?? #3
字號:
#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;                  		// 需要端點0發送的數據大小
static unsigned int   DataSent;                  		// 端點0已經發送的數據大小
static unsigned char  *DataPtr;                  		// 端點0發送數據的指針
static unsigned char  ONES_PACKET[2] = {0x01, 0x00};    // 在Get_Status等命令中應用的數組
static unsigned char  ZERO_PACKET[2] = {0x00, 0x00};    // 在Get_Status等命令中應用的數組

unsigned char  Ep_Status[3]	={EP_IDLE,EP_STALL,EP_STALL};   // 定義端點的狀態
unsigned char  USB_State	=DEV_ATTACHED;	                // 定義設備的狀態
struct Usb_Setup						// Setup階段收到的8字節的命令,此處定義為結構
{
	unsigned char bmRequestType;
	unsigned char bRequest;
	unsigned char wValue[2];
	unsigned char wIndex[2];
	unsigned char wLength[2];
}Setup;

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

	if (ControlReg & rbOPRDY)           // 如果接收到輸出數據包
	{
	    if (Ep_Status[0] == EP_IDLE)    // 如果端點0空閑
		{
			Fifo_Read(FIFO_EP0,8,(unsigned char *)&Setup);		// 讀取設置數據包,8個字節
			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狀態,此程序中不會從端點0接收其它信息,所以沒相關的操作
		{}
	}
	if (Ep_Status[0] == EP_TX)			// 如果在IN狀態
	{
		    unsigned char ControlReg=0,TempReg=0;	// 存放寄存器值的變量                                      
			URead_Byte(E0CSR, ControlReg);			// 讀端點0控制寄存器                              
			TempReg = rbINPRDY;                     // 輸出數據準備好           
			if (DataSize >= EP0_PACKET_SIZE)		// 如果待發送數據的長度大于端點0長度
			{
				Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE,DataPtr);	// 發送數據包
		        DataPtr  += EP0_PACKET_SIZE;                    // 更新數據指針
		        DataSize -= EP0_PACKET_SIZE;                    // 更新待發送的數據量
		        DataSent += EP0_PACKET_SIZE;                    // 更新已發送的數據量
		    }
			else                        			// 如果待發送數據的長度小于端點0長度
			{
				Fifo_Write(FIFO_EP0, DataSize,DataPtr);	// 發送剩余的數據       
		        TempReg |= rbDATAEND;                  	// 指示數據發送完備,進入狀態階段		               
		        Ep_Status[0] = EP_IDLE;                 // 端點返回到空閑狀態               
			}
			if (DataSent == (Setup.wLength[0]+256*Setup.wLength[1]))	//如果發送的數據量正好是端點0的整數倍
			                            
		    {
		        TempReg |= rbDATAEND;    // 指示數據發送完備,進入狀態階段
		        Ep_Status[0] = EP_IDLE;  // 端點返回到空閑狀態
		    }
		        UWrite_Byte(E0CSR, TempReg);  // 寫端點0控制寄存器
    }
}

void Force_Stall()
{
	UWrite_Byte(INDEX, 0);
    UWrite_Byte(E0CSR, rbSDSTL);       // 發送STALL
    Ep_Status[0] = EP_STALL;           // 端點0到STALL狀態,直到下次復位
}

//處理標準請求的函數
void Get_Status()
{	
   	switch(Setup.bmRequestType)                  
   	{
      	case IN_DEVICE:                          	// 如果是設備的狀態
           	DataPtr = ZERO_PACKET;               	// 發送 0x00, 總線供電,不支持遠程喚醒
           	DataSize = 2;                        	
           	break;      
      	case IN_INTERFACE:                       	// 接口狀態
           	DataPtr = ZERO_PACKET;               	// 接口狀態永遠返回0
           	DataSize = 2;         
           	break;  
      	case IN_ENDPOINT:                        	// 端點狀態
           	if (Setup.wIndex[0] == IN_EP1)          // 如果是端點1
			{
				if (Ep_Status[1] == EP_HALT)
				{                               // 如果端點1在EN_HALT狀態
					DataPtr = ONES_PACKET;		// 發送ONES_PACKET,指示端點1在HALT狀態
	                DataSize = 2;
	            }
	            else
	            {
	                DataPtr = ZERO_PACKET;		// 否則發送ZERO_PACKET,指示端點1在空閑狀態
	                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;                     // 端點0在EP_TX狀態
      	DataSent = 0;								// 已發送數據量清零
   }
}

void Clear_Feature()
{
	if ((Setup.bmRequestType == OUT_ENDPOINT)&&// 如果是端點
        (Setup.wValue[0] == ENDPOINT_HALT)  && // 并且這些端點的狀態是EP_HALT
       ((Setup.wIndex[0] == IN_EP1) ||         // 并且選擇的是端點1 IN
        (Setup.wIndex[0] == OUT_EP2)))         // 或端點2 OUT 
	{
         if (Setup.wIndex[0] == IN_EP1) 
         {
            UWrite_Byte (INDEX, 1);             // 使toggle復位為零
            UWrite_Byte (EINCSRL, rbInCLRDT);       
            Ep_Status[1] = EP_IDLE;             // 端點1到空閑狀態                    
         }
         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 == OUT_ENDPOINT) && 	// 意義同上
        (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,發送STALL作為對IN令牌的響應,
												// 在端點1中斷處理函數中將rbInSDSTl和rbInSTSTL清零    
            Ep_Status[1] = EP_HALT;             // 端點1到HALT狀態                     
         }
         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的地址,設備處于地址狀態,此次傳輸的
      	UWrite_Byte(FADDR, Setup.wValue[0]);// 狀態階段結束后新地址將起作用
      	Ep_Status[0] = EP_IDLE;

   	}
   	else 
   	{
     	USB_State = DEV_DEFAULT;            // 收到的地址為0,設備仍舊處于默認狀態
   	}
   	UWrite_Byte(E0CSR, rbSOPRDY);
	UWrite_Byte(E0CSR, rbDATAEND);                       
                                              
}
void Get_Descriptor()
{
	unsigned int In_DataSize=0;			// 要發送的數據總量
	In_DataSize=Setup.wLength[0];		// +Setup.wLength[1]*256;
	switch(Setup.wValue[1])             // 判斷描述符的類型
    {                                            
		case DSC_DEVICE:         		// 設備描述符  
	       	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;                      // 端點0在發送狀態
    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分割和強制數據Toggle禁止,IN端點
		 Ep_Status[1]=EP_IDLE;
		  
         UWrite_Byte(INDEX, 2);            
         UWrite_Byte(EOUTCSRH, 0x80);      // 雙緩沖和ISO禁止,OUT端點
		 Ep_Status[2]=EP_IDLE; 
		 ///////////////////////////////////////////////////////////////////////////////////
         UWrite_Byte(INDEX, 0);           
   }
   else
   {
         USB_State = DEV_ADDRESS;         // 設備仍舊在地址狀態
		 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盤支持一個邏輯單元,返回1即可
{
	DataPtr = ZERO_PACKET;            
	DataSize = 1;
    if (Ep_Status[0] != EP_STALL)
    {                       
        Ep_Status[0] = EP_TX;           
        DataSent = 0;
    }
   	UWrite_Byte(E0CSR, rbSOPRDY);
}////////////////////////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精品国产免大香伊| 成人激情校园春色| 国产精品理论在线观看| 91精品国产日韩91久久久久久| 国产精品一区二区三区四区| 日本aⅴ免费视频一区二区三区| 亚洲精品午夜久久久| 国产精品久久福利| 国产日本一区二区| 久久夜色精品国产噜噜av| 日韩免费成人网| 色婷婷久久久久swag精品| 国产乱国产乱300精品| 欧美aⅴ一区二区三区视频| 亚洲综合免费观看高清在线观看| 亚洲丝袜另类动漫二区| 日本一区二区综合亚洲| 亚洲免费在线播放| 日韩片之四级片| 欧美日韩一区二区三区免费看 | 亚洲国产成人porn| 亚洲激情网站免费观看| 亚洲一区二区三区小说| 亚洲国产美女搞黄色| 亚洲国产视频一区| 中文子幕无线码一区tr| 国产午夜亚洲精品午夜鲁丝片| 精品国产欧美一区二区| 26uuu另类欧美| 国产午夜亚洲精品不卡| 综合色中文字幕| 亚洲国产日韩在线一区模特| 天堂成人免费av电影一区| 五月婷婷综合激情| 免费成人在线播放| 国产精品123| 91蜜桃视频在线| 欧美日韩久久一区| 日韩精品中文字幕在线不卡尤物| 精品欧美一区二区在线观看| 日本一区二区三区久久久久久久久不 | 综合久久久久综合| 亚洲一区二区三区激情| 黄色成人免费在线| 国内精品视频666| 成人av电影在线网| 欧美日韩另类一区| 日韩免费一区二区| 国产精品萝li| 日韩电影在线一区二区三区| 国产在线一区二区综合免费视频| 成人一区二区三区视频在线观看 | 一区二区在线免费| 青草av.久久免费一区| 成人性视频网站| 欧美最新大片在线看| 欧美xfplay| 亚洲欧美经典视频| 久久99久久精品| 欧美亚洲一区二区在线观看| 久久婷婷成人综合色| 亚洲国产成人av网| 99这里只有精品| 欧美放荡的少妇| 中文字幕永久在线不卡| 久久精品国产免费看久久精品| 色天天综合久久久久综合片| 欧美成人vps| 夜夜精品浪潮av一区二区三区| 国产成人av在线影院| 9191成人精品久久| 亚洲精品国产a| 成人动漫一区二区三区| 精品国产91九色蝌蚪| 中文字幕一区二区三区在线播放 | 亚洲综合免费观看高清完整版在线| 国内精品自线一区二区三区视频| 欧美丝袜丝交足nylons| 国产精品美女一区二区| 国产一区二区三区视频在线播放| 在线观看www91| 自拍av一区二区三区| 国产激情精品久久久第一区二区 | 亚洲成人激情自拍| 91色porny蝌蚪| 国产人伦精品一区二区| 蜜臀久久99精品久久久画质超高清 | 亚洲人成网站色在线观看| 国产成人免费在线| 久久综合久久鬼色中文字| 五月婷婷综合网| 91精品国产综合久久久久久久久久 | 色国产综合视频| 国产精品乱码一区二三区小蝌蚪| 免费一级欧美片在线观看| 欧美日韩精品免费观看视频| 亚洲国产日韩一级| 欧美三级韩国三级日本三斤| 亚洲成人久久影院| 欧美妇女性影城| 亚洲成av人片观看| 91.com在线观看| 久久99精品久久只有精品| 欧美成人bangbros| 亚洲精品一卡二卡| 26uuuu精品一区二区| 国产麻豆一精品一av一免费| 久久久亚洲高清| 国产黑丝在线一区二区三区| 久久久不卡网国产精品一区| 国产精品一区二区不卡| 国产三级一区二区| 91小视频在线| 亚洲一区二区三区四区不卡| 欧美一区二区日韩一区二区| 久久9热精品视频| 日韩精品一区二区在线| 国产一区二区网址| 亚洲四区在线观看| 欧美喷潮久久久xxxxx| 美女网站在线免费欧美精品| 日韩女优电影在线观看| 丝袜国产日韩另类美女| 久久久精品国产99久久精品芒果| 成人av午夜电影| 免费在线看成人av| 1024亚洲合集| 91.com视频| 色婷婷亚洲精品| 国产精品 欧美精品| 蜜桃av一区二区三区| 一区二区三区四区在线免费观看 | av毛片久久久久**hd| 日韩电影在线免费看| 亚洲免费资源在线播放| 欧美激情一区在线观看| 日韩女优视频免费观看| 欧美色欧美亚洲另类二区| 成人免费视频播放| 国产在线精品国自产拍免费| 丝袜美腿亚洲一区| 亚欧色一区w666天堂| 亚洲欧美另类久久久精品| 中文一区在线播放| 国产午夜精品美女毛片视频| 欧美精品一区二区三区高清aⅴ| 欧美日韩激情在线| 538在线一区二区精品国产| 欧美吞精做爰啪啪高潮| 色呦呦一区二区三区| 色综合夜色一区| 欧美专区在线观看一区| 色综合久久中文字幕综合网| 91免费视频网址| 91麻豆高清视频| 在线观看视频91| 精品视频全国免费看| 欧美精品一二三区| 日韩欧美一级精品久久| 亚洲精品一区二区三区四区高清| wwwwww.欧美系列| 国产欧美日韩麻豆91| 国产精品久久久久精k8| 亚洲精品国产精华液| 亚洲成人一区在线| 美日韩一区二区三区| 韩国女主播成人在线| 国产成人精品亚洲日本在线桃色| 成人国产视频在线观看| 91欧美一区二区| 欧美伊人精品成人久久综合97| 91.com视频| 欧美国产精品中文字幕| 亚洲欧美另类久久久精品| 日韩高清不卡一区二区三区| 激情国产一区二区| 91丨porny丨首页| 91精品国产乱码久久蜜臀| 久久精品欧美一区二区三区不卡| 国产精品久久99| 五月综合激情网| 国产成人午夜精品影院观看视频| 色又黄又爽网站www久久| 日韩欧美高清dvd碟片| 国产精品午夜免费| 日韩av中文字幕一区二区三区| 高清不卡一区二区在线| 欧美亚洲国产一区二区三区va| 日韩欧美黄色影院| 自拍偷拍亚洲综合| 精品一区二区三区视频| 99久免费精品视频在线观看| 91精品麻豆日日躁夜夜躁| 亚洲国产精品传媒在线观看| 天堂一区二区在线免费观看| 丁香亚洲综合激情啪啪综合| 这里只有精品免费| 亚洲特级片在线| 国产成人午夜99999| 在线不卡免费av|