⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myudisk.h

📁 这是我学USB时候
💻 H
字号:
#ifndef __MYUDISK_H__
#define __MYUDISK_H__


//11个USB标准请求
#define	get_status			0x00
#define	clear_feature 		0x01
#define	reserved			0x02
#define	set_feature			0x03
#define	set_address			0x05
#define	get_descriptor		0x06
#define	get_configuration	0x08
#define	set_configuration	0x09
#define	get_interface		0x0a
#define	set_interface		0x0b

//SCSI指令集中的几个指令
#define Inquiry							0x12
#define	Mode_Sense						0x1A
#define	Read10							0x28
#define Read_Capacity 					0x25 
#define Read_Format_Capacities 	        0x23 
#define Test_Unit_Ready 				0x00 
#define Verify 							0x2F 
#define Write10 						0x2A 
#define Medium_Removal					0x1E

#define SCSI_MSPGCD_TPP		    	    0x1C
#define SCSI_MSPGCD_RETALL			    0x3F
  

typedef struct _STRUCT_CBW
{

  unsigned char CBWCB[12];   //UFI Command all have 12bit

}struct_CBW;
  

int  DbgPrintfLoop(void);
void DbgPrintf(char *fmt,...);
void __irq IsrUsbd(void);
void InitUsbd(void);
void PrintEp0Pkt(U8 *pt);
void Ep0Handler(void);
void Ep1Handler(void);
void Ep3Handler(void);
void TransmitCSW(void);
void SCSI_Read_Format_Capacities(void);
void SCSI_Read10(void);//FLASH读处理函数
void SCSI_Write10(void);	//FLASH写操作
void SCSI_Mode_Sense(void);
void SCSI_Get_Inquery(void);
void SCSI_Read_Capacity(void);

// ===================================================================
// All following commands will operate only in case 
// - ep0_csr is valid.
// ===================================================================
#define CLR_EP0_OUT_PKT_RDY() 		rEP0_CSR=( ep0_csr & (~EP0_WR_BITS)| \
						EP0_SERVICED_OUT_PKT_RDY )	 
#define CLR_EP0_OUTPKTRDY_DATAEND() 	rEP0_CSR=( ep0_csr & (~EP0_WR_BITS)| \
						(EP0_SERVICED_OUT_PKT_RDY|EP0_DATA_END) )	 
					
#define SET_EP0_IN_PKT_RDY() 		rEP0_CSR=( ep0_csr & (~EP0_WR_BITS)| \
						(EP0_IN_PKT_READY) )	 
#define SET_EP0_INPKTRDY_DATAEND() 	rEP0_CSR=( ep0_csr & (~EP0_WR_BITS)| \
						(EP0_IN_PKT_READY|EP0_DATA_END) )	 
					
#define CLR_EP0_SETUP_END() 		rEP0_CSR=( ep0_csr & (~EP0_WR_BITS)| \
						(EP0_SERVICED_SETUP_END) )

#define CLR_EP0_SENT_STALL() 		rEP0_CSR=( ep0_csr & (~EP0_WR_BITS)& \
						(~EP0_SENT_STALL) )

#define FLUSH_EP0_FIFO() 		{while(rOUT_FIFO_CNT1_REG)rEP0_FIFO;}



// ===================================================================
// All following commands will operate in case 
// - in_csr1 is valid.
// ===================================================================
#define SET_EP1_IN_PKT_READY()  rIN_CSR1_REG= ( in_csr1 &(~ EPI_WR_BITS)\
					| EPI_IN_PKT_READY )	 
#define SET_EP1_SEND_STALL()	rIN_CSR1_REG= ( in_csr1 & (~EPI_WR_BITS)\
					| EPI_SEND_STALL) )
#define CLR_EP1_SENT_STALL()	rIN_CSR1_REG= ( in_csr1 & (~EPI_WR_BITS)\
					&(~EPI_SENT_STALL) )
#define FLUSH_EP1_FIFO() 	rIN_CSR1_REG= ( in_csr1 & (~EPI_WR_BITS)\
					| EPI_FIFO_FLUSH) )

// ===================================================================
// All following commands will operate in case 
// - out_csr3 is valid.
// ===================================================================
#define CLR_EP3_OUT_PKT_READY() rOUT_CSR1_REG= ( out_csr3 &(~ EPO_WR_BITS)\
					&(~EPO_OUT_PKT_READY) ) 
#define SET_EP3_SEND_STALL()	rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)\
					| EPO_SEND_STALL) )
#define CLR_EP3_SENT_STALL()	rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)\
					&(~EPO_SENT_STALL) )
#define FLUSH_EP3_FIFO() 	rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)\
					|EPO_FIFO_FLUSH) )


#define EP0_STATE_INIT 			(0)  
//NOTE: The ep0State value in a same group should be added by 1.
#define EP0_STATE_GD_DEV_0	 	(10)  //10-10=0 
#define EP0_STATE_GD_DEV_1 		(11)  //11-10=1
#define EP0_STATE_GD_DEV_2 		(12)  //12-10=2

