mirror of
https://review.coreboot.org/flashrom.git
synced 2025-07-01 14:11:15 +02:00
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. Corresponding to flashrom svn r1628. Signed-off-by: Nathan Laredo <nil@google.com> Signed-off-by: David Hendricks <dhendrix@google.com> Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
This commit is contained in:

committed by
Stefan Tauner

parent
acfc4c6c2f
commit
21541a6b22
40
dediprog.c
40
dediprog.c
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#include "flash.h"
|
#include "flash.h"
|
||||||
#include "chipdrivers.h"
|
#include "chipdrivers.h"
|
||||||
@ -46,7 +47,8 @@ static void print_hex(void *buf, size_t len)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Might be useful for other USB devices as well. static for now. */
|
/* 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_bus *bus;
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
@ -54,8 +56,11 @@ static struct usb_device *get_device_by_vid_pid(uint16_t vid, uint16_t pid)
|
|||||||
for (bus = usb_get_busses(); bus; bus = bus->next)
|
for (bus = usb_get_busses(); bus; bus = bus->next)
|
||||||
for (dev = bus->devices; dev; dev = dev->next)
|
for (dev = bus->devices; dev; dev = dev->next)
|
||||||
if ((dev->descriptor.idVendor == vid) &&
|
if ((dev->descriptor.idVendor == vid) &&
|
||||||
(dev->descriptor.idProduct == pid))
|
(dev->descriptor.idProduct == pid)) {
|
||||||
return dev;
|
if (device == 0)
|
||||||
|
return dev;
|
||||||
|
device--;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -777,8 +782,9 @@ static int dediprog_shutdown(void *data)
|
|||||||
int dediprog_init(void)
|
int dediprog_init(void)
|
||||||
{
|
{
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
char *voltage;
|
char *voltage, *device;
|
||||||
int millivolt = 3500;
|
int millivolt = 3500;
|
||||||
|
long usedevice = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
msg_pspew("%s\n", __func__);
|
msg_pspew("%s\n", __func__);
|
||||||
@ -792,11 +798,35 @@ int dediprog_init(void)
|
|||||||
msg_pinfo("Setting voltage to %i mV\n", millivolt);
|
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. */
|
/* Here comes the USB stuff. */
|
||||||
usb_init();
|
usb_init();
|
||||||
usb_find_busses();
|
usb_find_busses();
|
||||||
usb_find_devices();
|
usb_find_devices();
|
||||||
dev = get_device_by_vid_pid(0x0483, 0xdada);
|
dev = get_device_by_vid_pid(0x0483, 0xdada, (unsigned int) usedevice);
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
msg_perr("Could not find a Dediprog SF100 on USB!\n");
|
msg_perr("Could not find a Dediprog SF100 on USB!\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
11
flashrom.8
11
flashrom.8
@ -1,4 +1,4 @@
|
|||||||
.TH FLASHROM 8 "Feb 15, 2012"
|
.TH FLASHROM 8 "Dec, 2012"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
flashrom \- detect, read, write, verify and erase flash chips
|
flashrom \- detect, read, write, verify and erase flash chips
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@ -651,6 +651,15 @@ where
|
|||||||
can be
|
can be
|
||||||
.BR 0V ", " 1.8V ", " 2.5V ", " 3.5V
|
.BR 0V ", " 1.8V ", " 2.5V ", " 3.5V
|
||||||
or the equivalent in mV.
|
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
|
.SS
|
||||||
.BR "rayer_spi " programmer
|
.BR "rayer_spi " programmer
|
||||||
The default I/O base address used for the parallel port is 0x378 and you can use
|
The default I/O base address used for the parallel port is 0x378 and you can use
|
||||||
|
Reference in New Issue
Block a user