1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-07-01 22:21:16 +02:00

pickit2_spi: update to libusb1 and drop libusb0 dependency

TESTED: read, write, verify

Change-Id: Icfc5372aa1789d35ed22d68297d5e68a74d40388
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/32213
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
Thomas Heijligen
2019-04-05 15:08:35 +02:00
committed by Nico Huber
parent d2d3993a25
commit b221cd7048
4 changed files with 60 additions and 132 deletions

View File

@ -690,15 +690,12 @@ $(foreach var, $(filter CONFIG_%, $(.VARIABLES)),\
$(eval $(var)=yes))) $(eval $(var)=yes)))
endif endif
# Disable feature groups
ifeq ($(CONFIG_ENABLE_LIBUSB0_PROGRAMMERS), no)
override CONFIG_PICKIT2_SPI = no
endif
ifeq ($(CONFIG_ENABLE_LIBUSB1_PROGRAMMERS), no) ifeq ($(CONFIG_ENABLE_LIBUSB1_PROGRAMMERS), no)
override CONFIG_CH341A_SPI = no override CONFIG_CH341A_SPI = no
override CONFIG_DEDIPROG = no override CONFIG_DEDIPROG = no
override CONFIG_DIGILENT_SPI = no override CONFIG_DIGILENT_SPI = no
override CONFIG_DEVELOPERBOX_SPI = no override CONFIG_DEVELOPERBOX_SPI = no
override CONFIG_PICKIT2_SPI = no
endif endif
ifeq ($(CONFIG_ENABLE_LIBPCI_PROGRAMMERS), no) ifeq ($(CONFIG_ENABLE_LIBPCI_PROGRAMMERS), no)
override CONFIG_INTERNAL = no override CONFIG_INTERNAL = no
@ -863,7 +860,7 @@ endif
ifeq ($(CONFIG_PICKIT2_SPI), yes) ifeq ($(CONFIG_PICKIT2_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_PICKIT2_SPI=1' FEATURE_CFLAGS += -D'CONFIG_PICKIT2_SPI=1'
PROGRAMMER_OBJS += pickit2_spi.o PROGRAMMER_OBJS += pickit2_spi.o
NEED_LIBUSB0 += CONFIG_PICKIT2_SPI NEED_LIBUSB1 += CONFIG_PICKIT2_SPI
endif endif
ifneq ($(NEED_LIBFTDI), ) ifneq ($(NEED_LIBFTDI), )
@ -1034,11 +1031,6 @@ endif
endif endif
ifneq ($(NEED_LIBUSB0), )
CHECK_LIBUSB0 = yes
FEATURE_CFLAGS += -D'NEED_LIBUSB0=1'
USBLIBS := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --libs libusb || printf "%s" "-lusb")
endif
ifneq ($(NEED_LIBUSB1), ) ifneq ($(NEED_LIBUSB1), )
CHECK_LIBUSB1 = yes CHECK_LIBUSB1 = yes
@ -1190,23 +1182,6 @@ int main(int argc, char **argv)
endef endef
export PCI_GET_DEV_TEST export PCI_GET_DEV_TEST
define LIBUSB0_TEST
#include "platform.h"
#if IS_WINDOWS
#include <lusb0_usb.h>
#else
#include <usb.h>
#endif
int main(int argc, char **argv)
{
(void) argc;
(void) argv;
usb_init();
return 0;
}
endef
export LIBUSB0_TEST
define LIBUSB1_TEST define LIBUSB1_TEST
#include <stddef.h> #include <stddef.h>
#include <libusb.h> #include <libusb.h>
@ -1272,28 +1247,6 @@ ifeq ($(CHECK_LIBPCI), yes)
rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1 rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1
@rm -f .test.c .test.o .test$(EXEC_SUFFIX) @rm -f .test.c .test.o .test$(EXEC_SUFFIX)
endif endif
ifeq ($(CHECK_LIBUSB0), yes)
@printf "Checking for libusb-0.1/libusb-compat headers... " | tee -a $(BUILD_DETAILS_FILE)
@echo "$$LIBUSB0_TEST" > .test.c
@printf "\nexec: %s\n" "$(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o" >>$(BUILD_DETAILS_FILE)
@{ { { { { $(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o >&2 && \
echo "found." || { echo "not found."; echo; \
echo "The following features require libusb-0.1/libusb-compat: $(NEED_LIBUSB0)."; \
echo "Please install libusb-0.1 headers or libusb-compat headers or disable all features"; \
echo "mentioned above by specifying make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no"; \
echo "See README for more information."; echo; \
rm -f .test.c .test.o; exit 1; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1
@printf "Checking if libusb-0.1 is usable... " | tee -a $(BUILD_DETAILS_FILE)
@printf "\nexec: %s\n" "$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(USBLIBS)" >>$(BUILD_DETAILS_FILE)
@{ { { { { $(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(USBLIBS) >&2 && \
echo "yes." || { echo "no."; \
echo "The following features require libusb-0.1/libusb-compat: $(NEED_LIBUSB0)."; \
echo "Please install libusb-0.1 or libusb-compat or disable all features"; \
echo "mentioned above by specifying make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no"; \
echo "See README for more information."; echo; \
rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1
@rm -f .test.c .test.o .test$(EXEC_SUFFIX)
endif
ifeq ($(CHECK_LIBUSB1), yes) ifeq ($(CHECK_LIBUSB1), yes)
@printf "Checking for libusb-1.0 headers... " | tee -a $(BUILD_DETAILS_FILE) @printf "Checking for libusb-1.0 headers... " | tee -a $(BUILD_DETAILS_FILE)
@echo "$$LIBUSB1_TEST" > .test.c @echo "$$LIBUSB1_TEST" > .test.c

View File

@ -67,7 +67,6 @@ cargs = []
deps = [] deps = []
srcs = [] srcs = []
need_libusb0 = false
need_raw_access = false need_raw_access = false
need_serial = false need_serial = false
@ -91,6 +90,7 @@ else
config_dediprog = false config_dediprog = false
config_digilent_spi = false config_digilent_spi = false
config_developerbox_spi = false config_developerbox_spi = false
config_pickit2_spi = false
endif endif
# some programmers require libpci # some programmers require libpci
@ -242,7 +242,6 @@ endif
if config_pickit2_spi if config_pickit2_spi
srcs += 'pickit2_spi.c' srcs += 'pickit2_spi.c'
cargs += '-DCONFIG_PICKIT2_SPI=1' cargs += '-DCONFIG_PICKIT2_SPI=1'
need_libusb0 = true
endif endif
if config_pony_spi if config_pony_spi
srcs += 'pony_spi.c' srcs += 'pony_spi.c'
@ -293,11 +292,6 @@ if need_serial
srcs += 'serial.c' srcs += 'serial.c'
endif endif
# raw deprecated and old USB library
if need_libusb0
deps += dependency('libusb')
endif
prefix = get_option('prefix') prefix = get_option('prefix')
sbindir = join_paths(prefix, get_option('sbindir')) sbindir = join_paths(prefix, get_option('sbindir'))
libdir = join_paths(prefix, get_option('libdir')) libdir = join_paths(prefix, get_option('libdir'))

View File

@ -26,7 +26,7 @@ option('config_nicintel', type : 'boolean', value : true, description : 'Intel N
option('config_nicnatsemi', type : 'boolean', value : false, description : 'National Semiconductor NICs') option('config_nicnatsemi', type : 'boolean', value : false, description : 'National Semiconductor NICs')
option('config_nicrealtek', type : 'boolean', value : true, description : 'Realtek NICs') option('config_nicrealtek', type : 'boolean', value : true, description : 'Realtek NICs')
option('config_ogp_spi', type : 'boolean', value : true, description : 'SPI on OGP cards') option('config_ogp_spi', type : 'boolean', value : true, description : 'SPI on OGP cards')
option('config_pickit2_spi', type : 'boolean', value : false, description : 'PICkit2 SPI') option('config_pickit2_spi', type : 'boolean', value : true, description : 'PICkit2 SPI')
option('config_pony_spi', type : 'boolean', value : true, description : 'PonyProg2000 SPI') option('config_pony_spi', type : 'boolean', value : true, description : 'PonyProg2000 SPI')
option('config_rayer_spi', type : 'boolean', value : true, description : 'RayeR SPIPGM') option('config_rayer_spi', type : 'boolean', value : true, description : 'RayeR SPIPGM')
option('config_satamv', type : 'boolean', value : true, description : 'Marvell SATA controllers') option('config_satamv', type : 'boolean', value : true, description : 'Marvell SATA controllers')

View File

@ -39,12 +39,7 @@
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <errno.h> #include <errno.h>
#include <libusb.h>
#if IS_WINDOWS
#include <lusb0_usb.h>
#else
#include <usb.h>
#endif
#include "flash.h" #include "flash.h"
#include "chipdrivers.h" #include "chipdrivers.h"
@ -57,7 +52,7 @@ const struct dev_entry devs_pickit2_spi[] = {
{} {}
}; };
static usb_dev_handle *pickit2_handle; static libusb_device_handle *pickit2_handle;
/* Default USB transaction timeout in ms */ /* Default USB transaction timeout in ms */
#define DFLT_TIMEOUT 10000 #define DFLT_TIMEOUT 10000
@ -94,36 +89,18 @@ static usb_dev_handle *pickit2_handle;
#define SCR_VDD_OFF 0xFE #define SCR_VDD_OFF 0xFE
#define SCR_VDD_ON 0xFF #define SCR_VDD_ON 0xFF
/* Might be useful for other USB devices as well. static for now.
* 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;
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)) {
if (device == 0)
return dev;
device--;
}
return NULL;
}
static int pickit2_get_firmware_version(void) static int pickit2_get_firmware_version(void)
{ {
int ret; int ret;
uint8_t command[CMD_LENGTH] = {CMD_GET_VERSION, CMD_END_OF_BUFFER}; uint8_t command[CMD_LENGTH] = {CMD_GET_VERSION, CMD_END_OF_BUFFER};
ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)command, CMD_LENGTH, DFLT_TIMEOUT); int transferred;
ret = usb_interrupt_read(pickit2_handle, ENDPOINT_IN, (char *)command, CMD_LENGTH, DFLT_TIMEOUT); ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, CMD_LENGTH, &transferred, DFLT_TIMEOUT);
ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, CMD_LENGTH, &transferred, DFLT_TIMEOUT);
msg_pdbg("PICkit2 Firmware Version: %d.%d\n", (int)command[0], (int)command[1]); msg_pdbg("PICkit2 Firmware Version: %d.%d\n", (int)command[0], (int)command[1]);
if (ret != CMD_LENGTH) { if (ret != 0) {
msg_perr("Command Get Firmware Version failed (%s)!\n", usb_strerror()); msg_perr("Command Get Firmware Version failed!\n");
return 1; return 1;
} }
@ -165,11 +142,11 @@ static int pickit2_set_spi_voltage(int millivolt)
voltage_selector * 13, voltage_selector * 13,
CMD_END_OF_BUFFER CMD_END_OF_BUFFER
}; };
int transferred;
int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, CMD_LENGTH, &transferred, DFLT_TIMEOUT);
int ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)command, CMD_LENGTH, DFLT_TIMEOUT); if (ret != 0) {
msg_perr("Command Set Voltage failed!\n");
if (ret != CMD_LENGTH) {
msg_perr("Command Set Voltage failed (%s)!\n", usb_strerror());
return 1; return 1;
} }
@ -201,10 +178,11 @@ static int pickit2_set_spi_speed(unsigned int spispeed_idx)
CMD_END_OF_BUFFER CMD_END_OF_BUFFER
}; };
int ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)command, CMD_LENGTH, DFLT_TIMEOUT); int transferred;
int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, CMD_LENGTH, &transferred, DFLT_TIMEOUT);
if (ret != CMD_LENGTH) { if (ret != 0) {
msg_perr("Command Set SPI Speed failed (%s)!\n", usb_strerror()); msg_perr("Command Set SPI Speed failed!\n");
return 1; return 1;
} }
@ -270,18 +248,20 @@ static int pickit2_spi_send_command(struct flashctx *flash, unsigned int writecn
buf[i++] = CMD_UPLOAD_DATA; buf[i++] = CMD_UPLOAD_DATA;
buf[i++] = CMD_END_OF_BUFFER; buf[i++] = CMD_END_OF_BUFFER;
int ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)buf, CMD_LENGTH, DFLT_TIMEOUT); int transferred;
int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, CMD_LENGTH, &transferred, DFLT_TIMEOUT);
if (ret != CMD_LENGTH) { if (ret != 0) {
msg_perr("Send SPI failed, expected %i, got %i %s!\n", writecnt, ret, usb_strerror()); msg_perr("Send SPI failed!\n");
return 1; return 1;
} }
if (readcnt) { if (readcnt) {
ret = usb_interrupt_read(pickit2_handle, ENDPOINT_IN, (char *)buf, CMD_LENGTH, DFLT_TIMEOUT); int length = 0;
ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, buf, CMD_LENGTH, &length, DFLT_TIMEOUT);
if (ret != CMD_LENGTH) { if (length == 0 || ret != 0) {
msg_perr("Receive SPI failed, expected %i, got %i %s!\n", readcnt, ret, usb_strerror()); msg_perr("Receive SPI failed\n");
return 1; return 1;
} }
@ -376,27 +356,24 @@ static int pickit2_shutdown(void *data)
CMD_END_OF_BUFFER CMD_END_OF_BUFFER
}; };
int ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)command, CMD_LENGTH, DFLT_TIMEOUT); int transferred;
int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, CMD_LENGTH, &transferred, DFLT_TIMEOUT);
if (ret != CMD_LENGTH) { if (ret != 0) {
msg_perr("Command Shutdown failed (%s)!\n", usb_strerror()); msg_perr("Command Shutdown failed!\n");
ret = 1; ret = 1;
} }
if (usb_release_interface(pickit2_handle, 0) != 0) { if (libusb_release_interface(pickit2_handle, 0) != 0) {
msg_perr("Could not release USB interface!\n"); msg_perr("Could not release USB interface!\n");
ret = 1; ret = 1;
} }
if (usb_close(pickit2_handle) != 0) { libusb_close(pickit2_handle);
msg_perr("Could not close USB device!\n"); libusb_exit(NULL);
ret = 1;
}
return ret; return ret;
} }
int pickit2_spi_init(void) int pickit2_spi_init(void)
{ {
unsigned int usedevice = 0; // FIXME: Allow selecting one of multiple devices
uint8_t buf[CMD_LENGTH] = { uint8_t buf[CMD_LENGTH] = {
CMD_EXEC_SCRIPT, CMD_EXEC_SCRIPT,
10, /* Script length */ 10, /* Script length */
@ -442,32 +419,36 @@ int pickit2_spi_init(void)
return 1; return 1;
} }
/* Here comes the USB stuff */ if (libusb_init(NULL) < 0) {
usb_init(); msg_perr("Couldn't initialize libusb!\n");
(void)usb_find_busses(); return -1;
(void)usb_find_devices(); }
#if LIBUSB_API_VERSION < 0x01000106
libusb_set_debug(NULL, 3);
#else
libusb_set_option(NULL, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_INFO);
#endif
const uint16_t vid = devs_pickit2_spi[0].vendor_id; const uint16_t vid = devs_pickit2_spi[0].vendor_id;
const uint16_t pid = devs_pickit2_spi[0].device_id; const uint16_t pid = devs_pickit2_spi[0].device_id;
struct usb_device *dev = get_device_by_vid_pid(vid, pid, usedevice); pickit2_handle = libusb_open_device_with_vid_pid(NULL, vid, pid);
if (dev == NULL) { if (pickit2_handle == NULL) {
msg_perr("Could not find a PICkit2 on USB!\n"); msg_perr("Could not open device PICkit2!\n");
libusb_exit(NULL);
return 1; return 1;
} }
msg_pdbg("Found USB device (%04x:%04x).\n", dev->descriptor.idVendor, dev->descriptor.idProduct);
pickit2_handle = usb_open(dev); if (libusb_set_configuration(pickit2_handle, 1) != 0) {
int ret = usb_set_configuration(pickit2_handle, 1); msg_perr("Could not set USB device configuration.\n");
if (ret != 0) { libusb_close(pickit2_handle);
msg_perr("Could not set USB device configuration: %i %s\n", ret, usb_strerror()); libusb_exit(NULL);
if (usb_close(pickit2_handle) != 0)
msg_perr("Could not close USB device!\n");
return 1; return 1;
} }
ret = usb_claim_interface(pickit2_handle, 0); if (libusb_claim_interface(pickit2_handle, 0) != 0) {
if (ret != 0) { msg_perr("Could not claim USB device interface\n");
msg_perr("Could not claim USB device interface %i: %i %s\n", 0, ret, usb_strerror()); libusb_close(pickit2_handle);
if (usb_close(pickit2_handle) != 0) libusb_exit(NULL);
msg_perr("Could not close USB device!\n");
return 1; return 1;
} }
@ -492,9 +473,9 @@ int pickit2_spi_init(void)
/* Perform basic setup. /* Perform basic setup.
* Configure pin directions and logic levels, turn Vdd on, turn busy LED on and clear buffers. */ * Configure pin directions and logic levels, turn Vdd on, turn busy LED on and clear buffers. */
ret = usb_interrupt_write(pickit2_handle, ENDPOINT_OUT, (char *)buf, CMD_LENGTH, DFLT_TIMEOUT); int transferred;
if (ret != CMD_LENGTH) { if (libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, CMD_LENGTH, &transferred, DFLT_TIMEOUT) != 0) {
msg_perr("Command Setup failed (%s)!\n", usb_strerror()); msg_perr("Command Setup failed!\n");
return 1; return 1;
} }