During my testing which consisted of disconnecting and reconnecting a Kinetis K60DN512 (MQX 4.0) USB port to Windows XP machine repeatedly, I was able to repeatedly generate a hard fault which locked up my processor.
I traced the defect to the khci_dev_main.c file specifically in the _usb_device_usbfs_service_tk_dne_intr function
My testing caused this function to be called with the direction set to USB_RECV. When this happened, It was possible to have
USB_XD_QUEUE_GET_HEAD(&state_ptr->EP_INFO[ep_num].xd_queue_recv,
&xd_ptr);
return the xd_ptr as a NULL. The code isn't hardened against this and it crashed.
By adding:
if (xd_ptr != NULL)
{
} <- put this before: " if ( _usb_device_usbfs_process_receive_request(state_ptr,ep_num,stat,&buffer_ptr)!=USB_OK)"
seems to prevent the crash, it needs to be reviewed by the developers, becasue I think a more elegant solution is needed.
a similar problem seems to be in _usb_device_usbfs_service_tk_dne_intr, but my testing didn't indicate that that function was being called on quick reconnects.
This problem also exists in MQX 3.8, but the file name is different
Hello Robert Hodson,
Firstly thank you for taking time to report this :smileywink: I am going to find out more about these bugs in code . I will let you know the result eventually.
Regards,
MartinK