USB自定义HID设备实现-STM32
该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在
#include "usb_desc.h"
//usb标准设备描述符
const u8 DinkUsbDeviceDescriptor[DINK_USB_SIZ_DEVICE_DESC] = {
USB_DEVICE_DESC_SIZE, //bLength字段 。设备描述符的长度为18(0x12)字节
USB_DEVICE_DESCRIPTOR_TYPE,//bDescriptorType字段 。设备描述符的编号为0x01
WBVAL(0x0200),//bcdUSB字段 。这里设置版本为USB1.1 , 即0x0110 。
0x00, //bDeviceClass字段 。我们不在设备描述符中定义设备类 ,
0x00, //bDeviceSubClass字段 。bDeviceClass字段为0时 , 该字段也为0 。
0x00,//bDeviceProtocol字段 。bDeviceClass字段为0时 , 该字段也为0 。
0x40,//bMaxPacketSize0字段 。端点0的最大包长度 。
WBVAL(0x7777),//idVender字段 。厂商ID号 , 我们这里取0x8888 , 仅供实验用 。
WBVAL(0x8888),//idProduct字段 。产品ID号 , 由于是第一个实验 , 我们这里取0x0001 。。
WBVAL(0x0100),// 设备的版本
0x01, //iManufacturer字段 。厂商字符串的索引值 , 为了方便记忆和管理
0x02, //iProduct字段 。产品字符串的索引值 。刚刚用了1 , 这里就取2吧 。
0x03,//iSerialNumber字段 。设备的序列号字符串索引值 。
0x01//bNumConfigurations字段 。该设备所具有的配置数 。
};
//USB报告描述符的定义
const u8 HID_ReportDescriptor[]=
{
0x06,0xA0,0xFF,//用法页(FFA0h, vendor defined)
0x09, 0x01,//用法(vendor defined)
0xA1, 0x01,//集合(Application)
0x09, 0x02 ,//用法(vendor defined)
0xA1, 0x00,//集合(Physical)
0x06,0xA1,0xFF,//用法页(vendor defined)
//输入报告
0x09, 0x03 ,//用法(vendor defined)
0x09, 0x04,//用法(vendor defined)
0x15, 0x80,//逻辑最小值(0x80 or -128)
0x25, 0x7F,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75, 0x08,//报告长度Report size (8位)
0x95, 0x40,//报告数值(64 fields)
0x81, 0x02,//输入(data, variable, absolute)
//输出报告
0x09, 0x05,//用法(vendor defined)
0x09, 0x06,//用法(vendor defined)
0x15, 0x80,//逻辑最小值(0x80 or -128)
0x25, 0x7F,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75,0x08,//报告长度(8位)
0x95, 0x40,//报告数值(64 fields)
0x91, 0x02,//输出(data, variable, absolute)
0xC0,//集合结束(Physical)
【USB自定义HID设备实现-STM32】0xC0//集合结束(Application)
};
//通过上面的报告描述符的定义 , 我们知道返回的输入报告具有8字节 。
//输出报告也有64字节 。至于这64字节的数据是干什么用的 , 就要由用户
//自己来决定了 。
///////////////////////////报告描述符完毕////////////////////////////
//usb配置描述符
const u8 DinkUsbConfigDescriptor[DINK_USB_SIZ_CONFIG_DESC] = {
/***************配置描述符***********************/
USB_CONFIGUARTION_DESC_SIZE, //bLength字段 。配置描述符的长度为9字节 。
USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType字段 。配置描述符编号为0x02 。
//wTotalLength字段 。配置描述符集合的总长度 ,
//包括配置描述符本身、接口描述符、类描述符、端点描述符等 。
WBVAL(
USB_CONFIGUARTION_DESC_SIZE + //配置描述符
USB_INTERFACE_DESC_SIZE + //接口1描述符
9 + //hid描述符
USB_ENDPOINT_DESC_SIZE + //端点描述符
USB_ENDPOINT_DESC_SIZE //端点描述符
),
0x01,//bNumInterfaces字段 。该配置包含的接口数 , 只有一个接口 。
0x01,//bConfiguration字段 。该配置的值为1 。
0x00,//iConfigurationz字段 , 该配置的字符串索引 。这里没有 , 为0 。
USB_CONFIG_BUS_POWERED , //bmAttributes字段 , 该设备的属性
USB_CONFIG_POWER_MA(500),//bMaxPower字段 , 该设备需要的最大电流量
/*********************第一个接口描述符,hid设备**********************/
USB_INTERFACE_DESC_SIZE,//bLength字段 。接口描述符的长度为9字节 。
USB_INTERFACE_DESCRIPTOR_TYPE,//bDescriptorType字段 。接口描述符的编号为0x04 。
0x00,//bInterfaceNumber字段 。该接口的编号 , 第一个接口 , 编号为0 。
0x00,//bAlternateSetting字段 。该接口的备用编号 , 为0 。
0x02, //bNumEndpoints字段 。非0端点的数目 。该接口有2个批量端点
USB_DEVICE_CLASS_HUMAN_INTERFACE,//bInterfaceClass字段 。该接口所使用的类 。大容量存储设备接口类的代码为0x08 。 ,
0x00, //bInterfaceSubClass字段 。该接口所使用的子类 。在HID1.1协议中 ,
//只规定了一种子类:支持BIOS引导启动的子类 。
//USB键盘、鼠标属于该子类 , 子类代码为0x01 。
推荐阅读
- STM32 JoystickMouse USB游戏杆鼠标的实现
- 电源管理和USB领域的发展,你值得关注?
- 新唐科技发表高效能支持双 USB OTG 与以太网控制器的 NuMicro® M480 系列微控制器
- 意法半导体STM32G0生态系统扩展功能,支持通用微控制器将USB-C用作标准接口
- USB供电技术助力LED照明产品创新
- pd充电协议是什么?什么是USB-PD快充?
- 你知道USB Type-C经常出问题的那些点吗?
- 从Windows 10 1903版本起,微软默认禁用USB驱动器缓存
- 采用USBN9602的数据采集系统设计
- 带USB接口的电子巡更系统的设计