#include "project.h" #define USB_DM GPIO11 #define USB_DM_PORT GPIOA #define USB_DP GPIO12 #define USB_DP_PORT GPIOA /* Buffer to be used for control requests. */ uint8_t usbd_control_buffer[128]; usbd_device *usb_device; static const struct usb_device_descriptor dev = { .bLength = USB_DT_DEVICE_SIZE, .bDescriptorType = USB_DT_DEVICE, .bcdUSB = 0x0200, .bDeviceClass = 0xef, .bDeviceSubClass = 0x02, .bDeviceProtocol = 0x01, .bMaxPacketSize0 = 64, .idVendor = 0x0483, .idProduct = 0xff03, .bcdDevice = 0x0200, .iManufacturer = 1, .iProduct = 2, .iSerialNumber = 3, .bNumConfigurations = 1, }; static const struct usb_interface ifaces[] = { { .num_altsetting = 1, .altsetting = &dummy_kb_iface, .iface_assoc = &dummy_kb_iface_assoc, }, { .num_altsetting = 1, .altsetting = &dfu_iface, .iface_assoc = &dfu_iface_assoc, }, { .num_altsetting = 1, .altsetting = &comm_iface, .iface_assoc = &cdc_iface_assoc, }, { .num_altsetting = 1, .altsetting = &data_iface, }, }; static const struct usb_config_descriptor config = { .bLength = USB_DT_CONFIGURATION_SIZE, .bDescriptorType = USB_DT_CONFIGURATION, .wTotalLength = 0, .bNumInterfaces = 4, .bConfigurationValue = 1, .iConfiguration = 0, .bmAttributes = 0x80, .bMaxPower = 0x32, .interface = ifaces, }; #define N_USB_STRINGS (sizeof(usb_strings)/sizeof(usb_strings[0])) static const char *usb_strings[] = { VENDOR_NAME, /*1*/ PRODUCT_NAME, /*2*/ SERIAL_NUMBER, /*3*/ "dummy device", /*4*/ "Dfu iface", /*5*/ "Clock iface", /*6*/ }; void otg_fs_isr (void) { usbd_poll (usb_device); } static enum usbd_request_return_codes control_request (usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, usbd_control_complete_callback *complete) { enum usbd_request_return_codes ret; ret = dfu_control_request (usbd_dev, req, buf, len, complete); if (ret != USBD_REQ_NEXT_CALLBACK) return ret; ret = cdcacm_control_request (usbd_dev, req, buf, len, complete); if (ret != USBD_REQ_NEXT_CALLBACK) return ret; return USBD_REQ_NOTSUPP; } static void set_config (usbd_device *usbd_dev, uint16_t wValue) { cdcacm_set_config (usbd_dev, wValue); usbd_register_control_callback (usbd_dev, USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, control_request); } void usb_init (void) { MAP_AF_100 (USB_DP, GPIO_AF10); MAP_AF_100 (USB_DM, GPIO_AF10); usb_device = usbd_init (&otgfs_usb_driver, &dev, &config, usb_strings, N_USB_STRINGS, usbd_control_buffer, sizeof (usbd_control_buffer)); /* Disable VBUS sensing */ OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS; OTG_FS_GCCFG &= ~OTG_GCCFG_VBUSASEN; OTG_FS_GCCFG &= ~OTG_GCCFG_VBUSBSEN; usbd_register_set_config_callback (usb_device, set_config); nvic_enable_irq (NVIC_OTG_FS_IRQ); }