USB mass storage descriptor (#2330)
* enable msd * modify descriptors for composite device * makefile cleanup * format * define * embiggen fifos * needed that * cleanup too while we're at it * rename endpoints * switchable descriptors * guard the request hook too * don't need this changed yet * cleanup * update ep0 response * cleanup * use the msd hook from chibios * this was wrong * this was covered by other PR * this is also covered * s
This commit is contained in:
parent
990bfe763e
commit
9a3f3f34b2
|
@ -30,12 +30,31 @@ SerialUSBDriver SDU1;
|
||||||
#define USBD1_DATA_AVAILABLE_EP 2
|
#define USBD1_DATA_AVAILABLE_EP 2
|
||||||
#define USBD1_INTERRUPT_REQUEST_EP 3
|
#define USBD1_INTERRUPT_REQUEST_EP 3
|
||||||
|
|
||||||
|
#if HAL_USE_USB_MSD
|
||||||
|
// Descriptor that includes MSD is larger and has an extra interface
|
||||||
|
#define DESCRIPTOR_SIZE 98
|
||||||
|
#define NUM_INTERFACES 3
|
||||||
|
#define USB_MSD_EP_SIZE 64
|
||||||
|
|
||||||
|
#define MSD_IF 0
|
||||||
|
#define CDC_INT_IF 1
|
||||||
|
#define CDC_DATA_IF 2
|
||||||
|
#else
|
||||||
|
// Alternate descriptor is smaller, no MSD
|
||||||
|
#define DESCRIPTOR_SIZE 75
|
||||||
|
#define NUM_INTERFACES 2
|
||||||
|
|
||||||
|
// only two interfaces
|
||||||
|
#define CDC_INT_IF 0
|
||||||
|
#define CDC_DATA_IF 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USB Device Descriptor.
|
* USB Device Descriptor.
|
||||||
*/
|
*/
|
||||||
static const uint8_t vcom_device_descriptor_data[18] = {
|
static const uint8_t vcom_device_descriptor_data[18] = {
|
||||||
USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */
|
USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */
|
||||||
0xEF, /* bDeviceClass (misc). */
|
0xEF, /* bDeviceClass ( misc ). */
|
||||||
0x02, /* bDeviceSubClass. */
|
0x02, /* bDeviceSubClass. */
|
||||||
0x01, /* bDeviceProtocol. */
|
0x01, /* bDeviceProtocol. */
|
||||||
0x40, /* bMaxPacketSize. */
|
0x40, /* bMaxPacketSize. */
|
||||||
|
@ -57,23 +76,44 @@ static const USBDescriptor vcom_device_descriptor = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Configuration Descriptor tree for a CDC.*/
|
/* Configuration Descriptor tree for a CDC.*/
|
||||||
static const uint8_t vcom_configuration_descriptor_data[75] = {
|
static const uint8_t vcom_configuration_descriptor_data[DESCRIPTOR_SIZE] = {
|
||||||
/* Configuration Descriptor.*/
|
/* Configuration Descriptor.*/
|
||||||
USB_DESC_CONFIGURATION(75, /* wTotalLength. */
|
USB_DESC_CONFIGURATION(DESCRIPTOR_SIZE,/* wTotalLength. */
|
||||||
0x02, /* bNumInterfaces. */
|
NUM_INTERFACES,/* bNumInterfaces. */
|
||||||
0x01, /* bConfigurationValue. */
|
0x01, /* bConfigurationValue. */
|
||||||
0, /* iConfiguration. */
|
0, /* iConfiguration. */
|
||||||
0xC0, /* bmAttributes (self powered). */
|
0xC0, /* bmAttributes (self powered). */
|
||||||
100), /* bMaxPower (200mA). */
|
100), /* bMaxPower (200mA). */
|
||||||
/* IAD Descriptor - describes that Interfaces 0 and 1 belong to CDC */
|
#if HAL_USE_USB_MSD
|
||||||
USB_DESC_INTERFACE_ASSOCIATION(0x00, /* bFirstInterface. */
|
USB_DESC_INTERFACE (MSD_IF, /* bInterfaceNumber. */
|
||||||
|
0x00, /* bAlternateSetting. */
|
||||||
|
0x02, /* bNumEndpoints. */
|
||||||
|
0x08, /* bInterfaceClass (mass storage) */
|
||||||
|
0x06, /* bInterfaceSubClass (SCSI
|
||||||
|
transparent storage class). */
|
||||||
|
0x50, /* bInterfaceProtocol (Bulk Only). */
|
||||||
|
0), /* iInterface. */
|
||||||
|
/* Mass Storage Data In Endpoint Descriptor.*/
|
||||||
|
USB_DESC_ENDPOINT (USB_MSD_DATA_EP | 0x80,
|
||||||
|
0x02, /* bmAttributes (Bulk). */
|
||||||
|
64, /* wMaxPacketSize. */
|
||||||
|
0x00), /* bInterval. 1ms */
|
||||||
|
/* Mass Storage Data Out Endpoint Descriptor.*/
|
||||||
|
USB_DESC_ENDPOINT (USB_MSD_DATA_EP,
|
||||||
|
0x02, /* bmAttributes (Bulk). */
|
||||||
|
64, /* wMaxPacketSize. */
|
||||||
|
0x00), /* bInterval. 1ms */
|
||||||
|
#endif // HAL_USE_USB_MSD
|
||||||
|
// CDC
|
||||||
|
/* IAD Descriptor - describes that EP2+3 belong to CDC */
|
||||||
|
USB_DESC_INTERFACE_ASSOCIATION(CDC_INT_IF, /* bFirstInterface. */
|
||||||
0x02, /* bInterfaceCount. */
|
0x02, /* bInterfaceCount. */
|
||||||
0x02, /* bFunctionClass (CDC). */
|
0x02, /* bFunctionClass (CDC). */
|
||||||
0x02, /* bFunctionSubClass. (2) */
|
0x02, /* bFunctionSubClass. (2) */
|
||||||
0x01, /* bFunctionProtocol (1) */
|
0x01, /* bFunctionProtocol (1) */
|
||||||
0), /* iInterface. */
|
2), /* iInterface. */
|
||||||
/* Interface Descriptor.*/
|
/* Interface Descriptor.*/
|
||||||
USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */
|
USB_DESC_INTERFACE (CDC_INT_IF, /* bInterfaceNumber. */
|
||||||
0x00, /* bAlternateSetting. */
|
0x00, /* bAlternateSetting. */
|
||||||
0x01, /* bNumEndpoints. */
|
0x01, /* bNumEndpoints. */
|
||||||
0x02, /* bInterfaceClass (Communications
|
0x02, /* bInterfaceClass (Communications
|
||||||
|
@ -96,7 +136,7 @@ static const uint8_t vcom_configuration_descriptor_data[75] = {
|
||||||
USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management
|
USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management
|
||||||
Functional Descriptor). */
|
Functional Descriptor). */
|
||||||
USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */
|
USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */
|
||||||
USB_DESC_BYTE (0x01), /* bDataInterface. */
|
USB_DESC_BYTE (CDC_DATA_IF), /* bDataInterface. */
|
||||||
/* ACM Functional Descriptor.*/
|
/* ACM Functional Descriptor.*/
|
||||||
USB_DESC_BYTE (4), /* bFunctionLength. */
|
USB_DESC_BYTE (4), /* bFunctionLength. */
|
||||||
USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */
|
USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */
|
||||||
|
@ -108,9 +148,9 @@ static const uint8_t vcom_configuration_descriptor_data[75] = {
|
||||||
USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */
|
USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */
|
||||||
USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union
|
USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union
|
||||||
Functional Descriptor). */
|
Functional Descriptor). */
|
||||||
USB_DESC_BYTE (0x00), /* bMasterInterface (Communication
|
USB_DESC_BYTE (CDC_INT_IF), /* bMasterInterface (Communication
|
||||||
Class Interface). */
|
Class Interface). */
|
||||||
USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class
|
USB_DESC_BYTE (CDC_DATA_IF), /* bSlaveInterface0 (Data Class
|
||||||
Interface). */
|
Interface). */
|
||||||
/* Endpoint 3 Descriptor.*/
|
/* Endpoint 3 Descriptor.*/
|
||||||
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
|
||||||
|
@ -118,7 +158,7 @@ static const uint8_t vcom_configuration_descriptor_data[75] = {
|
||||||
0x0008, /* wMaxPacketSize. */
|
0x0008, /* wMaxPacketSize. */
|
||||||
0xFF), /* bInterval. */
|
0xFF), /* bInterval. */
|
||||||
/* Interface Descriptor.*/
|
/* Interface Descriptor.*/
|
||||||
USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */
|
USB_DESC_INTERFACE (CDC_DATA_IF, /* bInterfaceNumber. */
|
||||||
0x00, /* bAlternateSetting. */
|
0x00, /* bAlternateSetting. */
|
||||||
0x02, /* bNumEndpoints. */
|
0x02, /* bNumEndpoints. */
|
||||||
0x0A, /* bInterfaceClass (Data Class
|
0x0A, /* bInterfaceClass (Data Class
|
||||||
|
@ -251,6 +291,34 @@ static const USBDescriptor *get_descriptor(USBDriver *usbp,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HAL_USE_USB_MSD
|
||||||
|
/**
|
||||||
|
* @brief IN MSD state
|
||||||
|
*/
|
||||||
|
static USBInEndpointState msdInstate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OUT MSD state
|
||||||
|
*/
|
||||||
|
static USBOutEndpointState msdOutstate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSD initialization structure (both IN and OUT).
|
||||||
|
*/
|
||||||
|
static const USBEndpointConfig msdEpConfig = {
|
||||||
|
USB_EP_MODE_TYPE_BULK,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
USB_MSD_EP_SIZE,
|
||||||
|
USB_MSD_EP_SIZE,
|
||||||
|
&msdInstate,
|
||||||
|
&msdOutstate,
|
||||||
|
4,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
#endif //HAL_USE_MSD
|
||||||
|
|
||||||
// IN CDC data state.
|
// IN CDC data state.
|
||||||
static USBInEndpointState cdcDataInstate;
|
static USBInEndpointState cdcDataInstate;
|
||||||
// OUT CDC data state.
|
// OUT CDC data state.
|
||||||
|
@ -298,6 +366,10 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {
|
||||||
/* Enables the endpoints specified into the configuration.
|
/* Enables the endpoints specified into the configuration.
|
||||||
Note, this callback is invoked from an ISR so I-Class functions
|
Note, this callback is invoked from an ISR so I-Class functions
|
||||||
must be used.*/
|
must be used.*/
|
||||||
|
#if HAL_USE_USB_MSD
|
||||||
|
usbInitEndpointI(usbp, USB_MSD_DATA_EP, &msdEpConfig);
|
||||||
|
#endif
|
||||||
|
|
||||||
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &cdcDataEpConfig);
|
usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &cdcDataEpConfig);
|
||||||
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &cdcInterruptEpConfig);
|
usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &cdcInterruptEpConfig);
|
||||||
|
|
||||||
|
@ -344,13 +416,26 @@ static void sof_handler(USBDriver *usbp) {
|
||||||
osalSysUnlockFromISR();
|
osalSysUnlockFromISR();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We need a custom hook to handle both MSD and CDC at the same time
|
||||||
|
static bool hybridRequestHook(USBDriver *usbp) {
|
||||||
|
#if HAL_USE_USB_MSD
|
||||||
|
// Try the MSD driver first
|
||||||
|
if (msd_request_hook(usbp)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif // HAL_USE_USB_MSD
|
||||||
|
|
||||||
|
// if not MSD, it must be serial
|
||||||
|
return sduRequestsHook(usbp);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USB driver configuration.
|
* USB driver configuration.
|
||||||
*/
|
*/
|
||||||
const USBConfig usbcfg = {
|
const USBConfig usbcfg = {
|
||||||
usb_event,
|
usb_event,
|
||||||
get_descriptor,
|
get_descriptor,
|
||||||
sduRequestsHook,
|
hybridRequestHook,
|
||||||
sof_handler
|
sof_handler
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue