Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

USB stuck when unplugging the cable #484

Open
MathisLav opened this issue Apr 2, 2024 · 0 comments
Open

USB stuck when unplugging the cable #484

MathisLav opened this issue Apr 2, 2024 · 0 comments

Comments

@MathisLav
Copy link

Hello 馃憢

I want first to congratulate you all for your amazing work with the CE toolchain, thank you!

I'm getting an issue that happens every time I unplug the USB cable, but only if a configuration has been set beforehand.

The minimal code could be something like this (I tried with the most recent toolchain):

#include <usbdrvce.h>
#include <tice.h>
#include <stdio.h>

int do_configure = 0;
usb_device_t device = NULL;


usb_error_t usbHandler(usb_event_t event, void *event_data, usb_callback_data_t *data) {
	(void)data;
	switch(event)
	{
		case USB_DEVICE_CONNECTED_EVENT:
			device = (usb_device_t)event_data;
			usb_RefDevice(device);
			usb_ResetDevice(device);
			break;
		case USB_DEVICE_ENABLED_EVENT:
			if(!(usb_GetRole() & USB_ROLE_DEVICE)) {
				do_configure = 1;
			} else {
				usb_DisableDevice(device);
			}
			break;
		case USB_DEVICE_DISCONNECTED_EVENT:
			usb_UnrefDevice(device);
			device = NULL;
			break;
		default:
			break;
	}
	return USB_SUCCESS;
}

void configure_usb_device() {
	uint8_t buffer[256] = {0};
	size_t len = 0;
	size_t total_length;

	usb_GetDescriptor(device, USB_CONFIGURATION_DESCRIPTOR, 0, buffer, 9, &len);
	total_length = ((usb_configuration_descriptor_t*)buffer)->wTotalLength;
	if(total_length > 256) {
		printf("No mem\n");
		return;
	}

	usb_GetDescriptor(device, USB_CONFIGURATION_DESCRIPTOR, 0, buffer, total_length, &len);
	if(usb_SetConfiguration(device, (usb_configuration_descriptor_t*)buffer, len) != USB_SUCCESS) {
		printf("Not able to configure\n");
		return;
	}

	printf("Configured!\n");
}

int main(void) {
	os_ClrHome();
	usb_Init(usbHandler, NULL, NULL, USB_DEFAULT_INIT_FLAGS);

	while(!os_GetCSC()) {
		os_SetCursorPos(0, 0);
		os_NewLine();
		printf("%x ", usb_GetFrameNumber());

		if(do_configure) {
			configure_usb_device();
			do_configure = 0;
		}

		usb_HandleEvents();
	}

	usb_Cleanup();
	return 0;
}

Thus, when I unplug the cable the frame number is stopped (that's ok) but when I try to re-plug the device, the latter is powered but the frame number doesn't restart and is still frozen. When I comment out the usb_SetConfiguration line though, it works and I can plug/unplug the cable several times without any problem. It seems that after setting the configuration, unplugging the cable does not trigger any DISCONNECTED_EVENT.

Does aynybody have any idea about this? Is there a known workaround for now?

NB: I'm plugging a smartphone as a device, but acagliano seems to have the same issue with his ECM driver.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

4 participants