summaryrefslogtreecommitdiff
path: root/components/drivers/usb
diff options
context:
space:
mode:
authorMiraculousConch <[email protected]>2017-11-29 18:33:09 +0800
committerMiraculousConch <[email protected]>2017-11-29 18:33:09 +0800
commitb5e8fa08720874ce38bfad8a62027cb3af27fc6f (patch)
tree7ded160d69900795b85679fd1fd3a5c721f0ba80 /components/drivers/usb
parentcdf2af5c102ccaf6b82fd538fb58ee8c759f61ce (diff)
[Components][Drivers][USB]Add IAD support for MSC class
Diffstat (limited to 'components/drivers/usb')
-rw-r--r--components/drivers/usb/usbdevice/class/mstorage.c24
-rw-r--r--components/drivers/usb/usbdevice/class/mstorage.h3
2 files changed, 25 insertions, 2 deletions
diff --git a/components/drivers/usb/usbdevice/class/mstorage.c b/components/drivers/usb/usbdevice/class/mstorage.c
index 17ea6c2379..eeff755e2e 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 0f448a07d5..25068270bd 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;