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

📄 usbkeyboard.c

📁 基于51的usb键盘程序源码设计
💻 C
📖 第 1 页 / 共 3 页
字号:
	write_usb_command(0xf3);
	write_a_usb_data(0x0e);
	write_a_usb_data(0x47);
	delay(100);
}
/******************************************************************************/

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

/***************************初始化USB***************************************************/
void init_usb(void)               
{
	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 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)
	{
		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;
	}      
}
/******************************************************************************/

/*********************发到接口的获取描述符**************************************/
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(KeyBoardReportDescriptor));
				Control_Data.pData=(uint8 *)(KeyBoardReportDescriptor);
				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;
					

⌨️ 快捷键说明

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