summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2023-04-20 15:12:11 +0800
committersakumisu <[email protected]>2023-04-20 15:12:38 +0800
commit53fe0f2cd510a4f1a21da5a1a241cedce89fa4c5 (patch)
tree7edfc5fb9149c0657f1d14512ef2433c57c464c3
parent2bac9326481f3b1ef8fac4bea35abf447abf2250 (diff)
update ehci iso struct and api
-rw-r--r--port/ehci/usb_ehci_priv.h22
-rw-r--r--port/ehci/usb_hc_ehci.c64
-rw-r--r--port/ehci/usb_hc_ehci.h5
3 files changed, 46 insertions, 45 deletions
diff --git a/port/ehci/usb_ehci_priv.h b/port/ehci/usb_ehci_priv.h
index 66b6a4f6..6390c270 100644
--- a/port/ehci/usb_ehci_priv.h
+++ b/port/ehci/usb_ehci_priv.h
@@ -27,10 +27,9 @@
#error Unsupported frame size list size
#endif
-#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM
-#define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USBHOST_PIPE_NUM * 3)
-#define CONFIG_USB_EHCI_ITD_NUM 10
-#define CONFIG_USB_EHCI_ITD_POOL_NUM 2
+#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM
+#define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USBHOST_PIPE_NUM * 3)
+#define CONFIG_USB_EHCI_ITD_NUM 20
extern uint8_t usbh_get_port_speed(const uint8_t port);
@@ -52,11 +51,10 @@ struct ehci_pipe {
struct usbh_hubport *hport;
struct ehci_qh_hw *qh;
struct usbh_urb *urb;
- uint8_t used_itd_num;
- uint8_t id;
uint8_t mf_unmask;
uint8_t mf_valid;
- usb_slist_t iso_list;
+ uint8_t iso_packet_idx;
+ uint8_t remain_itd_num;
};
struct ehci_qh_hw {
@@ -71,21 +69,23 @@ struct ehci_qtd_hw {
struct ehci_itd_hw {
struct ehci_itd hw;
+ struct usbh_urb *urb;
+ struct ehci_pipe *pipe;
+ uint16_t start_frame;
+ usb_slist_t list;
} __attribute__((aligned(32)));
struct ehci_hcd {
bool ehci_qh_used[CONFIG_USB_EHCI_QH_NUM];
bool ehci_qtd_used[CONFIG_USB_EHCI_QTD_NUM];
- bool ehci_itd_pool_used[CONFIG_USB_EHCI_ITD_POOL_NUM];
+ bool ehci_itd_used[CONFIG_USB_EHCI_ITD_NUM];
struct ehci_pipe pipe_pool[CONFIG_USB_EHCI_QH_NUM];
};
extern struct ehci_hcd g_ehci_hcd;
extern uint32_t g_framelist[];
-int ehci_itd_pool_alloc(void);
-void ehci_itd_pool_free(uint8_t id);
-int ehci_iso_pipe_init(struct ehci_pipe *pipe, struct usbh_iso_frame_packet *iso_packet, uint32_t num_of_iso_packets);
+int ehci_iso_pipe_init(struct ehci_pipe *pipe, struct usbh_urb *urb);
void ehci_remove_itd_urb(struct usbh_urb *urb);
void ehci_scan_isochronous_list(void);
diff --git a/port/ehci/usb_hc_ehci.c b/port/ehci/usb_hc_ehci.c
index 79e5e851..fad79606 100644
--- a/port/ehci/usb_hc_ehci.c
+++ b/port/ehci/usb_hc_ehci.c
@@ -994,27 +994,23 @@ int usbh_pipe_alloc(usbh_pipe_t *pipe, const struct usbh_endpoint_cfg *ep_cfg)
ppipe->dev_addr = ep_cfg->hport->dev_addr;
ppipe->hport = ep_cfg->hport;
- // if ((ppipe->speed == USB_SPEED_HIGH) && (ppipe->ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS)) {
- // if (ep_cfg->ep_interval == 0x01) { /* transfer interval 1 mf */
- // ppipe->mf_unmask = 0xff;
- // ppipe->mf_valid = 8;
- // } else if (ep_cfg->ep_interval == 0x02) { /* transfer interval 2 mf */
- // ppipe->mf_unmask = 0x55;
- // ppipe->mf_valid = 4;
- // } else if (ep_cfg->ep_interval == 0x03) { /* transfer interval 4 mf */
- // ppipe->mf_unmask = 0x44;
- // ppipe->mf_valid = 2;
- // } else if (ep_cfg->ep_interval == 0x04) { /* transfer interval 8 mf */
- // ppipe->mf_unmask = 0x01;
- // ppipe->mf_valid = 1;
- // }
-
- // ppipe->id = ehci_itd_pool_alloc();
- // if (ppipe->id == -1) {
- // printf("fail to alloc itd pool\r\n");
- // return -1;
- // }
- // }
+#ifdef CONFIG_USB_EHCI_ISO
+ if ((ppipe->speed == USB_SPEED_HIGH) && (ppipe->ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS)) {
+ if (ep_cfg->ep_interval == 0x01) { /* transfer interval 1 mf */
+ ppipe->mf_unmask = 0xff;
+ ppipe->mf_valid = 8;
+ } else if (ep_cfg->ep_interval == 0x02) { /* transfer interval 2 mf */
+ ppipe->mf_unmask = 0x55;
+ ppipe->mf_valid = 4;
+ } else if (ep_cfg->ep_interval == 0x03) { /* transfer interval 4 mf */
+ ppipe->mf_unmask = 0x44;
+ ppipe->mf_valid = 2;
+ } else if (ep_cfg->ep_interval == 0x04) { /* transfer interval 8 mf */
+ ppipe->mf_unmask = 0x01;
+ ppipe->mf_valid = 1;
+ }
+ }
+#endif
/* restore variable */
ppipe->inuse = true;
ppipe->waitsem = waitsem;
@@ -1042,11 +1038,7 @@ int usbh_pipe_free(usbh_pipe_t pipe)
}
flags = usb_osal_enter_critical_section();
-
ehci_pipe_free(ppipe);
- // if (ppipe->ep_type == 0x01) {
- // ehci_itd_pool_free(ppipe->id);
- // }
usb_osal_leave_critical_section(flags);
return 0;
}
@@ -1072,7 +1064,7 @@ int usbh_submit_urb(struct usbh_urb *urb)
return -ENODEV;
}
- if (pipe->urb) {
+ if (pipe->urb && (pipe->ep_type != USB_ENDPOINT_TYPE_ISOCHRONOUS)) {
return -EBUSY;
}
@@ -1109,7 +1101,9 @@ int usbh_submit_urb(struct usbh_urb *urb)
}
break;
case USB_ENDPOINT_TYPE_ISOCHRONOUS:
- //ehci_iso_pipe_init(pipe, urb->iso_packet, urb->num_of_iso_packets);
+#ifdef CONFIG_USB_EHCI_ISO
+ ehci_iso_pipe_init(pipe, urb);
+#endif
break;
default:
break;
@@ -1173,7 +1167,9 @@ int usbh_kill_urb(struct usbh_urb *urb)
qh = EHCI_ADDR2QH(qh->hw.hlp);
}
} else {
- //ehci_remove_itd_urb(urb);
+#ifdef CONFIG_USB_EHCI_ISO
+ ehci_remove_itd_urb(urb);
+#endif
}
EHCI_HCOR->usbcmd |= (EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN);
@@ -1230,13 +1226,17 @@ void USBH_IRQHandler(void)
if (usbsts & EHCI_USBSTS_INT) {
ehci_scan_async_list();
ehci_scan_periodic_list();
- //ehci_scan_isochronous_list();
+#ifdef CONFIG_USB_EHCI_ISO
+ ehci_scan_isochronous_list();
+#endif
}
if (usbsts & EHCI_USBSTS_ERR) {
ehci_scan_async_list();
ehci_scan_periodic_list();
- //ehci_scan_isochronous_list();
+#ifdef CONFIG_USB_EHCI_ISO
+ ehci_scan_isochronous_list();
+#endif
}
if (usbsts & EHCI_USBSTS_PCD) {
@@ -1263,8 +1263,8 @@ void USBH_IRQHandler(void)
for (uint8_t index = 0; index < CONFIG_USB_EHCI_QTD_NUM; index++) {
g_ehci_hcd.ehci_qtd_used[index] = false;
}
- for (uint8_t index = 0; index < CONFIG_USB_EHCI_ITD_POOL_NUM; index++) {
- g_ehci_hcd.ehci_itd_pool_used[index] = false;
+ for (uint8_t index = 0; index < CONFIG_USB_EHCI_ITD_NUM; index++) {
+ g_ehci_hcd.ehci_itd_used[index] = false;
}
}
usbh_roothub_thread_wakeup(port + 1);
diff --git a/port/ehci/usb_hc_ehci.h b/port/ehci/usb_hc_ehci.h
index dfe3575b..d240765f 100644
--- a/port/ehci/usb_hc_ehci.h
+++ b/port/ehci/usb_hc_ehci.h
@@ -1,6 +1,7 @@
/*
- * Copyright (c) 2022, sakumisu
- *
+ * Copyright 2020 The Apache Software Foundation
+ * Copyright 2022 sakumisu
+ *
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef USB_HC_EHCI_H