#define EP0_STATE_GD_CFG_0	 	(20)
#define EP0_STATE_GD_CFG_1 		(21)
#define EP0_STATE_GD_CFG_2 		(22)
#define EP0_STATE_GD_CFG_3 		(23)
#define EP0_STATE_GD_CFG_4 		(24)

#define EP0_STATE_GD_CFG_ONLY_0		(40)
#define EP0_STATE_GD_CFG_ONLY_1		(41)
#define EP0_STATE_GD_IF_ONLY_0 		(42)
#define EP0_STATE_GD_IF_ONLY_1 		(43)
#define EP0_STATE_GD_EP0_ONLY_0		(44)
#define EP0_STATE_GD_EP1_ONLY_0		(45)
#define EP0_INTERFACE_GET                        (46)


#define EP0_STATE_GD_STR_I0	 		(30)  
#define EP0_STATE_GD_STR_I1	 		(31)  
#define EP0_STATE_GD_STR_I2	 		(32)  

#define EP0_CONFIG_SET				(33)
#define EP0_GET_STATUS0				(35)
#define EP0_GET_STATUS1				(36)
#define EP0_GET_STATUS2				(37)
#define EP0_GET_STATUS3				(38)
#define EP0_GET_STATUS4				(39)


//USB建立数据包的结构//具体各个字段的含义,详见USB协议中的说明
struct USB_SETUP_DATA{
    U8 bmRequestType;    
    U8 bRequest;         
    U8 bValueL;          
    U8 bValueH;          
    U8 bIndexL;          
    U8 bIndexH;          
    U8 bLengthL;         
    U8 bLengthH;         
};
 

 
 struct USB_GET_STATUS{			//返回USB的状态
     U8 Device;
     U8 Interface;
     U8 Endpoint0;
     U8 Endpoint1;
     U8 Endpoint3;
 };

 struct USB_INTERFACE_GET{	
     U8 AlternateSetting;
 };
// Standard bmRequestTyje (Direction) 
#define HOST_TO_DEVICE              (0x00)	//在Setup的数据结构中的bmRequestType字段的各位的含义
#define DEVICE_TO_HOST              (0x80)	//数据的传输方向

// Standard bmRequestType (Type) 
#define STANDARD_TYPE               (0x00)	//请求的类型
#define CLASS_TYPE                  (0x20)	
#define VENDOR_TYPE                 (0x40)	
#define RESERVED_TYPE               (0x60)	

// Standard bmRequestType (Recipient) 
#define DEVICE_RECIPIENT            (0)		//表明请求的接收者
#define INTERFACE_RECIPIENT         (1)
#define ENDPOINT_RECIPIENT          (2)
#define OTHER_RECIPIENT             (3)

// Feature Selectors						//特性选择符
#define DEVICE_REMOTE_WAKEUP        (1)		
#define EP_STALL                    (0)		

// Standard Request Codes					//11个标准的请求代码
#define GET_STATUS                  (0)		
#define CLEAR_FEATURE               (1)
#define SET_FEATURE                 (3)
#define SET_ADDRESS                 (5)
#define GET_DESCRIPTOR              (6)
#define SET_DESCRIPTOR              (7)
#define GET_CONFIGURATION           (8)
#define SET_CONFIGURATION           (9)
#define GET_INTERFACE               (10)
#define SET_INTERFACE               (11)
#define SYNCH_FRAME                 (12)
 
#define GET_MAX_LUN					(0xfe)

// Class-specific Request Codes			    //
#define GET_DEVICE_ID               (0)
#define GET_PORT_STATUS             (1)
#define SOFT_RESET                  (2)

// Descriptor Types							//描述符类型
#define DEVICE_TYPE                 (1)
#define CONFIGURATION_TYPE          (2)
#define STRING_TYPE                 (3)
#define INTERFACE_TYPE              (4)
#define ENDPOINT_TYPE               (5)
					
//configuration descriptor: bmAttributes   	
#define CONF_ATTR_DEFAULT			(0x80) //Spec 1.0 it was BUSPOWERED bit.
#define CONF_ATTR_REMOTE_WAKEUP     (0x20)
#define CONF_ATTR_SELFPOWERED       (0x40)

//endpoint descriptor						
#define EP_ADDR_IN					(0x80)	
#define EP_ADDR_OUT					(0x00)

#define EP_ATTR_CONTROL				(0x0)	
#define EP_ATTR_ISOCHRONOUS			(0x1)
#define EP_ATTR_BULK				(0x2)
#define EP_ATTR_INTERRUPT			(0x3)	


//string descriptor
#define LANGID_US_L 				(0x09)  
#define LANGID_US_H 				(0x04)
 
#endif //__MYUDISK_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -