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

📄 usbkeyboard.c

📁 51+pdiusbd12做的usb键盘
💻 C
📖 第 1 页 / 共 3 页
字号:
 Prints("USBD12芯片初始化",1);
 set_usb_addr(0);
 set_endpoint_enable();
}
/******************************************************************************/

/****************************USB总线复位处理***********************************/
void usb_bus_reset(void)
{
 Prints("USB总线复位................................",1);
 usb_flags.Register=0;
 set_endpoint_enable();
}
/******************************************************************************/

/*****************************USB总线挂起处理**********************************/
void usb_bus_suspend(void)
{
 Prints("USB总线挂起................................",1);
}
/******************************************************************************/

/***************************设置地址***************************************/




















/*void set_usb_address(void)
{
 usb_flags.flags.set_addr=1;
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 set_usb_addr(Control_Data.DeviceRequest.wValue);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}*/

void set_usb_address(void)
{
 /*usb_flags.flags.set_addr=1;
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 set_usb_addr(Control_Data.DeviceRequest.wValue);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;*/
usb_flags.flags.set_addr=1;
set_usb_addr(Control_Data.DeviceRequest.wValue);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
while(select_endpoint(1)&0x01);
//set_usb_addr(Control_Data.DeviceRequest.wValue);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;

}
/******************************************************************************/






























/**************************获取状态响应*****************************************/
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;
   }
  write_endpoint_buff(1,2,status);
  usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/*********************清除特性*******************************************/
void clear_feature(uint8 receiver)    
{
 Prints("    清除特性................................",1);
 receiver=0;
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/*******************设置特性**************************************************/
void set_feature(uint8 receiver)
{
 Prints("    设置特性................................",1);
 receiver=0;
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/*****************************设置描述*****************************************/
void set_descriptor(void)
{
 Prints("    设置描述符................................",1);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/***************************设置配置*******************************************/
void set_configuration(void)
{
 Prints("    设置配置................................",1);
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/************************获取配置状态******************************************/
void get_configuration(void)
{ 
 uint8 value=0x01;
 Prints("    获取配置................................",1);
 write_endpoint_buff(1,1,&value);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/****************************设置接口************************************/
void set_interface(void)
{
 Prints("    设置接口................................",1);
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/***************************获取接口状态***************************************/
void get_interface(void)
{
 uint8 value=0x01;
 Prints("    获取接口................................",1);
 write_endpoint_buff(1,1,&value);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/***********************获取描述符*********************************************/
void get_descriptor(void)
{
 Prints("    获取描述符................................",1);
  if(!usb_flags.flags.not_end)
     {
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case DEVICE_DESCRIPTOR:
		     Prints("        获取设备描述符................................",1);
	         Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 	         Control_Data.pData=(uint8 *)(&device_descriptor);
             break;
        case CONFIGURATION_DESCRIPTOR:
			 Prints("        获取配置描述符................................",1);
             Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
			 Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
             //if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
             break;
		case STRING_DESCRIPTOR:
		     Prints("        获取字符串描述符................................",1);
			 switch(LSB(Control_Data.DeviceRequest.wValue))
			  {
			   case 0:
			    Prints("            获取语言ID................................",1);
			    Control_Data.wCount=LANGUAGE_ID[0];
                Control_Data.pData=LANGUAGE_ID;
   			    break;

			   case 1:
			    Prints("            获取厂商字符串................................",1);
			    Control_Data.wCount=ManufacturerString[0];
                Control_Data.pData=ManufacturerString;
			    break;

			   case 2:
			    Prints("            获取产品字符串................................",1);
			    Control_Data.wCount=ProducterString[0];
                Control_Data.pData=ProducterString;
			    break;

			   case 3:
                 Prints("            获取设备序列号................................",1);
			     Control_Data.wCount=device_serial_number[0];
			     Control_Data.pData=device_serial_number;
			   break;

			   default: break;
			  }
			 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)
     {
	//Prints("发送前16个字节...................",0);
	  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
     {
	Prints("发送剩余的描述符字节...................",0);
	  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;
	 }      
}
/******************************************************************************/

/*********************发到接口的获取描述符**************************************/
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;*/            //重复,可以不要,在传配置描述符的时候一起将hid描述符给传了上去
        case REPORT_DESCRIPTOR:
			 Prints("        获取报告描述符................................",1);
             Control_Data.wCount=sizeof(KeyBoardReportDescriptor);//SWAP16(sizeof(KeyBoardReportDescriptor));
			 Control_Data.pData=(uint8 *)(KeyBoardReportDescriptor);
			 //Prints("比较报告描述符的长度!\n",1);
			 //Prints("Control_Data.wCount的长度为:             \n",1);
			 //PrintLongInt(SWAP16(Control_Data.wCount));	
			 //Prints("Control_Data.wLength的长度为:             \n",1);
			 //PrintLongInt(Control_Data.wLength);	
             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输入端点
//	Prints("返回的报告描述符的长度为:",0);
//	PrintLongInt(Control_Data.wCount);
    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);             //清除中断标志的同时又记录的具体中断到MCU
if(Last_Status.Status.prestatus_not_read)
	{
	Prints("第一个状态处理之前来了第二个状态...........",1);
	} 
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);       //注意,在端点停止后再接到setup包时端点自动开启,不需要在
	 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);     //setup事务处理的第三个阶段,这个阶段是设备向主机发送应答,这样
  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      //{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}
  {
	Prints("第一个包不是setup包...........",1);
   
	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;

⌨️ 快捷键说明

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