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

📄 usb.c

📁 PDIUSBD12 HID固件源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 unsigned char i;
 read_last_status(endp);
 select_endpoint(endp);
 write_usb_command(Write_Buffer);
 write_a_usb_data(0);
 write_a_usb_data(len);
 for(i=0;i<len;i++)
  {
   Write_D12_DATA(*(buff+i));
   D12_WR=0;
   usb_delay();
   D12_WR=1;
  }
 Write_D12_DATA(0XFF);
 validate_buffer();
 return len;
}

void disconnect_usb(void)
{
 write_usb_command(0xf3);
 write_a_usb_data(0x0e);
 write_a_usb_data(0x47);
 delay(100);
}

void connect_usb(void)                            //连接USB
{
 write_usb_command(0xf3);                         //初始化USBD12
 write_a_usb_data(0x1e);                          //连接USB
 write_a_usb_data(0x47);                          //设置频率
}

void init_usb(void)                              //初始化USB
{
 set_usb_addr(0);
 set_endpoint_enable();
}

void usb_bus_reset(void)                         //USB总线复位处理
{
// code unsigned char Usb_Bus_Reset[]={"USB BUS RESET"};
// prints(Usb_Bus_Reset);
 //usb_flags_Register=0;
 set_endpoint_enable();
}

void usb_bus_suspend(void)                       //USB总线挂起处理
{
// code unsigned char Usb_Bus_Suspend[]={"USB BUS SUSPEND"};
// prints(Usb_Bus_Suspend);
// send_to_comport(10);
}

