⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c.svn-base

📁 openmoko host system dfu-util
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
{	struct usb_vendprod vendprod;	struct dfu_if _rt_dif, _dif, *dif = &_dif;	int num_devs;	int num_ifs;	unsigned int transfer_size = 0;	enum mode mode = MODE_NONE;	struct dfu_status status;	struct usb_dfu_func_descriptor func_dfu;	char *filename = NULL;	char *alt_name = NULL; /* query alt name if non-NULL */	char *end;	int final_reset = 0;	int page_size = getpagesize();	int ret;		printf("dfu-util - (C) 2007-2008 by OpenMoko Inc.\n"	       "This program is Free Software and has ABSOLUTELY NO WARRANTY\n\n");	memset(dif, 0, sizeof(*dif));	usb_init();	//usb_set_debug(255);	usb_find_busses();	usb_find_devices();	while (1) {		int c, option_index = 0;		c = getopt_long(argc, argv, "hVvld:p:c:i:a:t:U:D:R", opts,				&option_index);		if (c == -1)			break;		switch (c) {		case 'h':			help();			exit(0);			break;		case 'V':			print_version();			exit(0);			break;		case 'v':			verbose = 1;			break;		case 'l':			list_dfu_interfaces();			exit(0);			break;		case 'd':			/* Parse device */			if (parse_vendprod(&vendprod, optarg) < 0) {				fprintf(stderr, "unable to parse `%s'\n", optarg);				exit(2);			}			dif->vendor = vendprod.vendor;			dif->product = vendprod.product;			dif->flags |= (DFU_IFF_VENDOR | DFU_IFF_PRODUCT);			break;		case 'p':			/* Parse device path */			dif->path = optarg;			dif->flags |= DFU_IFF_PATH;			ret = resolve_device_path(dif);			if (ret < 0) {				fprintf(stderr, "unable to parse `%s'\n",				    optarg);				exit(2);			}			if (!ret) {				fprintf(stderr, "cannot find `%s'\n", optarg);				exit(1);			}			break;		case 'c':			/* Configuration */			dif->configuration = atoi(optarg);			dif->flags |= DFU_IFF_CONFIG;			break;		case 'i':			/* Interface */			dif->interface = atoi(optarg);			dif->flags |= DFU_IFF_IFACE;			break;		case 'a':			/* Interface Alternate Setting */			dif->altsetting = strtoul(optarg, &end, 0);			if (*end)				alt_name = optarg;			dif->flags |= DFU_IFF_ALT;			break;		case 't':			transfer_size = atoi(optarg);			break;		case 'U':			mode = MODE_UPLOAD;			filename = optarg;			break;		case 'D':			mode = MODE_DOWNLOAD;			filename = optarg;			break;		case 'R':			final_reset = 1;			break;		default:			help();			exit(2);		}	}	if (mode == MODE_NONE) {		fprintf(stderr, "You need to specify one of -D or -U\n");		help();		exit(2);	}	if (!filename) {		fprintf(stderr, "You need to specify a filename to -D -r -U\n");		help();		exit(2);	}	dfu_init(5000);	num_devs = count_dfu_devices(dif);	if (num_devs == 0) {		fprintf(stderr, "No DFU capable USB device found\n");		exit(1);	} else if (num_devs > 1) {		/* We cannot safely support more than one DFU capable device		 * with same vendor/product ID, since during DFU we need to do		 * a USB bus reset, after which the target device will get a		 * new address */		fprintf(stderr, "More than one DFU capable USB device found, "		       "you might try `--list' and then disconnect all but one "		       "device\n");		exit(3);	}	if (!get_first_dfu_device(dif))		exit(3);	/* We have exactly one device. It's usb_device is now in dif->dev */	printf("Opening USB Device 0x%04x:0x%04x...\n", dif->vendor, dif->product);	dif->dev_handle = usb_open(dif->dev);	if (!dif->dev_handle) {		fprintf(stderr, "Cannot open device: %s\n", usb_strerror());		exit(1);	}	/* try to find first DFU interface of device */	memcpy(&_rt_dif, dif, sizeof(_rt_dif));	if (!get_first_dfu_if(&_rt_dif))		exit(1);	if (!_rt_dif.flags & DFU_IFF_DFU) {		/* In the 'first round' during runtime mode, there can only be one	 	* DFU Interface descriptor according to the DFU Spec. */		/* FIXME: check if the selected device really has only one */		printf("Claiming USB DFU Runtime Interface...\n");		if (usb_claim_interface(_rt_dif.dev_handle, _rt_dif.interface) < 0) {			fprintf(stderr, "Cannot claim interface: %s\n",				usb_strerror());			exit(1);		}		printf("Determining device status: ");		if (dfu_get_status(_rt_dif.dev_handle, _rt_dif.interface, &status ) < 0) {			fprintf(stderr, "error get_status: %s\n",				usb_strerror());			exit(1);		}		printf("state = %s, status = %d\n", 		       dfu_state_to_string(status.bState), status.bStatus);		switch (status.bState) {		case DFU_STATE_appIDLE:		case DFU_STATE_appDETACH:			printf("Device really in Runtime Mode, send DFU "			       "detach request...\n");			if (dfu_detach(_rt_dif.dev_handle, 				       _rt_dif.interface, 1000) < 0) {				fprintf(stderr, "error detaching: %s\n",					usb_strerror());				exit(1);				break;			}			printf("Resetting USB...\n");			ret = usb_reset(_rt_dif.dev_handle);			if (ret < 0 && ret != -ENODEV)				fprintf(stderr,					"error resetting after detach: %s\n", 					usb_strerror());			sleep(2);			break;		case DFU_STATE_dfuERROR:			printf("dfuERROR, clearing status\n");			if (dfu_clear_status(_rt_dif.dev_handle,					     _rt_dif.interface) < 0) {				fprintf(stderr, "error clear_status: %s\n",					usb_strerror());				exit(1);				break;			}			break;		default:			fprintf(stderr, "WARNING: Runtime device already "				"in DFU state ?!?\n");			goto dfustate;			break;		}		/* now we need to re-scan the bus and locate our device */		if (usb_find_devices() < 2)			printf("not at least 2 device changes found ?!?\n");		if (dif->flags & DFU_IFF_PATH) {			ret = resolve_device_path(dif);			if (ret < 0) {				fprintf(stderr,				    "internal error: cannot re-parse `%s'\n",				    dif->path);				abort();			}			if (!ret) {				fprintf(stderr,				    "Can't resolve path after RESET?\n");				exit(1);			}		}		num_devs = count_dfu_devices(dif);		if (num_devs == 0) {			fprintf(stderr, "Lost device after RESET?\n");			exit(1);		} else if (num_devs > 1) {			fprintf(stderr, "More than one DFU capable USB "				"device found, you might try `--list' and "				"then disconnect all but one device\n");			exit(1);		}		if (!get_first_dfu_device(dif))			exit(3);		printf("Opening USB Device...\n");		dif->dev_handle = usb_open(dif->dev);		if (!dif->dev_handle) {			fprintf(stderr, "Cannot open device: %s\n",				usb_strerror());			exit(1);		}	} else {		/* we're already in DFU mode, so we can skip the detach/reset		 * procedure */	}dfustate:	if (alt_name) {		int n;		n = find_dfu_if(dif->dev, &alt_by_name, alt_name);		if (!n) {			fprintf(stderr, "No such Alternate Setting: \"%s\"\n",			    alt_name);			exit(1);		}		if (n < 0) {			fprintf(stderr, "Error %d in name lookup\n", n);			exit(1);		}		dif->altsetting = n-1;	}	print_dfu_if(dif, NULL);	num_ifs = count_dfu_interfaces(dif->dev);	if (num_ifs < 0) {		fprintf(stderr, "No DFU Interface after RESET?!?\n");		exit(1);	} else if (num_ifs == 1) {		if (!get_first_dfu_if(dif)) {			fprintf(stderr, "Can't find the single available "				"DFU IF\n");			exit(1);		}	} else if (num_ifs > 1 && !dif->flags & (DFU_IFF_IFACE|DFU_IFF_ALT)) {		fprintf(stderr, "We have %u DFU Interfaces/Altsettings, "			"you have to specify one via --intf / --alt options\n",			num_ifs);		exit(1);	}#if 0	printf("Setting Configuration %u...\n", dif->configuration);	if (usb_set_configuration(dif->dev_handle, dif->configuration) < 0) {		fprintf(stderr, "Cannot set configuration: %s\n",			usb_strerror());		exit(1);	}#endif	printf("Claiming USB DFU Interface...\n");	if (usb_claim_interface(dif->dev_handle, dif->interface) < 0) {		fprintf(stderr, "Cannot claim interface: %s\n",			usb_strerror());		exit(1);	}	printf("Setting Alternate Setting ...\n");	if (usb_set_altinterface(dif->dev_handle, dif->altsetting) < 0) {		fprintf(stderr, "Cannot set alternate interface: %s\n",			usb_strerror());		exit(1);	}status_again:	printf("Determining device status: ");	if (dfu_get_status(dif->dev_handle, dif->interface, &status ) < 0) {		fprintf(stderr, "error get_status: %s\n", usb_strerror());		exit(1);	}	printf("state = %s, status = %d\n",	       dfu_state_to_string(status.bState), status.bStatus);	switch (status.bState) {	case DFU_STATE_appIDLE:	case DFU_STATE_appDETACH:		fprintf(stderr, "Device still in Runtime Mode!\n");		exit(1);		break;	case DFU_STATE_dfuERROR:		printf("dfuERROR, clearing status\n");		if (dfu_clear_status(dif->dev_handle, dif->interface) < 0) {			fprintf(stderr, "error clear_status: %s\n",				usb_strerror());			exit(1);		}		goto status_again;		break;	case DFU_STATE_dfuDNLOAD_IDLE:	case DFU_STATE_dfuUPLOAD_IDLE:		printf("aborting previous incomplete transfer\n");		if (dfu_abort(dif->dev_handle, dif->interface) < 0) {			fprintf(stderr, "can't send DFU_ABORT: %s\n",				usb_strerror());			exit(1);		}		goto status_again;		break;	case DFU_STATE_dfuIDLE:		printf("dfuIDLE, continuing\n");		break;	}	if (!transfer_size) {		/* Obtain DFU functional descriptor */		ret = usb_get_descriptor(dif->dev_handle, 0x21, dif->interface,					 &func_dfu, sizeof(func_dfu));		if (ret < 0) {			fprintf(stderr, "Error obtaining DFU functional "				"descriptor: %s\n", usb_strerror());			transfer_size = page_size;		} else {			transfer_size = get_int16_le(&func_dfu.wTransferSize);		}	}	if (transfer_size > page_size)		transfer_size = page_size;		printf("Transfer Size = 0x%04x\n", transfer_size);	if (DFU_STATUS_OK != status.bStatus ) {		printf("WARNING: DFU Status: '%s'\n",			dfu_status_to_string(status.bStatus));		/* Clear our status & try again. */		dfu_clear_status(dif->dev_handle, dif->interface);		dfu_get_status(dif->dev_handle, dif->interface, &status);		if (DFU_STATUS_OK != status.bStatus) {			fprintf(stderr, "Error: %d\n", status.bStatus);			exit(1);		}        }	switch (mode) {	case MODE_UPLOAD:		if (sam7dfu_do_upload(dif->dev_handle, dif->interface,				  transfer_size, filename) < 0)			exit(1);		break;	case MODE_DOWNLOAD:		if (sam7dfu_do_dnload(dif->dev_handle, dif->interface,				  transfer_size, filename) < 0)			exit(1);		break;	default:		fprintf(stderr, "Unsupported mode: %u\n", mode);		exit(1);	}	if (final_reset) {		if (dfu_detach(dif->dev_handle, dif->interface, 1000) < 0) {			fprintf(stderr, "can't detach: %s\n", usb_strerror());		}		printf("Resetting USB to switch back to runtime mode\n");		ret = usb_reset(dif->dev_handle);		if (ret < 0 && ret != -ENODEV) {			fprintf(stderr, "error resetting after download: %s\n", 			usb_strerror());		}	}	exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -