diff --git a/usb.c b/usb.c index 46d5716..236576c 100644 --- a/usb.c +++ b/usb.c @@ -131,8 +131,13 @@ void usbcore_process_setup_pckt(const uint8_t *data, uint16_t size, uint8_t stag SET_TRANSMISSION_POINTER(&devDesc); break; case UD_Configuration: // CONFIGURATION DESCRIPTOR + case UD_OtherSpeedConfiguration: // OTHER SPEED CONFIGURATION DESCRIPTOR DETERMINE_TRANSFER_SIZE(confDescs[desc_index]->wTotalLength); SET_TRANSMISSION_POINTER(confDescs[desc_index]); + + if (desc_type == UD_OtherSpeedConfiguration) { // change bDescriptorType to Other_Speed_Configuration + confDescs[desc_index]->bDescriptorType = UD_OtherSpeedConfiguration; + } break; case UD_String: // STRING DESCRIPTOR DETERMINE_TRANSFER_SIZE(strDescs[desc_index]->bLength); diff --git a/usb_driver.c b/usb_driver.c index 9d1e962..0e50406 100644 --- a/usb_driver.c +++ b/usb_driver.c @@ -123,7 +123,7 @@ void usbdrv_init() { usbdrv_initial_ep0_setup(); usbdrv_power_and_connect(true); - NVIC_SetPriority(USB_IRQn, 0); + NVIC_SetPriority(USB_IRQn, 7); NVIC_EnableIRQ(USB_IRQn); } @@ -237,7 +237,7 @@ void usbdrv_periph_init() { CLEAR_BIT(USBG->GAHBCFG, USB_OTG_GAHBCFG_GINT); // mask all interrupts for now CLEAR_BIT(USBG->GUSBCFG, USB_OTG_GUSBCFG_HNPCAP | USB_OTG_GUSBCFG_SRPCAP); // disable HNP and SRP WRITE_FIELD(USBG->GUSBCFG, USB_OTG_GUSBCFG_TRDT, TRDT_VALUE); // set TRDT according to the RM - // WRITE_FIELD(USBG->GUSBCFG, USB_OTG_GUSBCFG_TOCAL, TOCAL_VALUE); // set TOCAL + //WRITE_FIELD(USBG->GUSBCFG, USB_OTG_GUSBCFG_TOCAL, TOCAL_VALUE); // set TOCAL CLEAR_BIT(USBG->GUSBCFG, USB_OTG_GUSBCFG_FHMOD); // clear Host mode forcing SET_BIT(USBG->GUSBCFG, USB_OTG_GUSBCFG_FDMOD); // force Device mode @@ -258,8 +258,8 @@ void usbdrv_periph_init() { #ifdef USB_HIGH_SPEED // WRITE_FIELD(USBD->DCFG, USB_OTG_DCFG_DSPD, USB_LINESPEED_FULL_SPEED); - // WRITE_FIELD(USBD->DCFG, USB_OTG_DCFG_DSPD, USB_LINESPEED_HIGH_SPEED_ULPI); - WRITE_FIELD(USBD->DCFG, USB_OTG_DCFG_DSPD, USB_LINESPEED_FULL_SPEED_ULPI); + WRITE_FIELD(USBD->DCFG, USB_OTG_DCFG_DSPD, USB_LINESPEED_HIGH_SPEED_ULPI); + //WRITE_FIELD(USBD->DCFG, USB_OTG_DCFG_DSPD, USB_LINESPEED_FULL_SPEED_ULPI); #else WRITE_FIELD(USBD->DCFG, USB_OTG_DCFG_DSPD, USB_LINESPEED_FULL_SPEED); // there's no other possible option #endif @@ -301,10 +301,14 @@ void usbdrv_periph_init() { void usbdrv_power_and_connect(bool en) { if (en) { // ON CLEAR_BIT(USBD->DCTL, USB_OTG_DCTL_SDIS); + #ifndef USB_HIGH_SPEED SET_BIT(USBG->GCCFG, USB_OTG_GCCFG_PWRDWN); // actually, this is power UP + #endif } else { // OFF SET_BIT(USBD->DCTL, USB_OTG_DCTL_SDIS); + #ifndef USB_HIGH_SPEED CLEAR_BIT(USBG->GCCFG, USB_OTG_GCCFG_PWRDWN); + #endif } } @@ -382,9 +386,13 @@ void usbdrv_fetch_endpoint_configuration(uint8_t config_index) { #define USB_RX_FIFO_SETUP_RESERVATION_DWORDS (10) #define USB_MIN_GROSS_TX_FIFO_SIZE (2 * USB_MIN_EP_FIFO_SIZE) -#if defined(USB_STM32F4) && !defined(USB_HIGH_SPEED) +#if defined(USB_STM32F4) +#ifndef USB_HIGH_SPEED #define USB_MIN_GROSS_RX_FIFO_SIZE (2 * USB_MIN_EP_FIFO_SIZE + USB_RX_FIFO_SETUP_RESERVATION_DWORDS * 4) -#elif defined(USB_STM32H7) || defined(USB_HIGH_SPEED) +#else +#define USB_MIN_GROSS_RX_FIFO_SIZE (1024) +#endif +#elif defined(USB_STM32H7) #define USB_MIN_GROSS_RX_FIFO_SIZE (256) #endif