void set_usb_address(void)                       //设置地址
{
 USB_set_addr=1;
 while(select_endpoint(1)&0x01);
 set_usb_addr(Control_Data.DeviceRequest.wValue);
 write_endpoint_buff(1,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void get_status(unsigned char receiver)           //获取状态响应
{
 unsigned char 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;
   }
  write_endpoint_buff(1,2,status);
  USB_usb_endp0_in=0;
}

void clear_feature(unsigned char receiver)    
{
 receiver=0;
 write_endpoint_buff(1,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void set_feature(unsigned char receiver)
{
 receiver=0;
 write_endpoint_buff(1,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void set_descriptor(void)
{
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void set_configuration(void)
{
 write_endpoint_buff(1,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void get_configuration(void)               //获取配置状态
{
 unsigned char value=0x01;
 write_endpoint_buff(1,1,&value);
 USB_usb_endp0_in=0;
}

void set_interface(void)                   //设置接口
{
 write_endpoint_buff(1,0,0);
 USB_usb_endp0_in=0;
 USB_setup_packet_out=0;
}

void get_interface(void)                  //获取接口状态
{
 unsigned char value=0x01;
 write_endpoint_buff(1,1,&value);
 USB_usb_endp0_in=0;
}

void get_descriptor(void)                    //获取描述符
{
    if(!USB_not_end)
    {
      switch(MSB(Control_Data.DeviceRequest.wValue))//yyyyy
      {
        case DEVICE_DESCRIPTOR:
	         Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 	         Control_Data.pData=(unsigned char *)(&device_descriptor);
             break;
        case CONFIGURATION_DESCRIPTOR:
                 Control_Data.wCount=con_int_endp_descriptor.wTotalLength;
                 Control_Data.pData=(unsigned char *)(&con_int_endp_descriptor);
             break;
        case STRING_DESCRIPTOR:
             if(LSB(Control_Data.DeviceRequest.wValue)==0)//yyyyy
             {
               Control_Data.wCount=LANGUAGE_ID[0];
               Control_Data.pData=(unsigned char *)LANGUAGE_ID;
             }
             if(LSB(Control_Data.DeviceRequest.wValue)==2)
             {
               Control_Data.wCount=device_serial_number[0];
               Control_Data.pData=(unsigned char *)device_serial_number;
             }
             break;
        case REPORT_DESCRIPTOR:
                 Control_Data.wCount=0x0022;
                 Control_Data.pData=(unsigned char *)(&report_descriptor);
             break;
      }
      
      if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
    }

    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_set_addr)USB_not_end=1;
	   else USB_usb_endp0_in=0;
	  return;
	 }
    else
     {
 	  write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
      USB_setup_packet_in=0;
	  USB_usb_endp0_in=0;
	  return;
	 }      
}

void endp0_out(void)                            //终端点0输出中断处理
{
 Flag1.Last_Status_Register=read_last_status(0);
 if(Last_Status_setup_packet)
  {
   Control_Data.wLength=0;
   Control_Data.wCount=0;
   if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
    {
	 set_endpoint_status(0,0);
	 set_endpoint_status(1,0);
	 return;
	}

  ack_setup(0);
  ack_setup(1);
  Control_Data.wLength=Control_Data.DeviceRequest.wLength;
  USB_not_end=0;
  USB_usb_endp0_in=1;
  USB_setup_packet_in=0;
  USB_setup_packet_out=0;
  if(Control_Data.DeviceRequest.bmRequestType&0x80){USB_setup_packet_in=1;return;}
  else {USB_setup_packet_out=1;return;}
 }
 else
  {
   select_endpoint(0);
   clear_buffer();
  }
}

void endp0_in(void)                                        //终端点0输入处理
{
  read_last_status(1);
  if(USB_usb_endp0_in)
  {
    if(USB_setup_packet_in||USB_not_end)
    {
      switch(Control_Data.DeviceRequest.bmRequestType&0x7B)
      {
	   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;
	     }
	   case 1:
	     switch (Control_Data.DeviceRequest.bRequest)
	     {
               case  0: get_status(1);break;
	           case  6: get_descriptor();break;
               case 10: get_interface();break;
               default: break;
           }
       case 2:
	     switch (Control_Data.DeviceRequest.bRequest)
	     {
               case  0: get_status(2);break;
                        default: break;
         }
              default: break;
    }
    return;
    }
    if(USB_setup_packet_out) 
    {
      switch(Control_Data.DeviceRequest.bmRequestType&0x03)
      {
        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;
      }
    }
  }
}

void endp2_out(void)                                                     //主端点输出处理
{
  unsigned char EP2Status;
  read_last_status(4);
  EP2Status = read_endpoint_status(4);
  if(EP2Status & 0x60)
    read_endpoint_buff(4,64,buffer);
  else
    clear_buffer();
}


void endp2_in(void)                                      //主端点输入处理
{
}

/******************************************************************************
**
**  FunctionName: Main.c
**
**  Description:  
******************************************************************************/
main(void)
{

  CLKDIV = 0;
  PLLFBD = 30;

  TRISB = 0xFFF8;
  TRISC = 0xFFF9;
  TRISG = 0xFDFF;
  AD1PCFGL = 0xFFFF;
  AD1PCFGH = 0x0003;
  BUZZER = 1;

  delay(100);
  D12_CS = 0;
  D12_SUSP = 0;
  D12_WR = 1;
  D12_RD = 1;
  libuart2Init();
  disconnect_usb();
  init_usb();
  connect_usb();
  read_interrupt_register();
/*
  write_usb_command(Read_VID);                 // 读芯片ID
  U2_TX_B(read_a_usb_data());                  // 12
  U2_TX_B(read_a_usb_data());                  // 10
*/
  while(1)
  { 
   if(!D12_INT)
    {
  	  
      read_interrupt_register();

      if(Interrupt_control_out_port){endp0_out();continue;}
      if(Interrupt_control_in_port){endp0_in();continue;}
      if(Interrupt_main_out_port){endp2_out();continue;}
      if(Interrupt_main_in_port&&USB_usb_endp2_in){endp2_in();continue;}
      if(Interrupt_bus_reset){usb_bus_reset();continue;}
      if(Interrupt_suspend_change){usb_bus_suspend();continue;}
    }
  }
}
/*-----------------------------------------------------------------------------
               END OF FILE: Usb.c
-----------------------------------------------------------------------------*/

⌨️ 快捷键说明

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