summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhihong Chen <[email protected]>2024-03-11 16:33:09 +0800
committersakumisu <[email protected]>2024-03-13 19:25:07 +0800
commit4c062d44423e23aee89642eef5653b179d248d70 (patch)
treeac0a5646a0bc7d5141c41eaef15dfc34531a6733
parentbba4b46fa4d680c73f067579f54a13455930856d (diff)
port: HPMicro: update usb_dc_hpm.c
- support usbd_execute_test_mode() API - interrupt should be check dtd active status - update usbd_ep_open() time sequence - change irq return to break Signed-off-by: Zhihong Chen <[email protected]>
-rw-r--r--port/hpm/usb_dc_hpm.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/port/hpm/usb_dc_hpm.c b/port/hpm/usb_dc_hpm.c
index 3533a887..4ed1e6fd 100644
--- a/port/hpm/usb_dc_hpm.c
+++ b/port/hpm/usb_dc_hpm.c
@@ -61,6 +61,11 @@ __WEAK void usb_dc_low_level_deinit(uint8_t busid)
(void)busid;
}
+void usbd_execute_test_mode(uint8_t busid, uint8_t test_mode)
+{
+ usb_set_port_test_mode(g_hpm_udc[busid].handle->regs, test_mode);
+}
+
int usb_dc_init(uint8_t busid)
{
usb_dc_low_level_init(busid);
@@ -141,9 +146,14 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
{
usb_endpoint_config_t tmp_ep_cfg;
usb_device_handle_t *handle = g_hpm_udc[busid].handle;
-
uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress);
+ tmp_ep_cfg.xfer = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
+ tmp_ep_cfg.ep_addr = ep->bEndpointAddress;
+ tmp_ep_cfg.max_packet_size = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
+
+ usb_device_edpt_open(handle, &tmp_ep_cfg);
+
if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) {
g_hpm_udc[busid].out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
g_hpm_udc[busid].out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
@@ -154,11 +164,6 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
g_hpm_udc[busid].in_ep[ep_idx].ep_enable = true;
}
- tmp_ep_cfg.xfer = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
- tmp_ep_cfg.ep_addr = ep->bEndpointAddress;
- tmp_ep_cfg.max_packet_size = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
-
- usb_device_edpt_open(handle, &tmp_ep_cfg);
return 0;
}
@@ -174,6 +179,7 @@ int usbd_ep_close(uint8_t busid, const uint8_t ep)
}
usb_device_edpt_close(handle, ep);
+
return 0;
}
@@ -248,6 +254,7 @@ void USBD_IRQHandler(uint8_t busid)
uint32_t int_status;
usb_device_handle_t *handle = g_hpm_udc[busid].handle;
uint32_t transfer_len;
+ bool ep_cb_req;
/* Acknowledge handled interrupt */
int_status = usb_device_status_flags(handle);
@@ -303,13 +310,18 @@ void USBD_IRQHandler(uint8_t busid)
for (uint8_t ep_idx = 0; ep_idx < USB_SOS_DCD_MAX_QHD_COUNT; ep_idx++) {
if (edpt_complete & (1 << ep_idx2bit(ep_idx))) {
transfer_len = 0;
+ ep_cb_req = true;
/* Failed QTD also get ENDPTCOMPLETE set */
dcd_qtd_t *p_qtd = usb_device_qtd_get(handle, ep_idx);
while (1) {
if (p_qtd->halted || p_qtd->xact_err || p_qtd->buffer_err) {
USB_LOG_ERR("usbd transfer error!\r\n");
- return;
+ ep_cb_req = false;
+ break;
+ } else if (p_qtd->active) {
+ ep_cb_req = false;
+ break;
} else {
transfer_len += p_qtd->expected_bytes - p_qtd->total_bytes;
}
@@ -321,11 +333,13 @@ void USBD_IRQHandler(uint8_t busid)
}
}
- uint8_t const ep_addr = (ep_idx / 2) | ((ep_idx & 0x01) ? 0x80 : 0);
- if (ep_addr & 0x80) {
- usbd_event_ep_in_complete_handler(busid, ep_addr, transfer_len);
- } else {
- usbd_event_ep_out_complete_handler(busid, ep_addr, transfer_len);
+ if (ep_cb_req) {
+ uint8_t const ep_addr = (ep_idx / 2) | ((ep_idx & 0x01) ? 0x80 : 0);
+ if (ep_addr & 0x80) {
+ usbd_event_ep_in_complete_handler(busid, ep_addr, transfer_len);
+ } else {
+ usbd_event_ep_out_complete_handler(busid, ep_addr, transfer_len);
+ }
}
}
}