mirror of
https://github.com/sakumisu/CherryUSB.git
synced 2025-05-09 00:21:44 +08:00
enum device with disposable thread, do not block hub thread
This commit is contained in:
parent
0d916af297
commit
7574063e94
@ -437,6 +437,21 @@ static void usbh_hubport_release(struct usbh_hubport *child)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void usbh_hubport_enumerate_thread(void *argument)
|
||||||
|
{
|
||||||
|
struct usbh_hubport *child = (struct usbh_hubport *)argument;
|
||||||
|
|
||||||
|
/* Configure EP0 with the default maximum packet size */
|
||||||
|
usbh_hport_activate_ep0(child);
|
||||||
|
|
||||||
|
if (usbh_enumerate(child) < 0) {
|
||||||
|
/** release child sources */
|
||||||
|
usbh_hubport_release(child);
|
||||||
|
USB_LOG_ERR("Port %u enumerate fail\r\n", child->port);
|
||||||
|
}
|
||||||
|
usb_osal_thread_delete(child->thread);
|
||||||
|
}
|
||||||
|
|
||||||
static void usbh_hub_events(struct usbh_hub *hub)
|
static void usbh_hub_events(struct usbh_hub *hub)
|
||||||
{
|
{
|
||||||
struct usbh_hubport *child;
|
struct usbh_hubport *child;
|
||||||
@ -597,14 +612,8 @@ static void usbh_hub_events(struct usbh_hub *hub)
|
|||||||
|
|
||||||
USB_LOG_INFO("New %s device on Hub %u, Port %u connected\r\n", speed_table[speed], hub->index, port + 1);
|
USB_LOG_INFO("New %s device on Hub %u, Port %u connected\r\n", speed_table[speed], hub->index, port + 1);
|
||||||
|
|
||||||
/* Configure EP0 with the default maximum packet size */
|
/* create disposable thread to enumerate device on current hport, do not block hub thread */
|
||||||
usbh_hport_activate_ep0(child);
|
child->thread = usb_osal_thread_create("usbh_enum", CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO + 1, usbh_hubport_enumerate_thread, (void *)child);
|
||||||
|
|
||||||
if (usbh_enumerate(child) < 0) {
|
|
||||||
/** release child sources */
|
|
||||||
usbh_hubport_release(child);
|
|
||||||
USB_LOG_ERR("Port %u enumerate fail\r\n", port + 1);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
child = &hub->child[port];
|
child = &hub->child[port];
|
||||||
/** release child sources */
|
/** release child sources */
|
||||||
|
@ -152,6 +152,7 @@ struct usbh_hubport {
|
|||||||
#ifdef CONFIG_USBHOST_XHCI
|
#ifdef CONFIG_USBHOST_XHCI
|
||||||
uint32_t protocol; /* port protocol, for xhci, some ports are USB2.0, others are USB3.0 */
|
uint32_t protocol; /* port protocol, for xhci, some ports are USB2.0, others are USB3.0 */
|
||||||
#endif
|
#endif
|
||||||
|
usb_osal_thread_t thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct usbh_hub {
|
struct usbh_hub {
|
||||||
|
@ -15,7 +15,11 @@ typedef void *usb_osal_mutex_t;
|
|||||||
typedef void *usb_osal_mq_t;
|
typedef void *usb_osal_mq_t;
|
||||||
typedef void (*usb_thread_entry_t)(void *argument);
|
typedef void (*usb_thread_entry_t)(void *argument);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Task with smaller priority value indicates higher task priority
|
||||||
|
*/
|
||||||
usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args);
|
usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args);
|
||||||
|
void usb_osal_thread_delete(usb_osal_thread_t thread);
|
||||||
|
|
||||||
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count);
|
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count);
|
||||||
void usb_osal_sem_delete(usb_osal_sem_t sem);
|
void usb_osal_sem_delete(usb_osal_sem_t sem);
|
||||||
|
@ -14,10 +14,15 @@ usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size,
|
|||||||
{
|
{
|
||||||
TaskHandle_t htask = NULL;
|
TaskHandle_t htask = NULL;
|
||||||
stack_size /= sizeof(StackType_t);
|
stack_size /= sizeof(StackType_t);
|
||||||
xTaskCreate(entry, name, stack_size, args, prio, &htask);
|
xTaskCreate(entry, name, stack_size, args, configMAX_PRIORITIES - 1 - prio, &htask);
|
||||||
return (usb_osal_thread_t)htask;
|
return (usb_osal_thread_t)htask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usb_osal_thread_delete(usb_osal_thread_t thread)
|
||||||
|
{
|
||||||
|
vTaskDelete(thread);
|
||||||
|
}
|
||||||
|
|
||||||
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
|
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
|
||||||
{
|
{
|
||||||
return (usb_osal_sem_t)xSemaphoreCreateCounting(1, initial_count);
|
return (usb_osal_sem_t)xSemaphoreCreateCounting(1, initial_count);
|
||||||
|
@ -16,6 +16,11 @@ usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size,
|
|||||||
return (usb_osal_thread_t)htask;
|
return (usb_osal_thread_t)htask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usb_osal_thread_delete(usb_osal_thread_t thread)
|
||||||
|
{
|
||||||
|
rt_thread_delete(thread);
|
||||||
|
}
|
||||||
|
|
||||||
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
|
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
|
||||||
{
|
{
|
||||||
return (usb_osal_sem_t)rt_sem_create("usbh_sem", initial_count, RT_IPC_FLAG_FIFO);
|
return (usb_osal_sem_t)rt_sem_create("usbh_sem", initial_count, RT_IPC_FLAG_FIFO);
|
||||||
|
@ -17,6 +17,11 @@ usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size,
|
|||||||
return task_handle;
|
return task_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usb_osal_thread_delete(usb_osal_thread_t thread)
|
||||||
|
{
|
||||||
|
aos_task_exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
|
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
|
||||||
{
|
{
|
||||||
aos_sem_t sem = NULL;
|
aos_sem_t sem = NULL;
|
||||||
|
@ -1218,15 +1218,6 @@ void USBH_IRQHandler(void)
|
|||||||
}
|
}
|
||||||
if (gint_status & USB_OTG_GINTSTS_DISCINT) {
|
if (gint_status & USB_OTG_GINTSTS_DISCINT) {
|
||||||
g_dwc2_hcd.port_csc = 1;
|
g_dwc2_hcd.port_csc = 1;
|
||||||
for (uint8_t index = 0; index < CONFIG_USBHOST_PIPE_NUM; index++) {
|
|
||||||
struct dwc2_pipe *chan = &g_dwc2_hcd.pipe_pool[index];
|
|
||||||
struct usbh_urb *urb = chan->urb;
|
|
||||||
if (chan->waiter) {
|
|
||||||
chan->waiter = false;
|
|
||||||
urb->errorcode = -ESHUTDOWN;
|
|
||||||
usb_osal_sem_give(chan->waitsem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
usbh_roothub_thread_wakeup(1);
|
usbh_roothub_thread_wakeup(1);
|
||||||
|
|
||||||
USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_DISCINT;
|
USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_DISCINT;
|
||||||
|
@ -1177,6 +1177,12 @@ int usbh_kill_urb(struct usbh_urb *urb)
|
|||||||
pipe->qh = NULL;
|
pipe->qh = NULL;
|
||||||
pipe->urb = NULL;
|
pipe->urb = NULL;
|
||||||
|
|
||||||
|
if (pipe->waiter) {
|
||||||
|
pipe->waiter = false;
|
||||||
|
urb->errorcode = -ESHUTDOWN;
|
||||||
|
usb_osal_sem_give(pipe->waitsem);
|
||||||
|
}
|
||||||
|
|
||||||
usb_osal_leave_critical_section(flags);
|
usb_osal_leave_critical_section(flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1246,17 +1252,6 @@ void USBH_IRQHandler(void)
|
|||||||
if (portsc & EHCI_PORTSC_CSC) {
|
if (portsc & EHCI_PORTSC_CSC) {
|
||||||
if ((portsc & EHCI_PORTSC_CCS) == EHCI_PORTSC_CCS) {
|
if ((portsc & EHCI_PORTSC_CCS) == EHCI_PORTSC_CCS) {
|
||||||
} else {
|
} else {
|
||||||
for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) {
|
|
||||||
struct ehci_pipe *pipe = &g_ehci_hcd.pipe_pool[index];
|
|
||||||
struct usbh_urb *urb = pipe->urb;
|
|
||||||
|
|
||||||
if (pipe->waiter) {
|
|
||||||
pipe->waiter = false;
|
|
||||||
urb->errorcode = -ESHUTDOWN;
|
|
||||||
usb_osal_sem_give(pipe->waitsem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) {
|
for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) {
|
||||||
g_ehci_hcd.ehci_qh_used[index] = false;
|
g_ehci_hcd.ehci_qh_used[index] = false;
|
||||||
}
|
}
|
||||||
|
@ -906,17 +906,6 @@ void USBH_IRQHandler(void)
|
|||||||
g_musb_hcd.port_csc = 1;
|
g_musb_hcd.port_csc = 1;
|
||||||
g_musb_hcd.port_pec = 1;
|
g_musb_hcd.port_pec = 1;
|
||||||
g_musb_hcd.port_pe = 0;
|
g_musb_hcd.port_pe = 0;
|
||||||
for (uint8_t index = 0; index < CONFIG_USBHOST_PIPE_NUM; index++) {
|
|
||||||
for (uint8_t j = 0; j < 2; j++) {
|
|
||||||
struct musb_pipe *pipe = &g_musb_hcd.pipe_pool[index][j];
|
|
||||||
struct usbh_urb *urb = pipe->urb;
|
|
||||||
if (pipe->waiter) {
|
|
||||||
pipe->waiter = false;
|
|
||||||
urb->errorcode = -ESHUTDOWN;
|
|
||||||
usb_osal_sem_give(pipe->waitsem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
usbh_roothub_thread_wakeup(1);
|
usbh_roothub_thread_wakeup(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user