STM32的CustomHID的各描述符介绍

俗话说的好,看协议手册,不如看源代码来的好! 在USB的工程中,USB的各描述符定义在usb_desc.c文件里面,这里就将USB的各描述符定义代码贴上来,各个数值的意义都已经详细注释。当然很细节的东西看不懂还是建议去看手册去!!!

/* USB标准设备描述符*/ const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] = { 0x12, /*bLength:长度,设备描述符的长度为18字节*/ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType:类型,设备描述符的编号是0x01*/ 0x00, /*bcdUSB:所使用的USB版本为2.0*/ 0x02, 0x00, /*bDeviceClass:设备所使用的类代码*/ 0x00, /*bDeviceSubClass:设备所使用的子类代码*/ 0x00, /*bDeviceProtocol:设备所使用的协议*/ 0x40, /*bMaxPacketSize:最大包长度为64字节*/ 0x83, /*idVendor:厂商ID为0x0483*/ 0x04, 0x50, /*idProduct:产品ID为0x5704*/ 0x57, 0x00, /*bcdDevice:设备的版本号为2.00*/ 0x02, 1, /*iManufacturer:厂商字符串的索引*/ 2, /*iProduct:产品字符串的索引*/ 3, /*iSerialNumber:设备的序列号字符串索引*/ 0x01 /*bNumConfiguration:设备有1种配置*/ }; /* CustomHID设备描述符 */ /* USB配置描述符集合(配置、接口、端点、类、厂商)(Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] = { 0x09, /*bLength:长度,设备字符串的长度为9字节*/ USB_CONFIGURATION_DESCRIPTOR_TYPE, /*bDescriptorType:类型,配置描述符的类型编号为0x2*/ CUSTOMHID_SIZ_CONFIG_DESC, /*wTotalLength:配置描述符的总长度为41字节*/ 0x00, 0x01, /*bNumInterfaces:配置所支持的接口数量1个*/ 0x01, /*bConfigurationValue:该配置的值*/ 0x00, /*iConfiguration:该配置的字符串的索引值,该值为0表示没有字符串*/ 0xC0, /* bmAttributes:设备的一些特性,0xc0表示自供电,不支持远程唤醒 D7:保留必须为1,D6:是否自供电,D5:是否支持远程唤醒,D4~D0:保留设置为0*/ // 0x32, /*从总线上获得的最大电流为100mA */ 0x96, /*MaxPower:设备需要从总线上获取多少电流,单位为2mA,0x96表示300mA*/ /************** HID接口描述符****************/ 0x09, /*bLength:长度,接口描述符的长度为9字节 */ USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType:接口描述符的类型为0x4 */ 0x00, /*bInterfaceNumber:该接口的编号*/ 0x00, /*bAlternateSetting:该接口的备用编号 */ 0x02, /*bNumEndpoints:该接口所使用的端点数*/ 0x03, /*bInterfaceClass该接口所使用的类为HID*/ 0x00, /*bInterfaceSubClass:该接口所用的子类 1=BOOT, 0=no boot */ 0x00, /*nInterfaceProtocol :该接口使用的协议0=none, 1=keyboard, 2=mouse */ 0, /*iInterface: 该接口字符串的索引 */ /*****************HID描述符 ********************/ 0x09, /*bLength: HID描述符的长度为9字节 */ HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID的描述符类型为0x21 */ 0x10, /*bcdHID: HID协议的版本为1.1 */ 0x01, 0x00, /*bCountryCode: 国家代号 */ 0x01, /*bNumDescriptors: 下级描述符的数量*/ 0x22, /*bDescriptorType:下级描述符的类型*/ CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: 下一集描述符的长度*/ 0x00, /********************输入端点描述符******************/ 0x07, /* bLength: 端点描述符的长度为7字节*/ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: 端点描述符的类型为0x21*/ 0x82, /* bEndpointAddress: 该端点(输入)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/ 0x03, /* bmAttributes: 端点的属性为为中断端点. D0~D1表示传输类型:0(控制传输),1(等时传输),2(批量传输),3(中断传输) 非等时传输端点:D2~D7:保留为0 等时传输端点: D2~D3表示同步的类型:0(无同步),1(异步),2(适配),3(同步) D4~D5表示用途:0(数据端点),1(反馈端点),2(暗含反馈的数据端点),3(保留),D6~D7:保留,*/ 0x40, /* wMaxPacketSize: 该端点支持的最大包长度为64字节*/ 0x00, 0x02, /* bInterval: 轮询间隔(2 ms) */ /********************输出端点描述符******************/ 0x07, /* 端点描述符的长度为7字节 */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: 端点描述符的类型为0x21*/ 0x01, /* bEndpointAddress: 该端点(输出)的地址,D7:0(OUT),1(IN),D6~D4:保留,D3~D0:端点号*/ 0x03, /* bmAttributes: 端点的属性为为中断端点 */ 0x40, /* wMaxPacketSize: 该端点支持的最大包长度为64字节 */ 0x00, 0x02, /* bInterval: 轮询间隔(2 ms) */ }; /* HID的报告描述符*/ const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = { 0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 0x09, 0x01, /* USAGE (Demo Kit) */ 0xa1, 0x01, /* COLLECTION (Application) */ // 输入报告 0x09,0x03, // USAGE ID - Vendor defined 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8bit) 0x95,0x40, // REPORT_COUNT (64Byte) 0x81,0x02, // INPUT (Data,Var,Abs) // 输出报告 0x09,0x04, // USAGE ID - Vendor defined 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8bit) 0x95,0x40, // REPORT_COUNT (64Byte) 0x91,0x02, // OUTPUT (Data,Var,Abs) 0xc0 /* END_COLLECTION */ }; /* 语言ID描述符 */ const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] = { CUSTOMHID_SIZ_STRING_LANGID, /*bLength:本描述符的长度为4字节*/ USB_STRING_DESCRIPTOR_TYPE, /*bDescriptorType:字符串描述符的类型为0x03*/ 0x09, /*bString:语言ID为0x0409,表示美式英语*/ 0x04 }; /* LangID = 0x0409: U.S. English*/ /*厂商字符串描述符*/ const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] = { CUSTOMHID_SIZ_STRING_VENDOR, /*bLength:厂商字符串描述符的长度*/ USB_STRING_DESCRIPTOR_TYPE, /*bDescriptorType:字符串描述符的类型为0x03*/ 'M', 0, 'y', 0, 'U', 0,'S', 0,'B', 0, '_', 0, 'H', 0,'I',0,'D',0 /*自定义*/ }; /*产品的字符串描述符*/ const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] = { CUSTOMHID_SIZ_STRING_PRODUCT, /* bLength:产品的字符串描述符*/ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType:字符串描述符的类型为0x03*/ 'B', 0, 'y', 0, ' ', 0, 'v', 0, 'i', 0, 'e', 0,'w',0,'t',0,'o',0,'o',0,'l',0/*自定义*/ }; /*产品序列号的字符串描述符*/ uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] = { CUSTOMHID_SIZ_STRING_SERIAL, /* bLength:产品序列号*/ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType:字符串描述符的类型为0x03*/ 'x', 0, 'x', 0, 'x', 0,'x', 0,'x', 0, 'x', 0, 'x', 0 /*自定义*/ };

