37 #ifdef HAL_USB_PRODUCT_ID 45 #define USBD1_DATA_REQUEST_EP 1 46 #define USBD1_DATA_AVAILABLE_EP 1 47 #define USBD1_INTERRUPT_REQUEST_EP 2 52 static const uint8_t vcom_device_descriptor_data[18] = {
71 static const USBDescriptor vcom_device_descriptor = {
72 sizeof vcom_device_descriptor_data,
73 vcom_device_descriptor_data
77 static const uint8_t vcom_configuration_descriptor_data[67] = {
79 USB_DESC_CONFIGURATION(67,
86 USB_DESC_INTERFACE (0x00,
100 USB_DESC_BYTE (0x00),
102 USB_DESC_BCD (0x0110),
105 USB_DESC_BYTE (0x24),
106 USB_DESC_BYTE (0x01),
108 USB_DESC_BYTE (0x00),
109 USB_DESC_BYTE (0x01),
112 USB_DESC_BYTE (0x24),
113 USB_DESC_BYTE (0x02),
115 USB_DESC_BYTE (0x02),
118 USB_DESC_BYTE (0x24),
119 USB_DESC_BYTE (0x06),
121 USB_DESC_BYTE (0x00),
123 USB_DESC_BYTE (0x01),
126 USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80,
131 USB_DESC_INTERFACE (0x01,
142 USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP,
147 USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80,
156 static const USBDescriptor vcom_configuration_descriptor = {
157 sizeof vcom_configuration_descriptor_data,
158 vcom_configuration_descriptor_data
164 static const uint8_t vcom_string0[] = {
167 USB_DESC_WORD(0x0409)
174 static USBDescriptor vcom_strings[] = {
175 {
sizeof vcom_string0, vcom_string0},
184 #define UDID_START 0x1FFF7A10 190 static char *string_substitute(
const char *str)
192 uint8_t new_len = strlen(str);
193 if (strstr(str,
"%BOARD%")) {
196 if (strstr(str,
"%SERIAL%")) {
199 char *str2 =
malloc(new_len+1);
204 if (strcmp(str,
"%BOARD%") == 0) {
210 if (strcmp(str,
"%SERIAL%") == 0) {
211 const char *hex =
"0123456789ABCDEF";
212 const uint8_t *cpu_id = (
const uint8_t *)
UDID_START;
214 for (i=0; i<12; i++) {
215 *p++ = hex[(cpu_id[i]>>4)&0xF];
216 *p++ = hex[cpu_id[i]&0xF];
232 static void setup_usb_string(USBDescriptor *desc,
const char *str)
234 char *str2 = string_substitute(str);
235 uint8_t len = strlen(str2);
236 desc->ud_size = 2+2*len;
237 uint8_t *b = (uint8_t *)
calloc(1, desc->ud_size);
238 desc->ud_string = (
const uint8_t *)b;
239 b[0] = USB_DESC_BYTE(desc->ud_size);
242 for (i=0; i<len; i++) {
256 setup_usb_string(&vcom_strings[1], HAL_USB_STRING_MANUFACTURER);
257 setup_usb_string(&vcom_strings[2], HAL_USB_STRING_PRODUCT);
258 setup_usb_string(&vcom_strings[3], HAL_USB_STRING_SERIAL);
265 static const USBDescriptor *get_descriptor(USBDriver *usbp,
273 case USB_DESCRIPTOR_DEVICE:
274 return &vcom_device_descriptor;
275 case USB_DESCRIPTOR_CONFIGURATION:
276 return &vcom_configuration_descriptor;
279 return &vcom_strings[dindex];
288 static USBInEndpointState ep1instate;
293 static USBOutEndpointState ep1outstate;
298 static const USBEndpointConfig ep1config = {
299 USB_EP_MODE_TYPE_BULK,
314 static USBInEndpointState ep2instate;
319 static const USBEndpointConfig ep2config = {
320 USB_EP_MODE_TYPE_INTR,
322 sduInterruptTransmitted,
335 static void usb_event(USBDriver *usbp, usbevent_t event) {
336 extern SerialUSBDriver SDU1;
339 case USB_EVENT_ADDRESS:
341 case USB_EVENT_CONFIGURED:
347 usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config);
348 usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config);
351 sduConfigureHookI(&SDU1);
353 chSysUnlockFromISR();
355 case USB_EVENT_RESET:
357 case USB_EVENT_UNCONFIGURED:
359 case USB_EVENT_SUSPEND:
363 sduSuspendHookI(&SDU1);
365 chSysUnlockFromISR();
367 case USB_EVENT_WAKEUP:
371 sduWakeupHookI(&SDU1);
373 chSysUnlockFromISR();
375 case USB_EVENT_STALLED:
384 static void sof_handler(USBDriver *usbp) {
388 osalSysLockFromISR();
390 osalSysUnlockFromISR();
396 const USBConfig usbcfg = {
406 const SerialUSBConfig serusbcfg = {
408 USBD1_DATA_REQUEST_EP,
409 USBD1_DATA_AVAILABLE_EP,
410 USBD1_INTERRUPT_REQUEST_EP
413 #endif // HAL_USB_PRODUCT_ID
void * calloc(size_t nmemb, size_t size)
void * malloc(size_t size)
#define USB_DESCRIPTOR_STRING(len)
void setup_usb_strings(void)