From ce046a209392f467ddf2d97633e5a3de952f0bfd Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Fri, 25 Feb 2022 23:04:56 +0800 Subject: [PATCH] update musb driver --- port/musb/usb_dc_musb.c | 49 ++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/port/musb/usb_dc_musb.c b/port/musb/usb_dc_musb.c index a1e27b3b..8b193cd2 100644 --- a/port/musb/usb_dc_musb.c +++ b/port/musb/usb_dc_musb.c @@ -22,6 +22,7 @@ #define HWREGB(x) \ (*((volatile uint8_t *)(x))) +#define USB_CSRL0_BASE (&USB->CSRL0) #define USB_TXCSRLx_BASE(ep_idx) (&USB->TXCSRL1 + 0x10 * (ep_idx - 1)) #define USB_RXCSRLx_BASE(ep_idx) (&USB->RXCSRL1 + 0x10 * (ep_idx - 1)) #define USB_TXCSRHx_BASE(ep_idx) (&USB->TXCSRH1 + 0x10 * (ep_idx - 1)) @@ -55,7 +56,6 @@ struct usb_dc_config_priv { volatile uint8_t dev_addr; volatile uint32_t fifo_size_offset; struct usb_setup_packet setup; - uint8_t *ep0_buffer; struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ } usb_dc_cfg; @@ -66,7 +66,7 @@ static void usb_musb_data_ack(uint8_t ep_idx, bool bIsLastPacket) { if (ep_idx == 0) { // Clear RxPktRdy, and optionally DataEnd, on endpoint zero. - USB->CSRL0 = USB_CSRL0_RXRDYC | (bIsLastPacket ? USB_CSRL0_DATAEND : 0); + HWREGB(USB_CSRL0_BASE) = USB_CSRL0_RXRDYC | (bIsLastPacket ? USB_CSRL0_DATAEND : 0); } else { // Clear RxPktRdy on all other endpoints. HWREGB(USB_RXCSRLx_BASE(ep_idx)) &= ~(USB_RXCSRL1_RXRDY); @@ -76,7 +76,7 @@ static void usb_musb_data_ack(uint8_t ep_idx, bool bIsLastPacket) static void usb_musb_data_send(uint8_t ep_idx, bool bIsLastPacket) { if (ep_idx == 0) { - USB->CSRL0 = USB_CSRL0_TXRDY | (bIsLastPacket ? USB_CSRL0_DATAEND : 0); + HWREGB(USB_CSRL0_BASE) = USB_CSRL0_TXRDY | (bIsLastPacket ? USB_CSRL0_DATAEND : 0); } else { HWREGB(USB_TXCSRLx_BASE(ep_idx)) = USB_TXCSRL1_TXRDY; } @@ -331,13 +331,13 @@ int usbd_ep_set_stall(const uint8_t ep) if (USB_EP_DIR_IS_OUT(ep)) { if (ep_idx == 0x00) { - USB->CSRL0 |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC); + HWREGB(USB_CSRL0_BASE) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC); } else { HWREGB(USB_RXCSRLx_BASE(ep_idx)) |= USB_RXCSRL1_STALL; } } else { if (ep_idx == 0x00) { - USB->CSRL0 |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC); + HWREGB(USB_CSRL0_BASE) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC); } else { HWREGB(USB_TXCSRLx_BASE(ep_idx)) |= USB_TXCSRL1_STALL; } @@ -352,7 +352,7 @@ int usbd_ep_clear_stall(const uint8_t ep) if (USB_EP_DIR_IS_OUT(ep)) { if (ep_idx == 0x00) { - USB->CSRL0 &= ~USB_CSRL0_STALLED; + HWREGB(USB_CSRL0_BASE) &= ~USB_CSRL0_STALLED; } else { // Clear the stall on an OUT endpoint. HWREGB(USB_RXCSRLx_BASE(ep_idx)) &= ~(USB_RXCSRL1_STALL | USB_RXCSRL1_STALLED); @@ -361,7 +361,7 @@ int usbd_ep_clear_stall(const uint8_t ep) } } else { if (ep_idx == 0x00) { - USB->CSRL0 &= ~USB_CSRL0_STALLED; + HWREGB(USB_CSRL0_BASE) &= ~USB_CSRL0_STALLED; } else { // Clear the stall on an IN endpoint. HWREGB(USB_TXCSRLx_BASE(ep_idx)) &= ~(USB_TXCSRL1_STALL | USB_TXCSRL1_STALLED); @@ -388,8 +388,8 @@ int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint } if (ep_idx == 0x00) { - while (USB->CSRL0 & USB_CSRL0_TXRDY) { - if (USB->CSRL0 & USB_CSRL0_ERROR) { + while (HWREGB(USB_CSRL0_BASE) & USB_CSRL0_TXRDY) { + if (HWREGB(USB_CSRL0_BASE) & USB_CSRL0_ERROR) { return -2; } if (!(timeout--)) { @@ -410,11 +410,7 @@ int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint if (!data_len) { if (ep_idx == 0x00) { usb_ep0_state = USB_EP0_STATE_IN_STATUS; - if (usb_dc_cfg.setup.bRequest == 0x22) { - usb_musb_data_ack(ep_idx, false); - } else { - usb_musb_data_ack(ep_idx, true); - } + usb_musb_data_ack(ep_idx, true); } else { usb_musb_data_send(ep_idx, true); } @@ -431,13 +427,11 @@ int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint if (ep_idx == 0) { usb_ep0_state = USB_EP0_STATE_IN_DATA; } - usb_musb_data_send(ep_idx, false); } else { if (ep_idx == 0) { usb_ep0_state = USB_EP0_STATE_OUT_STATUS; } - usb_musb_data_send(ep_idx, true); } if (ret_bytes) { @@ -459,17 +453,17 @@ int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_ if (!max_data_len) { if (ep_idx != 0x00) { - usb_musb_data_ack(ep_idx, true); + usb_musb_data_ack(ep_idx, false); } return 0; } if (ep_idx == 0x00) { + read_count = USB->COUNT0; + usb_musb_read_packet(0, data, read_count); if (usb_ep0_state == USB_EP0_STATE_SETUP) { - memcpy(data, (uint8_t *)&usb_dc_cfg.setup, 8); - } else if (usb_ep0_state == USB_EP0_STATE_OUT_DATA) { - read_count = USB->COUNT0; - usb_musb_read_packet(0, data, read_count); + memcpy((uint8_t *)&usb_dc_cfg.setup, data, 8); + usb_musb_data_ack(0, false); } } else { read_count = HWREGH(USB_RXCOUNTx_BASE(ep_idx)); @@ -486,29 +480,24 @@ int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_ static void handle_ep0(void) { - uint8_t ep0_status = USB->CSRL0; + uint8_t ep0_status = HWREGB(USB_CSRL0_BASE); uint8_t req = usb_dc_cfg.setup.bmRequestType; if (ep0_status & USB_CSRL0_STALLED) { - USB->CSRL0 &= ~USB_CSRL0_STALLED; + HWREGB(USB_CSRL0_BASE) &= ~USB_CSRL0_STALLED; return; } if (ep0_status & USB_CSRL0_SETEND) { - USB->CSRL0 = USB_CSRL0_SETENDC; + HWREGB(USB_CSRL0_BASE) = USB_CSRL0_SETENDC; } switch (usb_ep0_state) { case USB_EP0_STATE_SETUP: { if (ep0_status & USB_CSRL0_RXRDY) { - uint8_t read_count = USB->COUNT0; - usb_musb_read_packet(0, (uint8_t *)&usb_dc_cfg.setup, read_count); - usb_musb_data_ack(0, false); - + usbd_event_notify_handler(USBD_EVENT_SETUP_NOTIFY, NULL); if (usb_dc_cfg.setup.wLength && !(usb_dc_cfg.setup.bmRequestType & 0x80)) { usb_ep0_state = USB_EP0_STATE_OUT_DATA; - } else { - usbd_event_notify_handler(USBD_EVENT_SETUP_NOTIFY, NULL); } } } break;