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

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

?? usb_setup.#2

?? 源碼 : KIEL C 單片機 : C8051F320 功能 : U盤 (64M) 關鍵字 : C8051F320,U盤,NANDFLASH,FAT,SCH 描述 : 源碼完全可運行
?? #2
字號:
#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 & 0x02)&&			// 如果是端點
        (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  & 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,發送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在线视频观看| 日韩一区二区电影网| 一区2区3区在线看| 成人福利视频网站| 欧美精品一区二| 日韩成人免费在线| 色狠狠av一区二区三区| 国产精品萝li| 国产成人综合在线| 久久人人爽人人爽| 蜜臀av亚洲一区中文字幕| 欧美日韩中文另类| 一区二区三区自拍| 不卡的看片网站| 国产欧美日韩麻豆91| 国产精品一卡二卡在线观看| 精品国产区一区| 国产在线一区二区| 精品99一区二区三区| 久久se精品一区二区| 制服丝袜日韩国产| 日本午夜一本久久久综合| 久久日一线二线三线suv| 亚洲国产日韩综合久久精品| 91一区二区在线观看| 中文字幕五月欧美| 91在线一区二区| 亚洲男女毛片无遮挡| 91欧美一区二区| 亚洲自拍偷拍欧美| 欧美嫩在线观看| 日韩成人免费电影| 日韩三级中文字幕| 久久99九九99精品| 久久久久99精品一区| 伊人色综合久久天天人手人婷| 成人97人人超碰人人99| 国产精品入口麻豆九色| av不卡一区二区三区| 国产精品久久三区| 91精品办公室少妇高潮对白| 亚洲国产日韩在线一区模特| 制服视频三区第一页精品| 久久精品国产99国产| 精品免费一区二区三区| 国产成人高清在线| 国产精品灌醉下药二区| 日本乱人伦一区| 蜜臀av性久久久久av蜜臀妖精| 久久久久久久久久久久久女国产乱| 成人一区在线观看| 亚洲影视在线播放| 久久综合狠狠综合| 99re视频精品| 日本成人在线视频网站| 日本一区二区三区四区在线视频| 91成人国产精品| 狂野欧美性猛交blacked| 亚洲欧洲成人精品av97| 欧美日韩一区二区在线视频| 久99久精品视频免费观看| 国产精品久久久久永久免费观看 | 久久久不卡网国产精品二区 | 91麻豆精品91久久久久同性| 国产成人亚洲综合a∨猫咪| 国产精品久久夜| 欧美一区二区三区系列电影| 国产91丝袜在线18| 午夜久久久久久电影| 欧美激情综合在线| 91精品国产入口| 91原创在线视频| 久久99精品国产91久久来源| 亚洲自拍另类综合| 国产日韩精品视频一区| 8x8x8国产精品| 色香蕉久久蜜桃| 国产不卡在线播放| 麻豆精品视频在线观看| 伊人开心综合网| 国产欧美视频在线观看| 91麻豆精品国产91久久久使用方法| 91视频国产资源| 国产一区二区三区免费看 | 亚洲午夜久久久久久久久电影院| 久久精品夜夜夜夜久久| 欧美一级久久久| 欧美亚洲免费在线一区| www.欧美日韩| 国产精品综合网| 激情综合色丁香一区二区| 午夜久久久影院| 一区二区免费视频| 亚洲图片激情小说| 国产精品三级av| 国产喷白浆一区二区三区| 精品国产伦一区二区三区免费 | 在线亚洲人成电影网站色www| 高清在线观看日韩| 国产乱淫av一区二区三区| 久久成人免费电影| 久久精品国产亚洲高清剧情介绍| 三级一区在线视频先锋| 亚洲成人在线免费| 五月婷婷色综合| 亚洲一区二区在线免费看| 亚洲综合精品久久| 亚洲成av人片在线观看无码| 亚洲bt欧美bt精品| 日本不卡视频在线| 秋霞午夜av一区二区三区| 日本成人中文字幕在线视频| 调教+趴+乳夹+国产+精品| 丝袜国产日韩另类美女| 日本欧美大码aⅴ在线播放| 裸体一区二区三区| 国产麻豆精品视频| 岛国精品在线播放| 蜜臀久久99精品久久久久久9 | 色综合视频一区二区三区高清| 成人听书哪个软件好| 风流少妇一区二区| 91影视在线播放| 欧美色图12p| 日韩欧美一区二区三区在线| 久久久激情视频| 亚洲视频中文字幕| 亚洲成人三级小说| 免费高清在线一区| 国产成人精品免费网站| 99久久免费精品高清特色大片| 色吊一区二区三区| 日韩欧美一区二区免费| 欧美极品美女视频| 一区二区三区欧美在线观看| 肉丝袜脚交视频一区二区| 国产中文字幕精品| 91美女精品福利| 欧美一区二区免费视频| 国产日韩三级在线| 亚洲在线视频网站| 久久99国产精品免费网站| 日韩一卡二卡三卡| 国产三级一区二区| 专区另类欧美日韩| 日本在线不卡视频| av一区二区三区在线| 欧美日韩国产综合久久| 国产欧美日韩另类一区| 亚洲高清免费视频| 国产精品影视网| 在线视频欧美区| 精品免费日韩av| 亚洲女性喷水在线观看一区| 免费精品视频在线| 91久久奴性调教| 日韩免费观看高清完整版在线观看| 国产精品美日韩| 久久狠狠亚洲综合| 欧洲激情一区二区| 国产精品日韩精品欧美在线| 午夜精品福利久久久| 北岛玲一区二区三区四区| 日韩欧美在线综合网| 一区二区免费看| www.99精品| 精品福利一二区| 国产成人精品网址| 欧美一区二区性放荡片| 国产精品少妇自拍| 精品中文字幕一区二区| 欧美日韩国产综合一区二区 | 欧美一区二区不卡视频| 国产精品久久久久aaaa| 国内外成人在线| 欧美电视剧在线看免费| 日韩电影在线免费观看| 在线精品视频免费播放| 中文字幕一区二区三区不卡 | av在线不卡免费看| 久久久国产精品午夜一区ai换脸| 老司机免费视频一区二区三区| 欧美三级欧美一级| 亚洲福利视频三区| 在线亚洲高清视频| 亚洲激情图片qvod| 色偷偷久久人人79超碰人人澡| 综合中文字幕亚洲| 91麻豆国产精品久久| 中文字幕在线不卡| 99re8在线精品视频免费播放| 国产精品三级视频| 91网站黄www| 亚洲主播在线播放| 欧美精品1区2区3区| 日本中文字幕一区二区视频|