Merge pull request #495 from UweBonnes/451

Fix upgrade compiling (by extending #451)
This commit is contained in:
UweBonnes 2019-07-20 14:32:09 +02:00 committed by GitHub
commit 5107a29699
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 80 additions and 10 deletions

View File

@ -3,16 +3,28 @@ MFLAGS += --no-print-dir
Q := @
endif
PC_HOSTED =
ifeq ($(PROBE_HOST), libftdi)
PC_HOSTED = true
endif
ifeq ($(PROBE_HOST), pc-stlinkv2)
PC_HOSTED = true
endif
all:
ifndef PC_HOSTED
$(Q)if [ ! -f libopencm3/Makefile ]; then \
echo "Initialising git submodules..." ;\
git submodule init ;\
git submodule update ;\
fi
$(Q)$(MAKE) $(MFLAGS) -C libopencm3 lib
endif
$(Q)$(MAKE) $(MFLAGS) -C src
clean:
ifndef PC_HOSTED
$(Q)$(MAKE) $(MFLAGS) -C libopencm3 $@
endif
$(Q)$(MAKE) $(MFLAGS) -C src $@

View File

@ -33,6 +33,7 @@
#include <assert.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#include <sys/time.h>
#if !defined(timersub)
@ -206,7 +207,7 @@ typedef struct {
uint16_t vid;
uint16_t pid;
uint8_t transport_mode;
uint8_t serial[32];
char serial[32];
uint8_t dap_select;
uint8_t ep_tx;
uint8_t ver_hw; /* 20, 21 or 31 deciphered from USB PID.*/
@ -719,16 +720,38 @@ void stlink_init(int argc, char **argv)
}
r = libusb_open(dev, &Stlink.handle);
if (r == LIBUSB_SUCCESS) {
uint8_t data[32];
uint16_t lang;
libusb_get_string_descriptor(
Stlink.handle, 0, 0, data, sizeof(data));
lang = data[2] << 8 | data[3];
unsigned char sernum[32];
if (desc.iSerialNumber) {
r = libusb_get_string_descriptor_ascii
(Stlink.handle,desc.iSerialNumber, Stlink.serial,
sizeof(Stlink.serial));
r = libusb_get_string_descriptor
(Stlink.handle, desc.iSerialNumber, lang,
sernum, sizeof(sernum));
} else {
DEBUG("No serial number\n");
}
if (serial && (!strncmp((char*)Stlink.serial, serial, strlen(serial))))
/* Older devices have hex values instead of ascii
* in the serial string. Recode eventually!*/
bool readable = true;
uint16_t *p = (uint16_t *)sernum;
for (p += 1; *p; p++) {
bool isr = isalnum(*p);
readable &= isr;
}
char *s = Stlink.serial;
p = (uint16_t *)sernum;
for (p += 1; *p; p++, s++) {
if (readable)
*s = *p;
else
snprintf(s, 3, "%02x", *p & 0xff);
}
if (serial && (!strncmp(Stlink.serial, serial, strlen(serial))))
DEBUG("Found ");
if (!serial || (!strncmp((char*)Stlink.serial, serial, strlen(serial)))) {
if (!serial || (!strncmp(Stlink.serial, serial, strlen(serial)))) {
if (desc.idProduct == PRODUCT_ID_STLINKV2) {
DEBUG("STLINKV20 serial %s\n", Stlink.serial);
Stlink.ver_hw = 20;
@ -753,7 +776,7 @@ void stlink_init(int argc, char **argv)
DEBUG("Unknown STLINK variant, serial %s\n", Stlink.serial);
}
}
if (serial && (!strncmp((char*)Stlink.serial, serial, strlen(serial))))
if (serial && (!strncmp(Stlink.serial, serial, strlen(serial))))
break;
} else {
DEBUG("Open failed %s\n", libusb_strerror(r));

View File

@ -1,5 +1,13 @@
OUTFILE = blackmagic_upgrade
PC_HOSTED =
ifeq ($(PROBE_HOST), libftdi)
PC_HOSTED = true
endif
ifeq ($(PROBE_HOST), pc-stlinkv2)
PC_HOSTED = true
endif
CC = $(CROSS_COMPILE)gcc
CFLAGS = -Wall -Wextra -std=gnu99 -O0 -g -MD -mno-ms-bitfields
@ -10,7 +18,29 @@ OBJ = bindata.o \
stm32mem.o \
main.o
ifndef $(PROBE_HOST)
PROBE_HOST=native
endif
ifndef PC_HOSTED
all: $(OUTFILE)
else
all:
ifeq ($(PROBE_HOST), libftdi)
@echo "Libftdi needs no firmware update"
endif
ifeq ($(PROBE_HOST), pc-stlinkv2)
@echo "Pc-stlinkv2 use ST provided tools for firmware update"
endif
endif
bindata.o: $(PROBE_HOST).d
$(PROBE_HOST).d: ../src/blackmagic.bin
-rm *.d
make -C ../src $0 clean
make -C ../src $0
touch $(PROBE_HOST).d
$(OUTFILE) $(OUTFILE).exe: $(OBJ)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

View File

@ -157,7 +157,7 @@ retry:
printf("Progress: %d%%\r", (offset*100)/bindatalen);
fflush(stdout);
assert(stm32_mem_erase(handle, iface, LOAD_ADDRESS + offset) == 0);
stm32_mem_write(handle, iface, (void*)&bindata[offset], 1024);
stm32_mem_write(handle, iface, (void*)&bindata[offset], 1024, LOAD_ADDRESS + offset);
}
stm32_mem_manifest(handle, iface);

View File

@ -69,8 +69,13 @@ int stm32_mem_erase(usb_dev_handle *dev, uint16_t iface, uint32_t addr)
return stm32_download(dev, iface, 0, request, sizeof(request));
}
int stm32_mem_write(usb_dev_handle *dev, uint16_t iface, void *data, int size)
int stm32_mem_write(usb_dev_handle *dev, uint16_t iface, void *data, int size, uint32_t addr)
{
uint8_t request[5];
request[0] = STM32_CMD_SETADDRESSPOINTER;
memcpy(request+1, &addr, sizeof(addr));
stm32_download(dev, iface, 0, request, sizeof(request));
return stm32_download(dev, iface, 2, data, size);
}

View File

@ -27,7 +27,7 @@
#endif
int stm32_mem_erase(usb_dev_handle *dev, uint16_t iface, uint32_t addr);
int stm32_mem_write(usb_dev_handle *dev, uint16_t iface, void *data, int size);
int stm32_mem_write(usb_dev_handle *dev, uint16_t iface, void *data, int size, uint32_t addr);
int stm32_mem_manifest(usb_dev_handle *dev, uint16_t iface);
#endif