Author: stefanct Date: Mon Dec 24 23:07:36 2012 New Revision: 1628 URL: http://flashrom.org/trac/flashrom/changeset/1628
Log: Add a "device" parameter for Dediprog.
This patch adds a "device" parameter for Dediprog which enables use of multiple dediprogs connected to a single machine. Very handy for test racks.
Example usage: flashrom -p dediprog:device=0 flashrom -p dediprog:device=1 etc...
The patch was originally written by Nathan Laredo. Thanks to David Hendricks for submitting it upstream. Additional error handling, man page etc. by Stefan Tauner.
Signed-off-by: Nathan Laredo nil@google.com Signed-off-by: David Hendricks dhendrix@google.com Signed-off-by: Stefan Tauner stefan.tauner@student.tuwien.ac.at Acked-by: Stefan Tauner stefan.tauner@student.tuwien.ac.at
Modified: trunk/dediprog.c trunk/flashrom.8
Modified: trunk/dediprog.c ============================================================================== --- trunk/dediprog.c Fri Nov 30 17:46:45 2012 (r1627) +++ trunk/dediprog.c Mon Dec 24 23:07:36 2012 (r1628) @@ -19,6 +19,7 @@
#include <stdio.h> #include <string.h> +#include <errno.h> #include <usb.h> #include "flash.h" #include "chipdrivers.h" @@ -46,7 +47,8 @@ #endif
/* Might be useful for other USB devices as well. static for now. */ -static struct usb_device *get_device_by_vid_pid(uint16_t vid, uint16_t pid) +/* device parameter allows user to specify one device of multiple installed */ +static struct usb_device *get_device_by_vid_pid(uint16_t vid, uint16_t pid, unsigned int device) { struct usb_bus *bus; struct usb_device *dev; @@ -54,8 +56,11 @@ for (bus = usb_get_busses(); bus; bus = bus->next) for (dev = bus->devices; dev; dev = dev->next) if ((dev->descriptor.idVendor == vid) && - (dev->descriptor.idProduct == pid)) - return dev; + (dev->descriptor.idProduct == pid)) { + if (device == 0) + return dev; + device--; + }
return NULL; } @@ -777,8 +782,9 @@ int dediprog_init(void) { struct usb_device *dev; - char *voltage; + char *voltage, *device; int millivolt = 3500; + long usedevice = 0; int ret;
msg_pspew("%s\n", __func__); @@ -792,11 +798,35 @@ msg_pinfo("Setting voltage to %i mV\n", millivolt); }
+ device = extract_programmer_param("device"); + if (device) { + char *dev_suffix; + errno = 0; + usedevice = strtol(device, &dev_suffix, 10); + if (errno != 0 || device == dev_suffix) { + msg_perr("Error: Could not convert 'device'.\n"); + free(device); + return 1; + } + if (usedevice < 0 || usedevice > UINT_MAX) { + msg_perr("Error: Value for 'device' is out of range.\n"); + free(device); + return 1; + } + if (strlen(dev_suffix) > 0) { + msg_perr("Error: Garbage following 'device' value.\n"); + free(device); + return 1; + } + msg_pinfo("Using device %li.\n", usedevice); + } + free(device); + /* Here comes the USB stuff. */ usb_init(); usb_find_busses(); usb_find_devices(); - dev = get_device_by_vid_pid(0x0483, 0xdada); + dev = get_device_by_vid_pid(0x0483, 0xdada, (unsigned int) usedevice); if (!dev) { msg_perr("Could not find a Dediprog SF100 on USB!\n"); return 1;
Modified: trunk/flashrom.8 ============================================================================== --- trunk/flashrom.8 Fri Nov 30 17:46:45 2012 (r1627) +++ trunk/flashrom.8 Mon Dec 24 23:07:36 2012 (r1628) @@ -1,4 +1,4 @@ -.TH FLASHROM 8 "Feb 15, 2012" +.TH FLASHROM 8 "Dec, 2012" .SH NAME flashrom - detect, read, write, verify and erase flash chips .SH SYNOPSIS @@ -651,6 +651,15 @@ can be .BR 0V ", " 1.8V ", " 2.5V ", " 3.5V or the equivalent in mV. +.sp +An optional +.B device +parameter specifies which of multiple connected Dediprog devices should be used. +Please be aware that the order depends on libusb's usb_get_busses() function and that the numbering starts +at 0. +Usage example to select the second device: +.sp +.B " flashrom -p dediprog:device=1" .SS .BR "rayer_spi " programmer The default I/O base address used for the parallel port is 0x378 and you can use