r1235 - developers/werner

werner at sita.openmoko.org werner at sita.openmoko.org
Sun Mar 4 08:31:34 CET 2007


Author: werner
Date: 2007-03-04 08:31:31 +0100 (Sun, 04 Mar 2007)
New Revision: 1235

Added:
   developers/werner/dfu-util-alt-by-name.patch
Log:
Add Altsetting lookup by name to dfu-util. (Proposed patch.)

main.c: removed PAGE_SIZE comment
main.c (help): fixed "Altseting" typo
main.c (main, help, alt_by_name): added lookup of dif->altsetting by name



Added: developers/werner/dfu-util-alt-by-name.patch
===================================================================
--- developers/werner/dfu-util-alt-by-name.patch	2007-03-04 00:15:51 UTC (rev 1234)
+++ developers/werner/dfu-util-alt-by-name.patch	2007-03-04 07:31:31 UTC (rev 1235)
@@ -0,0 +1,104 @@
+main.c: removed PAGE_SIZE comment
+main.c (help): fixed "Altseting" typo
+main.c (main, help, alt_by_name): added lookup of dif->altsetting by name
+
+Index: dfu-util/src/main.c
+===================================================================
+--- dfu-util/src/main.c	(revision 1234)
++++ dfu-util/src/main.c	(working copy)
+@@ -32,7 +32,6 @@
+ #include "sam7dfu.h"
+ //#include "config.h"
+ 
+-/* FIXME: how do we learn about PAGE_SIZE in userspace? */
+ 
+ int debug;
+ static int verbose = 0;
+@@ -153,6 +152,33 @@
+ 	return 0;
+ }
+ 
++static int alt_by_name(struct dfu_if *dfu_if, void *v)
++{
++	struct usb_device *dev = dfu_if->dev;
++	int if_name_str_idx;
++	char name[MAX_STR_LEN+1] = "UNDEFINED";
++
++	if_name_str_idx =
++	    dev->config[dfu_if->configuration].interface[dfu_if->interface].
++	    altsetting[dfu_if->altsetting].iInterface;
++	if (!if_name_str_idx)
++		return 0;
++	if (!dfu_if->dev_handle)
++		dfu_if->dev_handle = usb_open(dfu_if->dev);
++	if (!dfu_if->dev_handle)
++		return 0;
++	if (usb_get_string_simple(dfu_if->dev_handle, if_name_str_idx, name,
++	     MAX_STR_LEN) < 0)
++		return 0; /* should we return an error here ? */
++	if (strcmp(name, v))
++		return 0;
++	/*
++	 * Return altsetting+1 so that we can use return value 0 to indicate
++	 * "not found".
++	 */
++	return dfu_if->altsetting+1;
++}
++
+ static int _count_cb(struct dfu_if *dif, void *v)
+ {
+ 	int *count = v;
+@@ -264,7 +290,8 @@
+ 		"  -d --device vendor:product\tSpecify Vendor/Product ID of DFU device\n"
+ 		"  -c --cfg config_nr\t\tSpecify the Configuration of DFU device\n"
+ 		"  -i --intf intf_nr\t\tSpecify the DFU Interface number\n"
+-		"  -a --alt alt_nr\t\tSpecify the Altseting of the DFU Interface\n"
++		"  -a --alt alt\t\t\tSpecify the Altsetting of the DFU Interface\n"
++		"\t\t\t\tby name or by number\n"
+ 		"  -t --transfer-size\t\tSpecify the number of bytes per USB Transfer\n"
+ 		"  -U --upload file\t\tRead firmware from device into <file>\n"
+ 		"  -D --download file\t\tWrite firmware from <file> into device\n"
+@@ -307,6 +334,8 @@
+ 	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;
+@@ -364,7 +393,9 @@
+ 			break;
+ 		case 'a':
+ 			/* Interface Alternate Setting */
+-			dif->altsetting = atoi(optarg);
++			dif->altsetting = strtoul(optarg, &end, 0);
++			if (*end)
++				alt_name = optarg;
+ 			dif->flags |= DFU_IFF_ALT;
+ 			break;
+ 		case 't':
+@@ -540,6 +571,23 @@
+ 		exit(1);
+ 	}
+ 
++	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;
++		printf("Looked up \"%s\" = %d\n", alt_name, dif->altsetting);
++	}
++
+ 	printf("Setting Alternate Setting ...\n");
+ 	if (usb_set_altinterface(dif->dev_handle, dif->altsetting) < 0) {
+ 		fprintf(stderr, "Cannot set alternate interface: %s\n",





More information about the commitlog mailing list