例程Mass Storage使用的是SCSI子类下的Bulk-Only传输协议。基于HID例程修改,主要的描述符依然由设备描述符、配置描述符和字符串描述符组成。
1. 修改设备描述符:
修改PID和VID即可,子类在配置描述符中的接口描述符中指定。
0x83, /*idVendor (0x0483)*/
0x04,
0x20, /*idProduct = 0x5710*/
0x57,
2. 修改配置描述符
基本不需要修改,也是1个接口。即配置描述符数组的前9个字节不需要修改。
3. 修改接口描述符
改为2个端点;接口类为0x08,即Mass Storage类;子类值为0x06,表示SCSI指令集;子类协议值为0x50, 表示Bulk Only;接口描述符对应的字符串描述符的Index为4.
/************** Descriptor of MSC interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
USB_INTERFACE_NUM, /*bInterfaceNumber: Number of Interface*/
USB_ALTERNATE_SETTING, /*bAlternateSetting: Alternate setting*/
0x02, /*bNumEndpoints*/
0x08, /*bInterfaceClass: MASS STORAGE Class*/
0x06, /* bInterfaceSubClass : SCSI transparent*/
0x50, /* nInterfaceProtocol */
4, /* iInterface: */
4. 修改端点描述符
2个端点,分别为IN和OUT,最大包大小都为64字节,端点类型为0x02,即Bulk。
/******************** Descriptor of endpoint ********************/
/* 18 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
0x81, /*bEndpointAddress: Endpoint Address (IN)*/
0x02, /*bmAttributes: Bulk endpoint*/
0x40, /*wMaxPacketSize: 64 Byte max */
0x00,
0x00, /*bInterval: Polling Interval (0 ms)*/
/* 34 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
0x02, /*bEndpointAddress: Endpoint Address (IN)*/
0x02, /*bmAttributes: Bulk endpoint*/
0x40, /*wMaxPacketSize: 64 Byte max */
0x00,
0x00, /*bInterval: Polling Interval (0 ms)*/
5. 修改字符串描述符
修改产品字符串描述符
改为“STM32F Mass Storage”,长度变为36字节。
const uint8_t usbDeviceStringProduct[USB_DEVICE_STRING_PRODUCT] =
{
USB_DEVICE_STRING_PRODUCT, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'M', 0,
'a', 0, 's', 0, 's', 0, 'S', 0, 't', 0, 'o', 0, 'r', 0,
'a', 0, 'g', 0, 'e', 0
};
修改Serial Number。
增加一个接口的字符串描述符对应接口描述符中的iInterface = 4.
const uint8_t usbDeviceStringInterface[USB_DEVICE_STRING_INTERFACE_LEN] =
{
USB_DEVICE_STRING_INTERFACE_LEN,
0x03,
/* Interface 0: "ST Mass" */
'S', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0
};