- fix bug when unplugged unmounted-already device (mostly plugged when power on)
- add hal_debugger_is_attached & hal_debugger_breakpoint - assert will suspend (place breakpoint) if the condition is failed and debugger is attached. Otherwise, a message to uart is printed - fix get control qhd function when dev_addr is not zero (shifted 1) - fix wrong logic for unsupported class
This commit is contained in:
@@ -221,10 +221,7 @@ void port_connect_status_change_isr(uint8_t hostid)
|
||||
usbh_device_plugged_isr(hostid, regs->portsc_bit.nxp_port_speed); // NXP specific port speed
|
||||
}else // device unplugged
|
||||
{
|
||||
printf("%s %d\n", __FUNCTION__, __LINE__);
|
||||
|
||||
usbh_device_unplugged_isr(hostid);
|
||||
|
||||
regs->usb_cmd_bit.advacne_async = 1; // Async doorbell check EHCI 4.8.2 for operational details
|
||||
}
|
||||
|
||||
@@ -280,7 +277,7 @@ void hcd_isr(uint8_t hostid)
|
||||
{
|
||||
// TODO handle Queue Head halted
|
||||
// TODO invoke some error callback if not async head
|
||||
ASM_BREAKPOINT;
|
||||
hal_debugger_breakpoint();
|
||||
}
|
||||
|
||||
//------------- some QTD/SITD/ITD with IOC set is completed -------------//
|
||||
@@ -666,7 +663,7 @@ static inline ehci_qhd_t* get_control_qhd(uint8_t dev_addr)
|
||||
{
|
||||
return (dev_addr == 0) ?
|
||||
get_async_head( usbh_device_info_pool[dev_addr].core_id ) :
|
||||
&ehci_data.device[dev_addr].control.qhd;
|
||||
&ehci_data.device[dev_addr-1].control.qhd;
|
||||
}
|
||||
static inline ehci_qtd_t* get_control_qtds(uint8_t dev_addr)
|
||||
{
|
||||
|
||||
@@ -201,13 +201,15 @@ void usbh_device_plugged_isr(uint8_t hostid, tusb_speed_t speed)
|
||||
|
||||
void usbh_device_unplugged_isr(uint8_t hostid)
|
||||
{
|
||||
printf("%s %d\n", __FUNCTION__, __LINE__);
|
||||
|
||||
//------------- find the device address that is unplugged -------------//
|
||||
uint8_t dev_addr=1;
|
||||
while ( dev_addr <= TUSB_CFG_HOST_DEVICE_MAX && ! (usbh_device_info_pool[dev_addr].core_id == hostid &&
|
||||
usbh_device_info_pool[dev_addr].hub_addr == 0 &&
|
||||
usbh_device_info_pool[dev_addr].hub_port ==0))
|
||||
while ( dev_addr <= TUSB_CFG_HOST_DEVICE_MAX &&
|
||||
!(usbh_device_info_pool[dev_addr].core_id == hostid &&
|
||||
usbh_device_info_pool[dev_addr].hub_addr == 0 &&
|
||||
usbh_device_info_pool[dev_addr].hub_port == 0 &&
|
||||
usbh_device_info_pool[dev_addr].status != TUSB_DEVICE_STATUS_UNPLUG
|
||||
)
|
||||
)
|
||||
{
|
||||
dev_addr++;
|
||||
}
|
||||
@@ -370,20 +372,19 @@ OSAL_TASK_DECLARE(usbh_enumeration_task)
|
||||
if (class_code == 0)
|
||||
{
|
||||
TASK_ASSERT( false ); // corrupted data, abort enumeration
|
||||
} else if ( class_code < TUSB_CLASS_MAX_CONSEC_NUMBER)
|
||||
}
|
||||
// supported class
|
||||
else if ( class_code < TUSB_CLASS_MAX_CONSEC_NUMBER && usbh_class_drivers[class_code].open_subtask)
|
||||
{
|
||||
if ( usbh_class_drivers[class_code].open_subtask )
|
||||
{
|
||||
uint16_t length;
|
||||
OSAL_SUBTASK_INVOKED_AND_WAIT ( // parameters in task/sub_task must be static storage (static or global)
|
||||
usbh_class_drivers[ ((tusb_descriptor_interface_t*) p_desc)->bInterfaceClass ].open_subtask(new_addr, p_desc, &length) );
|
||||
p_desc += length;
|
||||
}
|
||||
uint16_t length;
|
||||
OSAL_SUBTASK_INVOKED_AND_WAIT ( // parameters in task/sub_task must be static storage (static or global)
|
||||
usbh_class_drivers[ ((tusb_descriptor_interface_t*) p_desc)->bInterfaceClass ].open_subtask(new_addr, p_desc, &length) );
|
||||
p_desc += length;
|
||||
} else // unsupported class (not enable or yet implemented)
|
||||
{
|
||||
do
|
||||
{
|
||||
p_desc += (*p_desc);
|
||||
p_desc += (*p_desc); // skip the descriptor, increase by the descriptor's length
|
||||
} while ( (p_desc < enum_data_buffer + ((tusb_descriptor_configuration_t*)enum_data_buffer)->wTotalLength)
|
||||
&& TUSB_DESC_INTERFACE != p_desc[1] );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user