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

📄 d12_command.c

📁 我改了一部分别人的USB,原来的不方便看逻辑
💻 C
字号:
#include"mytype.h"
#include "d12_command.h"
#include"d12_value.h"
#include"port.h"
#include"my_usb.h"
#include "uar.h"
extern USB_FLAGS usb_flags;
extern INT_REG Interrupt_Register;
extern CONTROL_DATA_BUFF Control_Data;
//缓冲
 

//交换数据时用的指针
uint8 idle;     //空闲状态
uint8 protocol; //当前协议


/***************************断开USB连接****************************************/
void disconnect_usb(void)
{
 write_command(Set_Mode);
 write_data(0x0e);
 write_data(0x47);
 del(100);
}
 /*******************************连接USB**************************************/
void connect_usb(void)
{ 
 write_command(Set_Mode);                         //初始化USBD12
 write_data(0x1e);                          //连接USB
 write_data(0x47);                          //设置频率
}

/******************************************************************************/
/*************************端点使能******************************************/
void set_endpoint_enable(void)
{
 write_command(Set_Endpoint_Enable);
 write_data(0x01);
}
/******************************************************************************/
/****************************读端点最后状态**********************************/
uint8  read_last_status(uint8 endp)
{
 write_command(Read_Last_Status+endp);
 return read_data();
}
/******************************************************************************/
/************************读USB中断寄存器**************************************/
void read_interrupt_register(void)
{
 write_command(Read_Interrupt_Register);
 Interrupt_Register.value[0]=read_data();
 Interrupt_Register.value[1]=read_data();
}
/******************************************************************************/

/****************************USB总线复位处理***********************************/
void usb_bus_reset(void)
{usb_flags.value=0;
 set_endpoint_enable();
 Prints("USB总线复位.\r\0");
}
/******************************************************************************/
/*****************************USB总线挂起处理**********************************/
void usb_bus_suspend(void)
{ Prints("USB总线挂起.\r\0");
}
/******************************************************************************/
/************************设置USB地址*******************************************/
void set_addr_enable(uint8 addr)
{
 write_command(Set_Address);
 write_data(0x80|addr);
  Prints("USB地址:\0"); 
  PrintHex(addr);
  Prints("\r\0");
}



/******************************************************************************/
/****************************选择终端点*************************************/
uint8 select_endpoint(uint8 endp)
{
 write_command(Select_EndPoint+endp);
 return read_data();
}
/******************************************************************************/
void error(uint8 number)
{
 number=0;
}
/************************清缓冲,在读取缓冲数据后调用**************************/
void clear_buffer(void)
{
 write_command(Clear_Buffer);
}
/******************************************************************************/
/***********************缓冲区数据有效,在写缓冲后调用**************************/
void validate_buffer(void)
{
 write_command(Validate_Buffer);
 
}
/******************************************************************************/
/****************************设置端点状态**************************************/
void set_endpoint_status(uint8 endp,uint8  status)  
{
 write_command(0x40+endp);
 write_data(!status);
}
/******************************************************************************/
/***************************应答建立包************************************/
void ack_setup(uint8 endp)
{
 select_endpoint(endp);
 write_command(Ack_Setup); 
}
/******************************************************************************/

/*****************************读端点状态**************************************/
uint8 read_endpoint_status(uint8 endp)
{
 write_command(0x80+endp);
 return read_data();
}
/******************************************************************************/
/*************************读终端点缓冲****************************************/
uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
 uint8 i,j; 
 if(!(select_endpoint(endp)&0x01)){error(0); return 0;}
 if((read_endpoint_status(endp)&0x60)!=0x60)  //两个缓冲没有都满,才能清中断
 {
  read_last_status(endp);  //清中断
 }
 write_command(Read_Buffer);
 read_data();
 j=read_data();
 if(j>len)
  j=len;  
 for(i=0;i<j;i++)
  {
   USB_RD=0;
   *(buff+i)=USB_DATA;
   USB_RD=1;
 
  }
 if(endp)
 {
  select_endpoint(endp);
  clear_buffer();
 }
 return j;
}
/******************************************************************************/

/*************************写终端点缓冲*****************************************/
uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
 uint8 i;
 read_last_status(endp);
 select_endpoint(endp);
 write_command(Write_Buffer);
 write_data(0);
 write_data(len);

 for(i=0;i<len;i++)
  {
   USB_DATA=*(buff+i);
   USB_WR=0;
   USB_WR=1;
  }
 USB_DATA=0xFF;
 validate_buffer();
 return len;
}
/******************************************************************************/

//以下为第9章节协议
/***************************设置地址***************************************/
void set_usb_address(void)//???
{
Control_Data.wLength=0;
Control_Data.pData=0;
usb_flags.Status.set_addr=1; 
set_addr_enable((uint8) Control_Data.DeviceRequest.wValue);  
}
/******************************************************************************/

