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

📄 chap_9.c

📁 2812学习板usb68013源代码,包括usb驱动
💻 C
字号:

#include "standard.h"
#include "Kernel.h"
#include "D14.h"
#include "USB.h"


extern void Init_D14(void);


extern unsigned int   Manufacturer_String[];
extern unsigned int   Product_String[];
extern unsigned int   String_ID[];

extern unsigned int   HS_Device_Descriptor[];
extern unsigned int   HS_Device_Qualifier[];
extern unsigned int   HS_Interface_Descriptor2[]; 
extern unsigned int   HS_Config_Descriptor[];
extern UC   HS_Bulk_In_Descriptor[];
extern UC   HS_Bulk_Out_Descriptor[];
extern UC   Other_Speed_Config_Descriptor[];


extern void Check_Busy(void);
extern void TaskFile_Update(void);
extern UI Temp;
extern UC  Device_Config_Value;
extern KERNEL Kernel_Flag;
extern DMA_INT_FLAG DMA_Int_Flag;
extern USB_INT_FLAG USB_Int_Flag;
extern USBCBW USB_CBW;
extern void Init_Device(void);
extern UC   Test_Packet[];
extern void Init_Endpoint(void);
extern void Init_Device(void);
extern void Set_USB(void);


void USB_Setup(void);
void Send_Device_Status(void);
void Send_Interface_Status(void);
void Send_Endpoint_Status(void);

void Vendor_Specific_Command(void);
void Send_Status(unsigned char tran_status);

void Set_Interface_Value(void);
void Get_Interface_Value(void);
void Process_Synch_Frame(void);

void get_status(void);
void clear_feature(void);
void set_feature(void);
void set_address(void);
void get_descriptor(void);
void get_config(void);
void set_config(void);
void get_interface(void);
void set_interface(void);

void Set_Descriptor(void);


void ep0in_ack(void);
void ep0out_ack(void);
void wait_ep0tx(void);
void wait_ep0rx(void);
void read_endpoint(unsigned char endp, int len,unsigned int *buf);
void write_endpoint(unsigned char endp,unsigned int len,unsigned int *buf);    

extern unsigned int tt[32][4],ttt;
UI	Temp;
KERNEL Kernel_Flag;

USB_INT_FLAG  USB_Int_Flag;
USB_DEVICE_REQ	USB_Device_Request;
USB_DEVICE		USB_Device;

UC		*Descriptor_Ptr;

int16 count;
 


void USB_Debug_Mode(void)
{}
//建立包处理
void USB_Setup(void)
{
	unsigned int data[4],req;
    
	//清除EP0 SETUP中断标志
	USB_Int_Flag.BITS.EP0SETUP = 0;	  
	//清除总线复位标志
   	Kernel_Flag.BITS.Bus_Reset = 0;
	//选择端点0 SETUP缓冲区
	 D14_ENDPT_INDEX = 0x20;
	
	//读取USB请求
	//读取请求类型   
	data[0]=D14_DATA_PORT;
	data[1]=D14_DATA_PORT;
	data[2]=D14_DATA_PORT;
	data[3]=D14_DATA_PORT;
	
	D14_CONTROL_FUNCTION = 0x10;
  
	
	data[1]=((data[1]>>8)&0x00ff)|(((data[1]&0x00ff)<<8)&0xff00);
	data[2]=((data[2]>>8)&0x00ff)|(((data[2]&0x00ff)<<8)&0xff00);
//	data[3]=((data[3]>>8)&0x00ff)|(((data[3]&0x00ff)<<8)&0xff00);
	
	USB_Device_Request.bmRequestType = data[0];
	//读取请求号
	USB_Device_Request.bRequest =data[0]>>8;
	//读取16bit请求数据
	USB_Device_Request.wValue = data[1];

	//读取16bit请求索引
	USB_Device_Request.wIndex =data[2];

	//读取16bit长度
	USB_Device_Request.wLength =data[3];
		

	req = USB_Device_Request.bRequest & 0x0f;

	//	(*StandardDeviceRequest[req])();//调用标准请求 
	switch(USB_Device_Request.bRequest)
	{
	case  0:
	  get_status();
	  break;
	case 1:
	  clear_feature();
	  break;
	case 3:
	  set_feature();
	  break;
	case 5:
	  set_address();
	  break;
	case 6:
	  get_descriptor();
	  break;
	case 8:
	  get_config();
	  break;
	case 9:
	  set_config();
	  break;
	case 10:
	  get_interface();
	  break;
	case 11:
	  set_interface();
	  break;
	default:
	break;
	} 	
		
}




