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

📄 epsetup.c

📁 我改了一部分别人的USB,原来的不方便看逻辑
💻 C
字号:
#include"mytype.h"
#include "d12_command.h"
#include"d12_value.h"
#include"port.h"
#include"epmain.h"
#include"uar.h"
extern USB_FLAGS usb_flags;
extern INT_REG Interrupt_Register;
extern LAST_STATUS Last_Status;
extern CONTROL_DATA_BUFF Control_Data;
/************************终端点0输出中断处理************************************/
void endp0_out(void)
{uint16 i;
 Prints("ep0_out\r\0");
 Last_Status.value=read_last_status(0);
 
 if(Last_Status.Status.setup_packet)
  {
     Control_Data.wLength=0;
     Control_Data.wCount=0;
      if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
           {
	      set_endpoint_status(0,0);
	      set_endpoint_status(1,0);
          usb_flags.Status.control_state = USB_IDLE;
	      return;
   	    }
     Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);
     Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);
     Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);

     ack_setup(0);
     ack_setup(1);
	  select_endpoint(0);
      clear_buffer(); 
     usb_flags.Status.setup_packet=1;
     Control_Data.wLength=Control_Data.DeviceRequest.wLength;
     if(Control_Data.DeviceRequest.bmRequestType&0x80)
          {
           usb_flags.Status.control_state=USB_TRANSMIT;
          }
     else 
          { 
            usb_flags.Status.control_state=USB_RECEIVE;
		  }// set command with data
		 // else set command
	}// if setup packet
	// 接收内容

else if(usb_flags.Status.control_state==USB_RECEIVE) //正常的0端点写数据
            {
               i = read_endpoint_buff(0, EP0_PACKET_SIZE,Control_Data.dataBuffer + Control_Data.wCount);  //从端点0接收数据
			   Control_Data.wCount +=i ;					 			  //统计已接收的字节数
		       if( i != EP0_PACKET_SIZE || Control_Data.wCount >= Control_Data.wLength)
		          {  		                                                          	//数据接收完毕
                                                        		     	  //通知control_handler()处理Setup包				  
			    	 usb_flags.Status.control_state = USB_IDLE;	          //设置为等待状态
                   } 
			}
     else
        usb_flags.Status.control_state = USB_IDLE; 
} 
/******************************************************************************/

/****************************终端点0输入处理**************************************/
void endp0_in( void)
{ 
  uint16  i = Control_Data.wLength - Control_Data.wCount;	//计算未发送的字节数
  read_last_status(1);	//清除中断寄存器标志位	
  Prints("ep0_in\r  \0");	
	if (usb_flags.Status.control_state != USB_TRANSMIT)
	   {	//非发送状态												
    	write_endpoint_buff(1,0,0);	
		 Prints("   ep0_in错误返回\r\0");		
		return;											//返回
    	}	
	  if (Control_Data.wLength==0)
	   {                             	              //非发送状态												
    	write_endpoint_buff(1,0,0);	
		Prints("   ep0_in0长度写返回\r\0");		
		return;											//返回
    	}
	if( i >= EP0_PACKET_SIZE) 
	    {							//未发送字节数大于16,发送16个字节
		write_endpoint_buff(1, EP0_PACKET_SIZE, Control_Data.pData + Control_Data.wCount);
		Control_Data.wCount += EP0_PACKET_SIZE;
		usb_flags.Status.not_end=1;
        usb_flags.Status.control_state = USB_TRANSMIT;	
         Prints("  没有写完 \r\0");
	    }
	else if( i != 0) {									//发送所有未发送的字节
		write_endpoint_buff(1, i, Control_Data.pData + Control_Data.wCount);
		Control_Data.wCount += i;
		usb_flags.Status.control_state = USB_IDLE;		//置状态为等待状态
		usb_flags.Status.not_end=0;
		         Prints("   写完 \r\0");
	}
	else if (i == 0){
		write_endpoint_buff(1, 0, 0); 					//发送完毕,发0个字节
		usb_flags.Status.control_state = USB_IDLE; 
		usb_flags.Status.not_end=0;
		Prints("        写空白字 \r\0");
	}
}
/******************************************************************************/
void call_c9(void)
{Prints("进入第九章\r\0");
//如果是输入请求包
if(usb_flags.Status.control_state==USB_TRANSMIT)
  {Prints("     输入包\r\0");
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
        Prints("          输入标准请求\r\0");
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0: //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
		     case 0: get_status(0);break;
		     case 6: get_descriptor();break;
		     case 8: get_configuration();break;
			 default:break;
		    }
		 break;

		 case 1:  //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         case  0: get_status(1);break;
			  case 6: get_descriptor_interface();break;
		     case 10: get_interface();break;
	         default: break;
			}
		 break;

		 case 2:  //到端点
		  {
	       if(Control_Data.DeviceRequest.bRequest==0)get_status(2);  
		  }
		 default: break;
	    }
	   break;

	   case 0x20:  //类请求
 
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default:break;
		    }
		 break;

		 case 1:  //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {

	  		 case     01: get_report();   break; //获取报告
             case     02: get_idle();     break; //获取空闲状态
             case     03: get_protocol(); break; //获取协议
	         default: break;
			}
		 break;

		 case 2:  //到端点
		  {
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}  
		  }
		 default: break;
	    }
	   break;

	   case 0x40:  //用户请求
 
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default: break;
		    }
	     break;

		 case 1:   //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}
         break;

		 case 2:  //到端点
		  {
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}  
		  }
		 default: break;
	    }
	}
    return;
  }

 //如果是输出请求包
if(usb_flags.Status.control_state==USB_RECEIVE)
  {Prints("     输出包\r\0");
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
 	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:   //到设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {
		   case    01: clear_feature(0);break;
		   case    03: set_feature(0);break;
		   case    05: set_usb_address();break;          //set_address	           
		   case    07: set_descriptor();break; //          //set_descriptor
 		   case    0x09: set_configuration(); break;  //     //set_configurat               	          
	  	   default: break;
		  }
		 break;
	 
		 case 1:   //到接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case  01:   clear_feature(1);break;
		    case  03:   set_feature(1); break;
	        case  0x0B: set_interface();break;
		    default: break;
	        }
		 break;
		 
		 case 2:   //到端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case   01: clear_feature(2);break;
		    case   03: set_feature(2);break;
	        default: break;      
		   }
		 break;

		 default: break;
	    }
      break;

	  case 0x20:  //类请求
 
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:    //接收者为设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {             	          
	  	   default: break;
		  }
		 break;

		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
            case     0x09: set_report();   break; //设置报告
            case     0x0A: set_idle();     break; //设置空闲
            case     0x0B: set_protocol(); break; //设置协议
		    default: break;
	        }
		 
		 break;

		 case 2:   //接收者为端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }
		 break;
		 
		 case 3: //其它接收者
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }break;
		   		  
		 default: break;
	    }      
	   break;

       case 0x40:  //用户请求
 
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:    //接收者为设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {             	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    default: break;
	        }
	     break;
		 
		 case 2:   //接收者为端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }
		 break;
		 
		 case 3: //其它接收者
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }		   
		 break;
		   		  
		 default: break;
	    }
	}
  }
}

⌨️ 快捷键说明

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