From 1c5ee1f11f94818b435f3cf99b51bbedd7e9cd7e Mon Sep 17 00:00:00 2001 From: Jeremy Elson Date: Mon, 25 Feb 2019 15:08:20 -0800 Subject: [PATCH 1/5] Add blackmagic.bin as dependency of bindata.o so that running make in upgrade will correctly rebuild the upgrade tool if the main binary has changed. --- upgrade/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/upgrade/Makefile b/upgrade/Makefile index 397b3e6a..c8946967 100644 --- a/upgrade/Makefile +++ b/upgrade/Makefile @@ -12,6 +12,8 @@ OBJ = bindata.o \ all: $(OUTFILE) +bindata.o: ../src/blackmagic.bin + $(OUTFILE) $(OUTFILE).exe: $(OBJ) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) From 8f6b266c543516ae5f834df189915d1c7ecd8859 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Sun, 26 May 2019 15:39:32 +0200 Subject: [PATCH 2/5] Upgrade: Download needs to set the address. --- upgrade/main.c | 2 +- upgrade/stm32mem.c | 7 ++++++- upgrade/stm32mem.h | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/upgrade/main.c b/upgrade/main.c index 38fa5752..3e10b9a3 100644 --- a/upgrade/main.c +++ b/upgrade/main.c @@ -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); diff --git a/upgrade/stm32mem.c b/upgrade/stm32mem.c index 53bbb5b9..2d9d1369 100644 --- a/upgrade/stm32mem.c +++ b/upgrade/stm32mem.c @@ -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); } diff --git a/upgrade/stm32mem.h b/upgrade/stm32mem.h index fd99c656..b8a013ac 100644 --- a/upgrade/stm32mem.h +++ b/upgrade/stm32mem.h @@ -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 From d98703e022adcb3d2bf7bbbbb6a2a89516fcbf81 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 19 Jul 2019 15:42:19 +0200 Subject: [PATCH 3/5] Do not download/build/clean libopencm3 directory when compiling for PC-hosted platforms. --- Makefile | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Makefile b/Makefile index 358c6870..a3446b00 100644 --- a/Makefile +++ b/Makefile @@ -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 $@ From 6323409fecb1b77a2e9d597d2b2c32d25e4d2e28 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 19 Jul 2019 18:16:20 +0200 Subject: [PATCH 4/5] upgrade: Honnor the PROBE_HOST make argument. --- upgrade/Makefile | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/upgrade/Makefile b/upgrade/Makefile index c8946967..17d898ed 100644 --- a/upgrade/Makefile +++ b/upgrade/Makefile @@ -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,9 +18,29 @@ OBJ = bindata.o \ stm32mem.o \ main.o -all: $(OUTFILE) +ifndef $(PROBE_HOST) + PROBE_HOST=native +endif -bindata.o: ../src/blackmagic.bin +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) From 1b3acf3b8afb8f0fae5389eb6cb0ae026af7fcf0 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 19 Jul 2019 20:53:03 +0200 Subject: [PATCH 5/5] pc-stlinkv2: Print serial number of V20 devices readable. --- src/platforms/pc-stlinkv2/stlinkv2.c | 37 ++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/platforms/pc-stlinkv2/stlinkv2.c b/src/platforms/pc-stlinkv2/stlinkv2.c index 9d2f9b2c..ab6fa44d 100644 --- a/src/platforms/pc-stlinkv2/stlinkv2.c +++ b/src/platforms/pc-stlinkv2/stlinkv2.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #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));