📄 descriptor.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 + -