/**************************获取状态响应*****************************************/
void get_status(uint8 receiver)
{
 uint8 status[2];
 switch (receiver)
  {
   case 0:                        //获取设备状态
    status[0]=0x00;
    status[1]=0x00;
    break;
   case 1:                        //获取接口状态
    status[0]=0x00;
    status[0]=0x00;
    break;
   case 2:                        //获取端点状态
    status[0]=0x00;
    status[1]=0x00;
    break;
   }
Control_Data.wLength=2;
Control_Data.pData=&status; 
}
/******************************************************************************/

/*********************清除特性*******************************************/
void clear_feature(uint8 receiver)    
{
 receiver=0;
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/

/*******************设置特性**************************************************/
void set_feature(uint8 receiver)
{
 receiver=0;
 Control_Data.wLength=0;
Control_Data.pData=0;
 
}
/******************************************************************************/

/*****************************设置描述*****************************************/
void set_descriptor(void)
{Control_Data.wLength=0;
Control_Data.pData=0;
 
}
/******************************************************************************/

/***************************设置配置*******************************************/
void set_configuration(void)
{ 
Control_Data.wLength=0;
Control_Data.pData=0;
 
}
/******************************************************************************/

/************************获取配置状态******************************************/
void get_configuration(void)
{ 
 uint8 value=0x01;
 Control_Data.wLength=1;
 Control_Data.pData=&value;
}
/******************************************************************************/

/****************************设置接口************************************/
void set_interface(void)
{
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/

/***************************获取接口状态***************************************/
void get_interface(void)
{
 uint8 value=0x01;
 Control_Data.wLength=1;
Control_Data.pData=&value;
 
}
/******************************************************************************/
 uint16 i;
/***********************获取描述符*********************************************/
void get_descriptor(void)
{
  //if(!usb_flags.Status.not_end)//如果已经结束则再次重新写入要的内容,如果还没有结束则转到以后的语句再次写没有发完的东东.

      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case DEVICE_DESCRIPTOR: 
	         Control_Data.wLength=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 	         Control_Data.pData=(uint8 *)(&device_descriptor);
             break;
        case CONFIGURATION_DESCRIPTOR: 
             Control_Data.wLength=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
			 Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);

             break;
		case STRING_DESCRIPTOR: 
			 switch(LSB(Control_Data.DeviceRequest.wValue))
			  {
			   case 0:
 
			    Control_Data.wLength=LANGUAGE_ID[0];
                Control_Data.pData=LANGUAGE_ID;
   			    break;

			   case 1:
 
			    Control_Data.wLength=ManufacturerString[0];
                Control_Data.pData=ManufacturerString;
			    break;

			   case 2:
 
			    Control_Data.wLength=ProducterString[0];
                Control_Data.pData=ProducterString;
			    break;

			   case 3:
 
			     Control_Data.wLength=device_serial_number[0];
			     Control_Data.pData=device_serial_number;
			   break;

			   default: break;
			  }
			 break;
		 default:
 
		  break;
	   	}    
}
/******************************************************************************/

/*********************发到接口的获取描述符**************************************/
void get_descriptor_interface(void)
{
  //if(!usb_flags.Status.not_end)
 
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case HID_DESCRIPTOR: 
	         Control_Data.wLength=sizeof(HID_DESCRIPTOR_STRUCT);
 //	         Control_Data.pData=(uint8 *)(&hid_descriptor);
             break;
        case REPORT_DESCRIPTOR:
             Control_Data.wLength=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:
 
			 break;
		 default:
 
		  break;
	   	}
 

}
/******************************************************************************/
/***********************获取报告*********************************************/
void get_report(void)
{
 Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/

/**********************获取空闲状态*********************************************/
void get_idle(void)
{  
Control_Data.wLength=1;
Control_Data.pData=&idle;
}
/******************************************************************************/

/*************************获取协议**********************************************/
void get_protocol(void)
{Control_Data.wLength=1;
Control_Data.pData= &protocol;
}
/******************************************************************************/

/***********************设置报告***********************************************/
void set_report(void)
{
Control_Data.wLength=0;
Control_Data.pData=0;
}
/******************************************************************************/

/***********************设置空闲***********************************************/
void set_idle(void)
{
 while(select_endpoint(1)&0x01);
Control_Data.wLength=0;
Control_Data.pData=0;
 idle=Control_Data.DeviceRequest.wValue;
}
/******************************************************************************/

/**********************设置协议**************************************************/
void set_protocol(void)
{
 while(select_endpoint(1)&0x01);
Control_Data.wLength=0;
Control_Data.pData=0;
 protocol=Control_Data.DeviceRequest.wValue;
}
/******************************************************************************/

⌨️ 快捷键说明

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