rename hidh_keyboard_info_t to hidh_interface_info_t
rename tusb_bus_event_t to tusb_event_t add test_mouse_init and more stuff for hidh mouse move delay after port reset to only for speed detection prioritize port change interrupt over xfer interrupt - in case of unplugged, current connect change & xfer error both set - xfer error only break to debugger if not because of unplugged fix bug: set dev addr0 state to UNPLUG after close its control pipe in enumeration process
This commit is contained in:
@@ -135,11 +135,6 @@ void hcd_port_reset(uint8_t hostid)
|
||||
// NXP specific, port reset will automatically be 0 when reset sequence complete
|
||||
// there is chance device is unplugged while reset sequence is not complete
|
||||
while( regs->portsc_bit.port_reset) {}
|
||||
|
||||
// TODO finalize delay after reset, hack delay 100 ms, otherwise speed is detected as LOW in most cases
|
||||
volatile uint32_t delay_us = 100000;
|
||||
delay_us *= (SystemCoreClock / 1000000) / 3;
|
||||
while(delay_us--);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -457,6 +452,14 @@ void port_connect_status_change_isr(uint8_t hostid)
|
||||
if (regs->portsc_bit.current_connect_status) // device plugged
|
||||
{
|
||||
hcd_port_reset(hostid);
|
||||
|
||||
#ifndef _TEST_
|
||||
// TODO finalize delay after reset, hack delay 100 ms, otherwise speed is detected as LOW in most cases
|
||||
volatile uint32_t delay_us = 100000;
|
||||
delay_us *= (SystemCoreClock / 1000000) / 3;
|
||||
while(delay_us--);
|
||||
#endif
|
||||
|
||||
usbh_device_plugged_isr(hostid, regs->portsc_bit.nxp_port_speed); // NXP specific port speed
|
||||
}else // device unplugged
|
||||
{
|
||||
@@ -485,7 +488,7 @@ void async_list_process_isr(ehci_qhd_t * const async_head)
|
||||
pipe_hdl.xfer_type = TUSB_XFER_BULK;
|
||||
pipe_hdl.index = qhd_get_index(p_qhd);
|
||||
}
|
||||
usbh_isr( pipe_hdl, p_qhd->class_code, BUS_EVENT_XFER_COMPLETE); // call USBH callback
|
||||
usbh_isr( pipe_hdl, p_qhd->class_code, TUSB_EVENT_XFER_COMPLETE); // call USBH callback
|
||||
}
|
||||
|
||||
p_qhd->p_qtd_list_head->used = 0; // free QTD
|
||||
@@ -525,7 +528,7 @@ void period_list_process_isr(ehci_qhd_t const * const period_head)
|
||||
pipe_hdl.xfer_type = TUSB_XFER_INTERRUPT;
|
||||
pipe_hdl.index = qhd_get_index(p_qhd_int);
|
||||
}
|
||||
usbh_isr( pipe_hdl, p_qhd_int->class_code, BUS_EVENT_XFER_COMPLETE); // call USBH callback
|
||||
usbh_isr( pipe_hdl, p_qhd_int->class_code, TUSB_EVENT_XFER_COMPLETE); // call USBH callback
|
||||
}
|
||||
|
||||
p_qhd_int->p_qtd_list_head->used = 0; // free QTD
|
||||
@@ -565,7 +568,8 @@ void xfer_error_isr(uint8_t hostid)
|
||||
pipe_hdl.xfer_type = TUSB_XFER_BULK;
|
||||
pipe_hdl.index = qhd_get_index(p_qhd);
|
||||
}
|
||||
usbh_isr( pipe_hdl, p_qhd->class_code, BUS_EVENT_XFER_ERROR); // call USBH callback
|
||||
hal_debugger_breakpoint();
|
||||
usbh_isr( pipe_hdl, p_qhd->class_code, TUSB_EVENT_XFER_ERROR); // call USBH callback
|
||||
}
|
||||
|
||||
p_qhd = (ehci_qhd_t*) align32(p_qhd->next.address);
|
||||
@@ -585,10 +589,21 @@ void hcd_isr(uint8_t hostid)
|
||||
if (int_status == 0)
|
||||
return;
|
||||
|
||||
if (int_status & EHCI_INT_MASK_PORT_CHANGE)
|
||||
{
|
||||
uint32_t port_status = regs->portsc & EHCI_PORTSC_MASK_ALL;
|
||||
|
||||
if (regs->portsc_bit.connect_status_change)
|
||||
{
|
||||
port_connect_status_change_isr(hostid);
|
||||
}
|
||||
|
||||
regs->portsc |= port_status; // Acknowledge change bits in portsc
|
||||
}
|
||||
|
||||
if (int_status & EHCI_INT_MASK_ERROR)
|
||||
{
|
||||
// TODO handle Queue Head halted
|
||||
hal_debugger_breakpoint();
|
||||
xfer_error_isr(hostid);
|
||||
}
|
||||
|
||||
@@ -603,18 +618,6 @@ void hcd_isr(uint8_t hostid)
|
||||
period_list_process_isr( get_period_head(hostid) );
|
||||
}
|
||||
|
||||
if (int_status & EHCI_INT_MASK_PORT_CHANGE)
|
||||
{
|
||||
uint32_t port_status = regs->portsc & EHCI_PORTSC_MASK_ALL;
|
||||
|
||||
if (regs->portsc_bit.connect_status_change)
|
||||
{
|
||||
port_connect_status_change_isr(hostid);
|
||||
}
|
||||
|
||||
regs->portsc |= port_status; // Acknowledge change bits in portsc
|
||||
}
|
||||
|
||||
if (int_status & EHCI_INT_MASK_ASYNC_ADVANCE) // need to place after EHCI_INT_MASK_NXP_ASYNC
|
||||
{
|
||||
async_advance_isr( get_async_head(hostid) );
|
||||
|
||||
Reference in New Issue
Block a user