//Get_Descriptor()获取描述符
void get_descriptor(void)
{   
   

	switch((USB_Device_Request.wValue)&0x00ff)
	{
	case  1://设备描述符 	
	     write_endpoint(1,18,HS_Device_Descriptor);
		//wait_ep0tx();
		//ep0out_ack();
		break;
		
	case  2        :  //获取配置描述符
		if(9 == USB_Device_Request.wLength)				//Send only Configuration descriptor
		{
			write_endpoint(1,9,HS_Config_Descriptor); 
			//wait_ep0tx();
			//ep0out_ack();
		}
		else  
		{
			
			write_endpoint(1,32,HS_Interface_Descriptor2);	
			//wait_ep0tx();
			//ep0out_ack();
		}
		break;
		
		case  3:  //获取字符串描述符
			if(USB_Device_Request.wValue==0x0003)
			   write_endpoint(1,4,String_ID);
			 if(USB_Device_Request.wValue==0x0103)
			   write_endpoint(1,26,Manufacturer_String);
			if(USB_Device_Request.wValue==0x0203)
			   write_endpoint(1,38,Product_String);
			 	
			///ep0out_ack();
			break;
			
			
		case  4:  
			//reserved();
			break;
			
		case  5:  //获取端点描述符
			break;
			
		case  6:  //获取设备限制描述符
			write_endpoint(1,10,HS_Device_Qualifier); //加上这一句后会使枚举速度大大加快
			break;
			
		case  7  ://获取速度配置描述符
	
			break;
			
		case  8:  
			break;
			
		default  :
			 D14_ENDPT_INDEX = 1;
			 D14_CONTROL_FUNCTION|= 0x01;
			while(!USB_Int_Flag.BITS.EP0SETUP)
			{
				//读取ISP1581中断寄存器
				USB_Int_Flag.VALUE |=  D14_INT;
				//回写ISP1581中断寄存器
				 D14_INT = USB_Int_Flag.VALUE;
				if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
					return;
			}
			USB_Int_Flag.BITS.EP0TX = 0;
			break;
	}     
	             
	
}	

//Set_Address设置地址
void set_address(void)
{
	USB_Int_Flag.BITS.EP0RX = 0;
	 D14_ADDRESS = (USB_Device_Request.wValue >> 8)|0x80;//设置地址  
	 D14_CONTROL_FUNCTION = 2;
	//状态响应
	ep0in_ack();  


}

//Set_Config设置配置
void set_config(void)
{
	USB_Int_Flag.BITS.EP0RX = 0;
	
	if(USB_Device_Request.wValue == 0)
	{
		Device_Config_Value = 0;
		ep0in_ack();
	}
	else if (USB_Device_Request.wValue ==  0x0100)
    {
		//配置设备
		Device_Config_Value = (UC ) (USB_Device_Request.wValue >> 8);
		ep0in_ack(); 

	}
	else
	{
		 D14_ENDPT_INDEX = 1;
		 D14_CONTROL_FUNCTION |= 0x01;
		while(!USB_Int_Flag.BITS.EP0SETUP)
		{
			//读取ISP1581中断寄存器
			USB_Int_Flag.VALUE |=  D14_INT;
			//回写ISP1581中断寄存器
			 D14_INT = USB_Int_Flag.VALUE;
			if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
				return;
		}
		USB_Int_Flag.BITS.EP0TX = 0;
	}
	
	 D14_ENDPT_INDEX = 3;
	   asm("  nop");
	  D14_CONTROL_FUNCTION |= 0x10; 
}


//Get_Config获取配置
void get_config(void)
{   
}	

//Clear_Feature特性清除
void clear_feature(void)
{   
}	

//Get_Status获取设备状态
void get_status(void)
{  
	
}	



//Set_Feature特性设置
//不支持测试模式
void set_feature(void)
{   
}


//Get_Interface	获取接口状态
void get_interface(void)
{   
}


//Set_Interface 设置接口状态
void set_interface(void)
{
}



//端点0IN状态响应
void ep0in_ack(void)
{
	 D14_ENDPT_INDEX = 1;
	 D14_CONTROL_FUNCTION |= 0x02;
	wait_ep0tx();
}

//端点0IN状态响应
void wait_ep0tx(void)
{
	//end of status stage
	while(!USB_Int_Flag.BITS.EP0TX)
	{
		//读取ISP1581中断寄存器
		USB_Int_Flag.VALUE |=  D14_INT ;
		//回写ISP1581中断寄存器
		 D14_INT  = USB_Int_Flag.VALUE;
		if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
			return;
	}
	USB_Int_Flag.BITS.EP0TX = 0;
}

//端点0OUT状态响应
void ep0out_ack(void)
{
	//设置状态响应
	//acknowledge status stage
	 D14_ENDPT_INDEX = 0;
	 D14_CONTROL_FUNCTION|= 0x02;
	wait_ep0rx();
}

//端点0OUT状态响应
void wait_ep0rx(void)
{
	while(!USB_Int_Flag.BITS.EP0RX)
	{
		//读取ISP1581中断寄存器
		USB_Int_Flag.VALUE |=  D14_INT;
		//回写ISP1581中断寄存器
		 D14_INT = USB_Int_Flag.VALUE;
		if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
			return;
	}		
	USB_Int_Flag.BITS.EP0RX = 0;
}


 void read_endpoint(unsigned char endp, int len,unsigned int *buf)
{
	 int datalen;
	 D14_ENDPT_INDEX = endp;
	datalen =  D14_BUFFER_LENGTH;
	if(len>datalen)
	  len=datalen;
	while(len > 0)
	{
		*buf++ =  D14_DATA_PORT;	//fill up FIFO
		len-=2;
	}

    D14_CONTROL_FUNCTION |= 0x10;
}


void write_endpoint(unsigned char endp,unsigned int len,unsigned int *buf)
{
	 int datalen,y;
     
     y=0; 
	
	
	 D14_ENDPT_INDEX = endp;		  
	 D14_BUFFER_LENGTH = len;  
	 
	 if(len%2==0) datalen=len/2;
	else datalen=len/2+1;  
	while(y<datalen)
	{
		 D14_DATA_PORT = buf[y];	//fill up FIFO
		 y++;
	}  
//	D14_CONTROL_FUNCTION |= 0x08;

}



⌨️ 快捷键说明

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