From 891a0b3898fc3ca3b68d24c6c23fafde6655ac8d Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Wed, 23 Dec 2020 20:15:59 -0500 Subject: [PATCH 1/6] NUC123 USB temporarily disable EP3 --- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 7 +++++-- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c index 21148fd4..fd1c2541 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -54,7 +54,7 @@ /* Driver local definitions. */ /*===========================================================================*/ -#define NUC123_USB_HW_ENDPOINTS 8 +#define NUC123_USB_HW_ENDPOINTS 6 #define NUC123_USBD_CFG_OUT (1UL << USBD_CFG_STATE_Pos) #define NUC123_USBD_CFG_IN (2UL << USBD_CFG_STATE_Pos) @@ -352,10 +352,12 @@ static void usb_lld_serve_interrupt(USBDriver* usbp) if (intsts & USBD_INTSTS_EPEVT5_Msk) { /* Clear event flag */ - USBD->INTSTS = (USBD_INTSTS_EPEVT5_Msk); + /* TODO: when the EP5/6 confusion bug is resolved, remove the EP6 mask here */ + USBD->INTSTS = (USBD_INTSTS_EPEVT5_Msk | USBD_INTSTS_EPEVT6_Msk); usb_serve_in_endpoint(2); } +#if 0 if (intsts & USBD_INTSTS_EPEVT6_Msk) { /* Clear event flag */ USBD->INTSTS = (USBD_INTSTS_EPEVT6_Msk); @@ -367,6 +369,7 @@ static void usb_lld_serve_interrupt(USBDriver* usbp) USBD->INTSTS = (USBD_INTSTS_EPEVT7_Msk); usb_serve_in_endpoint(3); } +#endif } } diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h index 14379ae1..586097e6 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.h @@ -35,7 +35,7 @@ * @brief Maximum endpoint address. * @details This value does not include the endpoint 0 which is always present. */ -#define USB_MAX_ENDPOINTS 3 +#define USB_MAX_ENDPOINTS 2 /** * @brief Status stage handling method. From 8854febc0b9cad8eb5c146d68b817e5b0f97781a Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Wed, 23 Dec 2020 20:22:09 -0500 Subject: [PATCH 2/6] NUC123 USB add wakeup callback when ISR detects resume signal --- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c index fd1c2541..43d33b4a 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -300,7 +300,7 @@ static void usb_lld_serve_interrupt(USBDriver* usbp) if (bussts & USBD_ATTR_RESUME_Msk) { /* Enable USB and enable PHY */ USBD->ATTR |= (USBD_ATTR_PHY_EN_Msk | USBD_ATTR_USB_EN_Msk); - + _usb_wakeup(usbp); } } From cee0adf1f83f7a8452f6959515721a932456c187 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Wed, 23 Dec 2020 20:39:33 -0500 Subject: [PATCH 3/6] NUC123 USB DATA0/1 PID bug fix --- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c index 43d33b4a..ecc4d4c7 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -313,8 +313,8 @@ static void usb_lld_serve_interrupt(USBDriver* usbp) HW_IN_EP(0)->CFGP |= USBD_CFGP_CLRRDY_Msk; HW_OUT_EP(0)->CFGP |= USBD_CFGP_CLRRDY_Msk; - _usb_isr_invoke_setup_cb(&USBD1, 0); HW_IN_EP(0)->CFG |= USBD_CFG_DSQ_SYNC_Msk; + _usb_isr_invoke_setup_cb(&USBD1, 0); } /* EP events */ From 021c696cd28e2aa6534903ce79cd95f8748c0b55 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Thu, 24 Dec 2020 14:04:13 -0500 Subject: [PATCH 4/6] NUC123 byte vs word memcopy bug fix --- os/hal/ports/NUMICRO/LLD/USBv1/usb_memcpy.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/usb_memcpy.S b/os/hal/ports/NUMICRO/LLD/USBv1/usb_memcpy.S index c010175d..a52ad10f 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/usb_memcpy.S +++ b/os/hal/ports/NUMICRO/LLD/USBv1/usb_memcpy.S @@ -142,9 +142,9 @@ offset_loop: unaligned: ldr r4, =0x40060000 ldr r5, [r4, #16] - movs r3, #128 - lsls r3, r3, #3 /* USBD_ATTR_BYTEM_Msk */ - orrs r5, r3 + movs r7, #128 + lsls r7, r7, #3 /* USBD_ATTR_BYTEM_Msk */ + orrs r5, r7 str r5, [r4, #16] unaligned_loop_top: From 75cbc0815629bf3bc43e1e6c41509bf8e6b93bce Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Wed, 30 Dec 2020 18:52:58 -0500 Subject: [PATCH 5/6] NUC123 USB driver cleanup --- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c index ecc4d4c7..561a958d 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -211,11 +211,12 @@ static void usb_serve_out_endpoint(uint32_t epn) USBDriver *const usbp = &USBD1; uint32_t mxpld = HW_OUT_EP(epn)->MXPLD; uint32_t rxsize_actual = min(mxpld, usbp->epc[epn]->out_state->rxcnt - usbp->epc[epn]->out_state->rxsize); - usbp->epc[epn]->out_state->rxcnt += rxsize_actual; + usb_memcpy(usbp->epc[epn]->out_state->rxbuf + usbp->epc[epn]->out_state->rxcnt, USBD_SRAM_BASE + (HW_OUT_EP(epn)->BUFSEG), rxsize_actual); + usbp->epc[epn]->out_state->rxcnt += rxsize_actual; if ((rxsize_actual < usbp->epc[epn]->out_maxsize) || (usbp->epc[epn]->out_state->rxcnt >= @@ -407,10 +408,6 @@ void usb_lld_init(void) CLK->CLKDIV = (CLK->CLKDIV & (~CLK_CLKDIV_USB_N_Msk)) | NUC123_CLK_CLKDIV_USB(NUC123_USBD_CLKDIV); - for (uint8_t i = 0; i < NUC123_USB_HW_ENDPOINTS; ++i) { - USBD->EP[i].CFG &= ~USBD_CFG_DSQ_SYNC_Msk; - } - #if NUC123_USB_USE_USB1 /* Driver initialization.*/ usbObjectInit(&USBD1); @@ -495,11 +492,7 @@ void usb_lld_stop(USBDriver* usbp) */ void usb_lld_reset(USBDriver* usbp) { - uint_fast16_t i; sram_free_dword_offset = 1UL; - for (i = 0; i < 0x200; ++i) { - USBD_SRAM_BASE[i] = 0x55; - } USBD->FADDR = 0; /* EP0 initialization.*/ usbp->epc[0] = &ep0config; @@ -800,7 +793,6 @@ void usb_lld_clear_out(USBDriver* usbp, usbep_t ep) void usb_lld_clear_in(USBDriver* usbp, usbep_t ep) { (void)usbp; - HW_IN_EP(ep)->CFG &= ~USBD_CFG_DSQ_SYNC_Msk; HW_IN_EP(ep)->CFGP &= ~USBD_CFGP_SSTALL_Msk; } From 8c16b4ff9e9bf01a329a05b213ea9ad7fa4615d1 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Wed, 30 Dec 2020 18:53:28 -0500 Subject: [PATCH 6/6] NUC123 USB driver potential stability fixes --- os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c index 561a958d..3596cd93 100644 --- a/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c +++ b/os/hal/ports/NUMICRO/LLD/USBv1/hal_usb_lld.c @@ -423,6 +423,7 @@ void usb_lld_init(void) */ void usb_lld_start(USBDriver* usbp) { + uint32_t delay; if (usbp->state == USB_STOP) { /* Enables the peripheral.*/ @@ -437,6 +438,8 @@ void usb_lld_start(USBDriver* usbp) /* Reset procedure enforced on driver start.*/ SYS->IPRSTC2 |= SYS_IPRSTC2_USBD_RST_Msk; + for (delay = 0; delay < 0x800; ++delay) + ; SYS->IPRSTC2 &= ~(SYS_IPRSTC2_USBD_RST_Msk); /* Post reset initialization.*/ @@ -455,6 +458,8 @@ void usb_lld_start(USBDriver* usbp) nvicEnableVector(USBD_IRQn, NUC123_USB_IRQ_PRIORITY); + for (delay = 0; delay < 0x800; ++delay) + ; usb_lld_reset(usbp); }