diff --git a/components/drivers/KConfig b/components/drivers/KConfig index 859e1fe22f611de658ffcb4b7a715aa65c53c372..7c1929b15f0faf3d8c66b82bc4ffa22fd6a0eeb7 100644 --- a/components/drivers/KConfig +++ b/components/drivers/KConfig @@ -166,7 +166,11 @@ menu "Using USB" bool "Enable to use device as winusb device" default n endif - + if RT_USB_DEVICE_MSTORAGE + config RT_USB_MSTORAGE_DISK_NAME + string "msc class disk name" + default "flash0" + endif if RT_USB_DEVICE_HID config RT_USB_DEVICE_HID_KEYBOARD bool "Use to HID device as Keyboard" diff --git a/components/drivers/usb/usbdevice/class/mstorage.c b/components/drivers/usb/usbdevice/class/mstorage.c index 17ea6c23795634bf0949431dd5284d9971d3523e..eeff755e2e244db88f97724e7bf7e0939ed05086 100644 --- a/components/drivers/usb/usbdevice/class/mstorage.c +++ b/components/drivers/usb/usbdevice/class/mstorage.c @@ -116,6 +116,17 @@ static struct usb_qualifier_descriptor dev_qualifier = const static struct umass_descriptor _mass_desc = { +#ifdef RT_USB_DEVICE_COMPOSITE + /* Interface Association Descriptor */ + USB_DESC_LENGTH_IAD, + USB_DESC_TYPE_IAD, + USB_DYNAMIC, + 0x01, + USB_CLASS_MASS_STORAGE, + 0x06, + 0x50, + 0x00, +#endif USB_DESC_LENGTH_INTERFACE, //bLength; USB_DESC_TYPE_INTERFACE, //type; USB_DYNAMIC, //bInterfaceNumber; @@ -1028,7 +1039,13 @@ static struct ufunction_ops ops = _function_disable, RT_NULL, }; - +static rt_err_t _mstorage_descriptor_config(umass_desc_t desc, rt_uint8_t cintf_nr) +{ +#ifdef RT_USB_DEVICE_COMPOSITE + desc->iad_desc.bFirstInterface = cintf_nr; +#endif + return RT_EOK; +} /** * This function will create a mass storage function instance. * @@ -1066,7 +1083,10 @@ ufunction_t rt_usbd_function_mstorage_create(udevice_t device) setting = rt_usbd_altsetting_new(sizeof(struct umass_descriptor)); /* config desc in alternate setting */ - rt_usbd_altsetting_config_descriptor(setting, &_mass_desc, 0); + rt_usbd_altsetting_config_descriptor(setting, &_mass_desc, (rt_off_t)&((umass_desc_t)0)->intf_desc); + + /* configure the msc interface descriptor */ + _mstorage_descriptor_config(setting->desc, intf->intf_num); /* create a bulk out and a bulk in endpoint */ mass_desc = (umass_desc_t)setting->desc; diff --git a/components/drivers/usb/usbdevice/class/mstorage.h b/components/drivers/usb/usbdevice/class/mstorage.h index 0f448a07d552945809ee16026acd91963ede8c66..25068270bdbf0104ed563f52b85c667e80e91d26 100644 --- a/components/drivers/usb/usbdevice/class/mstorage.h +++ b/components/drivers/usb/usbdevice/class/mstorage.h @@ -32,6 +32,9 @@ struct umass_descriptor { +#ifdef RT_USB_DEVICE_COMPOSITE + struct uiad_descriptor iad_desc; +#endif struct uinterface_descriptor intf_desc; struct uendpoint_descriptor ep_out_desc; struct uendpoint_descriptor ep_in_desc;