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

📄 descriptor.c

📁 vC++读写HID_USB设备,包含hid_usb的固件程序和上位机程序
💻 C
字号:
#include "mytype.h"
#include "descriptor.h"

#ifndef _swap_data_
#define _swap_data_

#define SWAP16(x)  ((((uint16)(x))<<8)|(((uint16)(x))>>8))		//高低字节交换
#define LSB(x) ((uint8)(x))			//取一个整数的低字节 
#define MSB(x) ((uint8)(((uint16)(x))>>8))		//取一个整数的高字节

#endif

code DEVICE_DESCRIPTOR_STRUCT device_descriptor =     //设备描述符
{
	sizeof(DEVICE_DESCRIPTOR_STRUCT),                   //设备描述符的字节数大小
	USB_DEVICE_DESCRIPTOR,								//设备描述符类型编号
	SWAP16(0x0110),                                     //USB版本号,USB1.1
	0x00,                                               //USB分配的设备类代码
	0x00,                                               //USB分配的子类代码
	0x00,                                               //USB分配的设备协议代码
	0x10,                                               //端点0的最大包大小
	SWAP16(0x0925),                                     //厂商编号VID,这里只是作为测试用,请使用自己的VID
	SWAP16(0x1299),                                     //产品编号PID,这里只是作为测试用,请使用自己的PID
	SWAP16(0x0001),                                     //设备出厂编号
	0x01,                                               //设备厂商字符串的索引
	0x02,                                               //描述产品字符串的索引
	0x03,                                               //描述设备序列号字符串的索引
	0x01                                                //可能的配置数量
};

code USB_DESCRIPTOR_STRUCT usb_descriptor =
{
	//配置描述符
	{
		sizeof(CONFIGURATION_DESCRIPTOR_STRUCT),						//配置描述符的字节数大小
		USB_CONFIGURATION_DESCRIPTOR,									//配置描述符类型编号
		SWAP16(sizeof(USB_DESCRIPTOR_STRUCT)),
		0x01,															//只包含一个接口
		0x01,															//该配置的编号
		0x00,															//iConfiguration字段
		0xA0,															//采用总线供电,支持远程唤醒
		0xC8                                                            //从总线获取最大电流400mA
	},
	//接口描述符
	{
		sizeof(INTERFACE_DESCRIPTOR_STRUCT),                             //接口描述符的字节数大小
		USB_INTERFACE_DESCRIPTOR,                                            //接口描述符类型编号
		0x00,                                                            //接口编号为0
		0x00,                                                            //该接口描述符的编号
		ENDPOINT_NUMBER,                                                 //非0端点数量为2,只使用端点主端点输入和输出
		0x03,                                                            //人机接口设备(HID)类
		0x00,                                                            //使用的子类
		0x00,                                                            //使用的协议
		0x00                                                             //接口描述符字符串索引
	},
	//HID描述符
	{
		sizeof(HID_DESCRIPTOR_STRUCT),                                   //HID描述符的字节数大小
		USB_HID_DESCRIPTOR,                                                  //HID描述符类型编号
		SWAP16(0x0101),                                                  //HID类协议版本号,为1.1
		0x00,                                                            //固件的国家地区代号
		NUM_SUB_DESCRIPTORS,                                             //下级描述符的数量
		{
			{
				USB_REPORT_DESCRIPTOR,                                             //下级描述符为报告描述符
				SWAP16(sizeof(HidUseReportDescriptor))                       //下级描述符的长度
			}
		},
	},  
	//端点描述符
	{
		//端点1输出
		{                                                                //主端点输入描述
			sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
			USB_ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
			POINT_1_OUT,                                                  //端点号,主输入端点
			USB_ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
			SWAP16(0x0010),                                                 //该端点支持的最大包尺寸,64字节
			0x0A                                                            //中断扫描时间:设置为10ms
		},
		//端点1输入
  		{                                                                //主端点输出描述
			sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
			USB_ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
			POINT_1_IN,                                                 //端点号,主输出端点
			USB_ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
			SWAP16(0x0010),                                                 //该端点支持的最大包尺寸,64字节
			0x0A                                                            //中断扫描时间:设置为10ms
		},
	}
};

//字符串描述符所用的语言种类 
code uint8 LANGUAGE_ID[4]={0x04,0x03,0x09,0x04};                   

//设备序列号										
code uint8 device_serial_number[]=
{22,USB_STRING_DESCRIPTOR,'2',0,'0',0,'0',0,'7',0,'-',0,'0',0,'3',0,'-',0,'2',0,'4',0};

//生产厂商字符串
code uint8 ManufacturerString[80]=
{
	30,
	USB_STRING_DESCRIPTOR,
	0xD9,0x8F,  /*这*/
	0x2F,0x66,  /*是*/
	0x00,0x4E,  /*一*/
	0x2A,0x4E,  /*个*/
	'H',0,
	'I',0,
	'D',0,
	0x7B,0x7C,  /*类*/
	0xBE,0x8B,  /*设*/
	0x07,0x59,  /*备*/
	0x94,0x5E,  /*应*/
	0x28,0x75,  /*用*/
	0x03,0x83,  /*范*/
	0x8B,0x4F,  /*例*/
};

//产品描述符字符串
code uint8 ProducterString[96]=
{
	30,
	USB_STRING_DESCRIPTOR,
	0xD9,0x8F,  /*这*/
	0x2F,0x66,  /*是*/
	0x00,0x4E,  /*一*/
	0x2A,0x4E,  /*个*/
	'H',0,
	'I',0,
	'D',0,
	0x7B,0x7C,  /*类*/
	0xBE,0x8B,  /*设*/
	0x07,0x59,  /*备*/
	0x94,0x5E,  /*应*/
	0x28,0x75,  /*用*/
	0x03,0x83,  /*范*/
	0x8B,0x4F,  /*例*/	
};

⌨️ 快捷键说明

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