usb_desc.c文件中涉及到的一些宏定义都在usb_desc.h中有定义,如下

#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 //设备描述符类型 #define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 //配置描述符类型 #define USB_STRING_DESCRIPTOR_TYPE 0x03 //字符串描述符类型 #define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 //接口描述符类型 #define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 //端点描述符类型 #define HID_DESCRIPTOR_TYPE 0x21 //HID描述符类型 #define CUSTOMHID_SIZ_HID_DESC 0x09 //HID描述符的长度 #define CUSTOMHID_OFF_HID_DESC 0x12 //HID描述符在配置描述符集合数组中的偏移 #define CUSTOMHID_SIZ_DEVICE_DESC 18 //设备描述符的长度 #define CUSTOMHID_SIZ_CONFIG_DESC 41 //配置描述符的长度 #define CUSTOMHID_SIZ_REPORT_DESC 33 //报告描述符的的长度 #define CUSTOMHID_SIZ_STRING_LANGID 4 //语言ID字符串描述符的长度 #define CUSTOMHID_SIZ_STRING_VENDOR 20 //厂商字符串描述符的长度 #define CUSTOMHID_SIZ_STRING_PRODUCT 24 //产品字符串描述符的长度 #define CUSTOMHID_SIZ_STRING_SERIAL 26 //序列号字符串描述符的长度 #define STANDARD_ENDPOINT_DESC_SIZE 0x09 #define REPORT_COUNT 64 //端点长度 /* Exported functions ------------------------------------------------------- */ extern const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC]; //设备描述符 extern const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC]; //配置描述符 extern const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC]; //报告描述符 extern const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID]; //语言ID字符串描述符 extern const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]; //厂商字符串描述符 extern const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT]; //产品字符串描述符 extern uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL]; //序列号字符串描述符

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stm32f407是意法半导体(STMicroelectronics)推出的一款强大的ARM Cortex-M4微控制器系列。Custom HID是指自定义人机接口设备(Human Interface Device),它是基于USB接口的一种通信协议。下面是关于stm32f407 custom hid的回答: stm32f407 custom hid是将stm32f407微控制器应用于自定义的HID设备开发中。通过使用stm32f407的丰富外设和强大计算能力,我们可以实现各种自定义的HID设备功能,例如游戏手柄、键盘、鼠标、音频设备等。 stm32f407的主要特点是具有高性能、低功耗和丰富的外设接口。它具有一个ARM Cortex-M4内核,最高主频可以达到168MHz,支持硬件浮点运算,使其能够处理复杂的数据操作。此外,stm32f407还具有大容量的Flash存储器和SRAM,可以存储和处理大量数据。 stm32f407还提供了多种外设接口,包括USB、SPI、I2C、UART等。通过USB接口,我们可以将stm32f407配置为HID设备,以便与计算机或其他设备进行通信。通过自定义HID协议,我们可以定义设备的输入和输出报告格式,实现特定的功能需求。 在进行stm32f407 custom hid开发时,首先需要熟悉stm32f407的硬件特性和外设接口,了解USB和HID协议的相关知识。其次,需要使用适当的开发工具和软件库,如STCubeMX和HAL库,来配置和编程stm32f407。通过编写相应的固件代码,我们可以实现自定义的HID设备功能。 总之,stm32f407 custom hid可以满足各种自定义HID设备的开发需求。通过充分利用stm32f407的性能和外设接口,我们可以实现高性能、低功耗的自定义HID设备,并与计算机或其他设备进行可靠的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值