基于STM32F103的USB学习笔记31 - Mass Storage之修改描述符

72 篇文章 39 订阅

例程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
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值