31#define USBD1_DATA_REQUEST_EP 2
32#define USBD1_DATA_AVAILABLE_EP 2
33#define USBD1_INTERRUPT_REQUEST_EP 3
37 #define DESCRIPTOR_SIZE 98
38 #define NUM_INTERFACES 3
39 #define USB_MSD_EP_SIZE 64
46 #define DESCRIPTOR_SIZE 75
47 #define NUM_INTERFACES 2
58 USB_DESC_DEVICE (0x0110,
83 USB_DESC_CONFIGURATION(DESCRIPTOR_SIZE,
90 USB_DESC_INTERFACE (MSD_IF,
99 USB_DESC_ENDPOINT (USB_MSD_DATA_EP | 0x80,
104 USB_DESC_ENDPOINT (USB_MSD_DATA_EP,
111 USB_DESC_INTERFACE_ASSOCIATION(CDC_INT_IF,
118 USB_DESC_INTERFACE (CDC_INT_IF,
131 USB_DESC_BYTE (0x24),
132 USB_DESC_BYTE (0x00),
134 USB_DESC_BCD (0x0110),
137 USB_DESC_BYTE (0x24),
138 USB_DESC_BYTE (0x01),
140 USB_DESC_BYTE (0x00),
141 USB_DESC_BYTE (CDC_DATA_IF),
144 USB_DESC_BYTE (0x24),
145 USB_DESC_BYTE (0x02),
147 USB_DESC_BYTE (0x02),
150 USB_DESC_BYTE (0x24),
151 USB_DESC_BYTE (0x06),
153 USB_DESC_BYTE (CDC_INT_IF),
155 USB_DESC_BYTE (CDC_DATA_IF),
158 USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
163 USB_DESC_INTERFACE (CDC_DATA_IF,
174 USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP,
179 USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80,
198 USB_DESC_BYTE(USB_DESCRIPTOR_STRING),
199 USB_DESC_WORD(0x0409)
207 USB_DESC_BYTE(USB_DESCRIPTOR_STRING),
208 'r', 0,
'u', 0,
's', 0,
'E', 0,
'F', 0,
'I', 0,
' ', 0,
'L', 0,
213#ifndef USB_DESCRIPTOR_B_LENGTH
214#define USB_DESCRIPTOR_B_LENGTH (56 + 2)
217#ifndef USB_DESCRIPTOR_STRING_CONTENT
218#define USB_DESCRIPTOR_STRING_CONTENT 'r', 0, 'u', 0, 's', 0, 'E', 0, 'F', 0, 'I', 0, ' ', 0, 'E', 0, \
219 'n', 0, 'g', 0, 'i', 0, 'n', 0, 'e', 0, ' ', 0, 'M', 0, 'a', 0, \
220 'n', 0, 'a', 0, 'g', 0, 'e', 0, 'm', 0, 'e', 0, 'n', 0, 't', 0, \
221 ' ', 0, 'E', 0, 'C', 0, 'U', 0
228 USB_DESC_BYTE(USB_DESCRIPTOR_B_LENGTH),
229 USB_DESC_BYTE(USB_DESCRIPTOR_STRING),
230 USB_DESCRIPTOR_STRING_CONTENT, 0
238 USB_DESC_BYTE(USB_DESCRIPTOR_STRING),
239 '0', 0,
'1', 0,
'2', 0,
'3', 0,
'4', 0,
'5', 0,
'6', 0,
'7', 0,
240 '8', 0,
'9', 0,
'A', 0,
'B', 0,
'C', 0,
'D', 0,
'E', 0,
'F', 0,
241 '0', 0,
'1', 0,
'2', 0,
'3', 0,
'4', 0,
'5', 0,
'6', 0,
'7', 0,
257 return nibble - 0xA +
'A';
271 for (
size_t i = 0; i < bytes; i++) {
272 uint8_t
byte = serialNumber[i];
274 uint8_t lowNibble =
byte & 0xF;
275 uint8_t highNibble =
byte >> 4;
279 dst[4 * i + 2] =
nib2char(lowNibble);
295 case USB_DESCRIPTOR_DEVICE:
297 case USB_DESCRIPTOR_CONFIGURATION:
299 case USB_DESCRIPTOR_STRING:
321 USB_EP_MODE_TYPE_BULK,
340 USB_EP_MODE_TYPE_BULK,
356 USB_EP_MODE_TYPE_INTR,
358 sduInterruptTransmitted,
371static void usb_event(USBDriver *usbp, usbevent_t event) {
373 case USB_EVENT_ADDRESS:
375 case USB_EVENT_CONFIGURED:
382 usbInitEndpointI(usbp, USB_MSD_DATA_EP, &
msdEpConfig);
389 sduConfigureHookI(&
SDU1);
396 chSysUnlockFromISR();
398 case USB_EVENT_RESET:
400 case USB_EVENT_UNCONFIGURED:
402 case USB_EVENT_SUSPEND:
406 sduSuspendHookI(&
SDU1);
408 chSysUnlockFromISR();
410 case USB_EVENT_WAKEUP:
414 sduWakeupHookI(&
SDU1);
416 chSysUnlockFromISR();
418 case USB_EVENT_STALLED:
431 osalSysLockFromISR();
433 osalSysUnlockFromISR();
446 return sduRequestsHook(usbp);
463#if STM32_USB_USE_OTG1
465#elif STM32_USB_USE_OTG2
468 #error Serial over USB needs OTG1 or OTG2 to be enabled
470 .bulk_in = USBD1_DATA_REQUEST_EP,
471 .bulk_out = USBD1_DATA_AVAILABLE_EP,
472 .int_in = USBD1_INTERRUPT_REQUEST_EP
bool msd_request_hook_new(USBDriver *usbp)
void onUsbConnectedNotifyMmcI()
static void usb_event(USBDriver *usbp, usbevent_t event)
static uint8_t vcom_string3[]
static const uint8_t vcom_string0[]
static const uint8_t vcom_configuration_descriptor_data[DESCRIPTOR_SIZE]
static const uint8_t vcom_device_descriptor_data[18]
static bool hybridRequestHook(USBDriver *usbp)
static USBInEndpointState cdcInterruptInstate
static const uint8_t vcom_string2[]
static const USBEndpointConfig msdEpConfig
MSD initialization structure (both IN and OUT).
static USBInEndpointState cdcDataInstate
static const USBDescriptor * get_descriptor(USBDriver *usbp, uint8_t dtype, uint8_t dindex, uint16_t lang)
static void sof_handler(USBDriver *usbp)
static const USBEndpointConfig cdcDataEpConfig
static const USBDescriptor vcom_strings[]
static const USBEndpointConfig cdcInterruptEpConfig
static const uint8_t vcom_string1[]
static USBOutEndpointState msdOutstate
OUT MSD state.
static USBOutEndpointState cdcDataOutstate
static const USBDescriptor vcom_device_descriptor
const SerialUSBConfig serusbcfg
void usbPopulateSerialNumber(const uint8_t *serialNumber, size_t bytes)
static char nib2char(uint8_t nibble)
static USBInEndpointState msdInstate
IN MSD state.
static const USBDescriptor vcom_configuration_descriptor