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

📄 d12api.c

📁 经过测试成功的PDIUSBD12与Mega8的连接代码
💻 C
📖 第 1 页 / 共 2 页
字号:

/*********************发到接口的获取描述符**************************************/
void get_descriptor_interface(void)
{
 Prints("    获取描述符(从接口)..............................",1);
  if(!usb_flags.flags.not_end)
     {
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case HID_DESCRIPTOR:
		     Prints("        获取HID描述符................................",1);
	         Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
 	         //Control_Data.pData=(uint8 *)(&hid_descriptor);
             break;
        case REPORT_DESCRIPTOR:
			 Prints("        获取报告描述符................................",1);
             Control_Data.wCount=SWAP16(sizeof(MouseReportDescriptor));
			 Control_Data.pData=(uint8 *)(MouseReportDescriptor);
             if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
             break;
		case PHYSICAL_DESCRIPTOR:
		     Prints("        获取物理描述符................................",1);
			 break;
		 default:
		     Prints("       获取其它描述符..................描述符索引为:",0);
			 PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
			 Prints("",1); 
		  break;
	   	}
      if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
	 }
	//写数据到D12输入端点
    if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
     {
	  write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
	  Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
      Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
	  if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
	   else usb_flags.flags.usb_endp0_in=0;
	  return;
	 }
    else
     {
	  write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
      usb_flags.flags.setup_packet_in=0;
	  usb_flags.flags.usb_endp0_in=0;
	  return;
	 }      
}
/******************************************************************************/

/************************终端点0输出中断处理************************************/
void endp0_out(void)
{
 Last_Status.Register=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);
	 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);
  Control_Data.wLength=Control_Data.DeviceRequest.wLength;
  usb_flags.flags.not_end=0;
  usb_flags.flags.usb_endp0_in=1;
  usb_flags.flags.setup_packet_in=0;
  usb_flags.flags.setup_packet_out=0;
  if(Control_Data.DeviceRequest.bmRequestType&0x80){usb_flags.flags.setup_packet_in=1;return;}
  else {usb_flags.flags.setup_packet_out=1;return;}
 }
 else
  {
   select_endpoint(0);
   clear_buffer();
  }
}
/******************************************************************************/

/***********************获取报告*********************************************/
void get_report(void)
{
 Prints("        获取报告................................",1);
}
/******************************************************************************/

/**********************获取空闲状态*********************************************/
void get_idle(void)
{
 Prints("    获取空闲................................",1);
 write_endpoint_buff(1,1,&idle);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/*************************获取协议**********************************************/
void get_protocol(void)
{
 Prints("    获取协议................................",1);
 write_endpoint_buff(1,1,&protocol);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/***********************设置报告***********************************************/
void set_report(void)
{
 Prints("    设置报告................................",1);
}
/******************************************************************************/

/***********************设置空闲***********************************************/
void set_idle(void)
{
 Prints("    设置空闲................................",1);
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 idle=Control_Data.DeviceRequest.wValue;
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/**********************设置协议**************************************************/
void set_protocol(void)
{
 Prints("    设置协议................................",1);
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 protocol=Control_Data.DeviceRequest.wValue;
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/****************************终端点0输入处理**************************************/
void endp0_in(void)
{
 read_last_status(1);
 //如果是输入请求包
 if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
	   Prints("USB标准请求................................",1);
	   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:  //类请求
       Prints("USB类请求................................",1);
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default:break;
		    }
		 break;

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

	  		 case   GET_REPORT: get_report();   break; //获取报告
             case     GET_IDLE: get_idle();     break; //获取空闲状态
             case GET_PROTOCOL: get_protocol(); break; //获取协议
	         default: break;
			}
		 break;

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

	   case 0x40:  //用户请求
       Prints("USB用户请求................................",1);
	   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.flags.setup_packet_out) 
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
	   Prints("USB标准请求................................",1);
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:   //到设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {
		   case     CLEAR_FEATURE: clear_feature(0);break;
		   case       SET_FEATURE: set_feature(0);break;
		   case       SET_ADDRESS: set_usb_address();break;          //set_address	           
		   case    SET_DESCRIPTOR: set_descriptor();break;           //set_descriptor
		   case SET_CONFIGURATION: set_configuration(); break;       //set_configurat               	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //到接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE:  clear_feature(1);break;
		    case   SET_FEATURE:  set_feature(1); break;
	        case SET_INTERFACE: set_interface();break;
		    default: break;
	        }
		 break;
		 
		 case 2:   //到端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE: clear_feature(2);break;
		    case   SET_FEATURE: set_feature(2);break;
	        default: break;      
		   }
		 break;

		 default: break;
	    }
      break;

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

		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
            case   SET_REPORT: set_report();   break; //设置报告
            case     SET_IDLE: set_idle();     break; //设置空闲
            case SET_PROTOCOL: 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:  //用户请求
	   Prints("USB用户请求................................",1);
	   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;
	    }
	}
  }
}
/******************************************************************************/

/**********************端点1输出***********************************************/
/*void endp1_out(void)
{
 Prints("端点1输出................................",1);
}*/
/******************************************************************************/

/*************************端点1输入*****************************************/
/*void endp1_in(void)
{
 Prints("端点1输入................................",1);
}*/
/******************************************************************************/

/***************************端点2输出****************************************/
void endp2_out(void)
{
 uint8 i,j;

 j=read_endpoint_buff(4,64,buffer);
 P2=~buffer[0];
 Prints("端点2输出................................",1);
 Prints("    端点2的数据是  ",0);
 for(i=0;i<j;i++)
  {
   PrintHex(buffer[i]);
   if(i==16)Prints("",1);
  }
 Prints("",1);
}
/******************************************************************************/


//用来返回数据的缓冲
uint8 idata InBuffer[64];

⌨️ 快捷键说明

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