hello, I am porting a usb exploit applications from macosx to an imxrt1011 kit.
the code is copied from usb_host_hid_generic with some change (hid to dfu, and add some more wait states).
I found after a DFU_CLRSTATUS command, device is disconnect but doesnot reconnect after one second. (timeout error on suspend)
in PC's usb stack, it looks like this:
so I guess I need to force a soft reset after an dfu clear status control message (like IOUSBDeviceInterface->ResetDevice under osx or libusb_reset_device under linux).
I tried call
if (USB_HostDeinit(&g_HostHandle) != kStatus_USB_Success) {
usb_echo("host deinit error\r\n");
}status = USB_HostInit(CONTROLLER_ID, &g_HostHandle, USB_HostEvent);
if (status != kStatus_USB_Success) {
usb_echo("host init error\r\n");
}
in one of my step but it just cause a hardfault.on USB_HostDeinit.
a single USB_HostInit call doesn't fix suspend timeout error, too.
is there any examples to do a device reset in host side?
I know dfu protocol have a DFU_DETACH command to do a detach-attach sequence in device side, but I do not want send extra packet to device because it may change device's heap, which have side effect in exploit.
I am using mcuxprsso sdk 2.6.0, in usb_examples, each host sample is one way state machine which lacks re plugin support.
Hi Banxian:
Please refer to below API, USB_HostRemoveDevice. it is similar to yours. ,but not sure if it will meet your requirements
/*!
* @brief Removes the attached device.
*
* This function removes the attached device.
* This function should not be used all the time.
*
* @param[in] hostHandle The host handle.
* @param[in] deviceHandle Removing device handle.
*
* @retval kStatus_USB_Success Remove successfully.
* @retval kStatus_USB_InvalidHandle The hostHandle or deviceHandle is a NULL pointer.
* @retval kStatus_USB_InvalidParameter The deviceHandle instance don't belong to hostHandle instance.
*/
extern usb_status_t USB_HostRemoveDevice(usb_host_handle hostHandle, usb_device_handle deviceHandle);
Regards
Daniel
infact I tried USB_HostRemoveDevice before I post this thread, but it takes no help.
if (USB_HostRemoveDevice(&g_HostHandle, g_HostDfuGeneric.deviceHandle) != kStatus_USB_Success) {
usb_echo("remove device error\r\n");
}
Hello dear banxian,
g_HostHandle and g_HostDfuGeneric.deviceHandle are already pointers. remove & ands it should be fine.
Regards