Beispiel #1
0
struct usb_device_info * usb_open_and_wait_for_device(void) {

	libusb_device **devs;
	libusb_device **dev;
	struct usb_device_info * ret = NULL;
	int i = 0;
	void (*prev)(int);
	static char progress[] = {'/','-','\\', '|'};

	if ( libusb_init(NULL) < 0 ) {
		PRINTF_LINE("libusb_init failed");
		PRINTF_END();
		return NULL;
	}

	PRINTF_BACK();
	printf("\n");

	signal_quit = 0;

	prev = signal(SIGINT, signal_handler);

	while ( ! signal_quit ) {

		PRINTF_LINE("Waiting for USB device... %c", progress[++i%sizeof(progress)]);

		if ( libusb_get_device_list(NULL, &devs) < 0 ) {
			PRINTF_LINE("Listing USB devices failed");
			PRINTF_END();
			break;
		}

		for ( dev = devs; *dev != NULL; ++dev ) {
			ret = usb_device_is_valid(*dev);
			if ( ret )
				break;
		}

		libusb_free_device_list(devs, 1);

		if ( ret )
			break;

		SLEEP(0xc350); // 0.5s

	}

	if ( prev != SIG_ERR )
		signal(SIGINT, prev);

	PRINTF_BACK();
	printf("\n");

	if ( ! ret )
		return NULL;

	return ret;

}
Beispiel #2
0
static struct usb_device_info * usb_search_device(struct usb_device * dev, int level) {

	int i;
	struct usb_device_info * ret = NULL;

	if ( ! dev )
		return NULL;

	ret = usb_device_is_valid(dev);
	if ( ret )
		return ret;

	for ( i = 0; i < dev->num_children; i++ ) {
		ret = usb_search_device(dev->children[i], level + 1);
		if ( ret )
			break;
	}

	return ret;

}