From 1330288271bea7b6224bac5bc8e1438305eec44a Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Sat, 23 Jan 2021 21:34:18 +0100 Subject: [PATCH] firmware: Unify serial number handling Use one file in dfu and server For STM32, provide 3 ways to handle - BMP way (8 bytes) - DFU way (12 Bytes) - Full unique id (24 Bytes), as with STLINK(V3) Bootloader --- src/command.c | 4 +- src/include/serialno.h | 2 +- src/platforms/common/cdcacm.c | 9 +---- src/platforms/f4discovery/Makefile.inc | 7 ++-- src/platforms/hydrabus/Makefile.inc | 4 +- src/platforms/launchpad-icdi/Makefile.inc | 1 + src/platforms/launchpad-icdi/platform.c | 6 +-- src/platforms/native/Makefile.inc | 4 +- src/platforms/stlink/Makefile.inc | 9 +++-- src/platforms/stm32/dfucore.c | 21 ++--------- src/platforms/stm32/serialno.c | 45 ++++++++++++++++------- src/platforms/swlink/Makefile.inc | 4 +- 12 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/command.c b/src/command.c index 859496a..3a26a29 100644 --- a/src/command.c +++ b/src/command.c @@ -408,7 +408,7 @@ static bool cmd_target_power(target *t, int argc, const char **argv) #ifdef PLATFORM_HAS_TRACESWO static bool cmd_traceswo(target *t, int argc, const char **argv) { - char serial_no[13]; + char serial_no[DFU_SERIAL_LENGTH]; (void)t; #if TRACESWO_PROTOCOL == 2 uint32_t baudrate = SWO_DEFAULT_BAUD; @@ -454,7 +454,7 @@ static bool cmd_traceswo(target *t, int argc, const char **argv) #else traceswo_init(swo_channelmask); #endif - serial_no_read(serial_no, sizeof(serial_no)); + serial_no_read(serial_no); gdb_outf("%s:%02X:%02X\n", serial_no, 5, 0x85); return true; } diff --git a/src/include/serialno.h b/src/include/serialno.h index 69cfe02..281070f 100644 --- a/src/include/serialno.h +++ b/src/include/serialno.h @@ -20,7 +20,7 @@ #ifndef __SERIALNO_H #define __SERIALNO_H -char *serial_no_read(char *s, int max); +char *serial_no_read(char *s); #endif diff --git a/src/platforms/common/cdcacm.c b/src/platforms/common/cdcacm.c index 848391d..b28f197 100644 --- a/src/platforms/common/cdcacm.c +++ b/src/platforms/common/cdcacm.c @@ -394,12 +394,7 @@ static const struct usb_config_descriptor config = { .interface = ifaces, }; - -#if defined(DUSE_ST_SERIAL) -char serial_no[13]; -#else -static char serial_no[9]; -#endif +static char serial_no[DFU_SERIAL_LENGTH]; #define BOARD_IDENT "Black Magic Probe " PLATFORM_IDENT FIRMWARE_VERSION #define DFU_IDENT "Black Magic Firmware Upgrade " PLATFORM_IDENT FIRMWARE_VERSION @@ -555,7 +550,7 @@ void cdcacm_init(void) { void exti15_10_isr(void); - serial_no_read(serial_no, sizeof(serial_no)); + serial_no_read(serial_no); usbdev = usbd_init(&USB_DRIVER, &dev, &config, usb_strings, sizeof(usb_strings)/sizeof(char *), diff --git a/src/platforms/f4discovery/Makefile.inc b/src/platforms/f4discovery/Makefile.inc index c9116db..c177150 100644 --- a/src/platforms/f4discovery/Makefile.inc +++ b/src/platforms/f4discovery/Makefile.inc @@ -5,7 +5,7 @@ OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m4 -mthumb \ -mfloat-abi=hard -mfpu=fpv4-sp-d16 \ - -DSTM32F4 -DF4DISCOVERY -I../libopencm3/include \ + -DSTM32F4 -I../libopencm3/include \ -Iplatforms/stm32 LDFLAGS_BOOT = -lopencm3_stm32f4 \ @@ -17,9 +17,10 @@ LDFLAGS_BOOT = -lopencm3_stm32f4 \ ifeq ($(BMP_BOOTLOADER), 1) $(info Load address 0x08004000 for BMPBootloader) LDFLAGS = $(LDFLAGS_BOOT) -Wl,-Ttext=0x8004000 +CFLAGS += -DDFU_SERIAL_LENGTH=9 else LDFLAGS += $(LDFLAGS_BOOT) -CFLAGS += -DUSE_ST_SERIAL +CFLAGS += -DDFU_SERIAL_LENGTH=13 endif VPATH += platforms/stm32 @@ -36,7 +37,7 @@ ifneq ($(BMP_BOOTLOADER), 1) all: blackmagic.bin else all: blackmagic.bin blackmagic_dfu.bin blackmagic_dfu.hex -blackmagic_dfu: usbdfu.o dfucore.o dfu_f4.o +blackmagic_dfu: usbdfu.o dfucore.o dfu_f4.o serialno.o $(CC) $^ -o $@ $(LDFLAGS_BOOT) blackmagic_dfu.bin: blackmagic_dfu diff --git a/src/platforms/hydrabus/Makefile.inc b/src/platforms/hydrabus/Makefile.inc index 9d1d2a0..e2f8f39 100644 --- a/src/platforms/hydrabus/Makefile.inc +++ b/src/platforms/hydrabus/Makefile.inc @@ -4,8 +4,8 @@ OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m4 -mthumb \ -mfloat-abi=hard -mfpu=fpv4-sp-d16 \ - -DSTM32F4 -DHYDRABUS -I../libopencm3/include \ - -Iplatforms/stm32 -DUSE_ST_BOOTLOADER + -DSTM32F4 -I../libopencm3/include \ + -Iplatforms/stm32 -DDFU_SERIAL_LENGTH=9 LDFLAGS = -lopencm3_stm32f4 \ -Wl,-T,platforms/stm32/f4discovery.ld -nostartfiles -lc -lnosys \ diff --git a/src/platforms/launchpad-icdi/Makefile.inc b/src/platforms/launchpad-icdi/Makefile.inc index 80d12ca..32c830a 100644 --- a/src/platforms/launchpad-icdi/Makefile.inc +++ b/src/platforms/launchpad-icdi/Makefile.inc @@ -7,6 +7,7 @@ INCLUDES = -I../libopencm3/include CPU_FLAGS = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard CFLAGS += $(INCLUDES) $(CPU_FLAGS) -DSERIAL_NO=$(SERIAL_NO) -DTARGET_IS_BLIZZARD_RB1 -DLM4F -DPART_TM4C123GH6PM +CFLAGS += -DDFU_SERIAL_LENGTH=9 LINKER_SCRIPT="platforms/tm4c/tm4c.ld" LDFLAGS = -nostartfiles -lc $(CPU_FLAGS) -nodefaultlibs -T$(LINKER_SCRIPT) -Wl,--gc-sections \ diff --git a/src/platforms/launchpad-icdi/platform.c b/src/platforms/launchpad-icdi/platform.c index b415336..d62a8cd 100644 --- a/src/platforms/launchpad-icdi/platform.c +++ b/src/platforms/launchpad-icdi/platform.c @@ -120,7 +120,7 @@ const char *platform_target_voltage(void) return NULL; } -char *serial_no_read(char *s, int max) +char *serial_no_read(char *s) { /* FIXME: Store a unique serial number somewhere and retreive here */ uint32_t unique_id = SERIAL_NO; @@ -130,10 +130,10 @@ char *serial_no_read(char *s, int max) for(i = 0; i < 8; i++) { s[7-i] = ((unique_id >> (4*i)) & 0xF) + '0'; } - for(i = 0; i < max - 1; i++) + for(i = 0; i < DFU_SERIAL_LENGTH - 1; i++) if(s[i] > '9') s[i] += 'A' - '9' - 1; - s[max] = 0; + s[DFU_SERIAL_LENGTH - 1] = 0; return s; } diff --git a/src/platforms/native/Makefile.inc b/src/platforms/native/Makefile.inc index 6d3e8ea..7eff46e 100644 --- a/src/platforms/native/Makefile.inc +++ b/src/platforms/native/Makefile.inc @@ -4,7 +4,7 @@ OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb \ -DSTM32F1 -DBLACKMAGIC -I../libopencm3/include \ - -Iplatforms/stm32 + -Iplatforms/stm32 -DDFU_SERIAL_LENGTH=9 LDFLAGS_BOOT := $(LDFLAGS) --specs=nano.specs -lopencm3_stm32f1 \ -Wl,-T,platforms/stm32/blackmagic.ld -nostartfiles -lc \ @@ -30,7 +30,7 @@ SRC += cdcacm.c \ all: blackmagic.bin blackmagic_dfu.bin blackmagic_dfu.hex -blackmagic_dfu.elf: usbdfu.o dfucore.o dfu_f1.o +blackmagic_dfu.elf: usbdfu.o dfucore.o dfu_f1.o serialno.o @echo " LD $@" $(Q)$(CC) $^ -o $@ $(LDFLAGS_BOOT) diff --git a/src/platforms/stlink/Makefile.inc b/src/platforms/stlink/Makefile.inc index 7d79dd1..9fa0ea6 100644 --- a/src/platforms/stlink/Makefile.inc +++ b/src/platforms/stlink/Makefile.inc @@ -3,8 +3,8 @@ ST_BOOTLOADER ?= CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy -CFLAGS += -mcpu=cortex-m3 -mthumb \ - -DSTM32F1 -DDISCOVERY_STLINK -I../libopencm3/include \ +OPT_FLAGS = -Os +CFLAGS += -mcpu=cortex-m3 -mthumb -DSTM32F1 -I../libopencm3/include \ -I platforms/stm32 LDFLAGS_BOOT := $(LDFLAGS) --specs=nano.specs -lopencm3_stm32f1 \ -Wl,-T,platforms/stm32/stlink.ld -nostartfiles -lc \ @@ -12,9 +12,10 @@ LDFLAGS_BOOT := $(LDFLAGS) --specs=nano.specs -lopencm3_stm32f1 \ -L../libopencm3/lib ifeq ($(ST_BOOTLOADER), 1) $(info Load address 0x08004000 for original ST-LinkV2 Bootloader) -CFLAGS += -DST_BOOTLOADER +CFLAGS += -DST_BOOTLOADER -DDFU_SERIAL_LENGTH=25 LDFLAGS = $(LDFLAGS_BOOT) -Wl,-Ttext=0x8004000 else +CFLAGS += -DDFU_SERIAL_LENGTH=9 LDFLAGS = $(LDFLAGS_BOOT) -Wl,-Ttext=0x8002000 endif @@ -40,7 +41,7 @@ all: blackmagic.bin else all: blackmagic.bin blackmagic_dfu.bin blackmagic_dfu.hex endif -blackmagic_dfu.elf: usbdfu.o dfucore.o dfu_f1.o stlink_common.o +blackmagic_dfu.elf: usbdfu.o dfucore.o dfu_f1.o stlink_common.o serialno.o @echo " LD $@" $(Q)$(CC) $^ -o $@ $(LDFLAGS_BOOT) diff --git a/src/platforms/stm32/dfucore.c b/src/platforms/stm32/dfucore.c index 3aceef9..3ddadb6 100644 --- a/src/platforms/stm32/dfucore.c +++ b/src/platforms/stm32/dfucore.c @@ -19,10 +19,11 @@ #include "general.h" #include "version.h" +#include "serialno.h" +#include #include -#include #if defined(STM32F1HD) # define DFU_IFACE_STRING "@Internal Flash /0x08000000/4*002Ka,000*002Kg" # define DFU_IFACE_STRING_OFFSET 38 @@ -124,7 +125,7 @@ const struct usb_config_descriptor config = { .interface = ifaces, }; -static char serial_no[9]; +static char serial_no[DFU_SERIAL_LENGTH]; static char if_string[] = DFU_IFACE_STRING; #define BOARD_IDENT_DFU(BOARD_TYPE) "Black Magic Probe DFU " PLATFORM_IDENT "" FIRMWARE_VERSION @@ -338,11 +339,6 @@ static void set_dfu_iface_string(uint32_t size) static char *get_dev_unique_id(char *s) { - volatile uint32_t *unique_id_p = (volatile uint32_t *)DESIG_UNIQUE_ID_BASE; - uint32_t unique_id = *unique_id_p + - *(unique_id_p + 1) + - *(unique_id_p + 2); - int i; uint32_t fuse_flash_size; /* Calculated the upper flash limit from the exported data @@ -352,14 +348,5 @@ static char *get_dev_unique_id(char *s) fuse_flash_size = 0x80; set_dfu_iface_string(fuse_flash_size - 8); max_address = FLASH_BASE + (fuse_flash_size << 10); - /* Fetch serial number from chip's unique ID */ - for(i = 0; i < 8; i++) { - s[7-i] = ((unique_id >> (4*i)) & 0xF) + '0'; - } - for(i = 0; i < 8; i++) - if(s[i] > '9') - s[i] += 'A' - '9' - 1; - s[8] = 0; - - return s; + return serial_no_read(s); } diff --git a/src/platforms/stm32/serialno.c b/src/platforms/stm32/serialno.c index 23cda10..973dee1 100644 --- a/src/platforms/stm32/serialno.c +++ b/src/platforms/stm32/serialno.c @@ -18,30 +18,49 @@ * along with this program. If not, see . */ #include "general.h" +#include -char *serial_no_read(char *s, int max) +char *serial_no_read(char *s) { -#if defined(STM32F1) || defined(USE_BMP_SERIAL) -/* Only STM32F103 has no DFU Bootloader. Generate a ID comatible - * with the BMP Bootloader since ages. - */ - uint32_t *unique_id_p = (uint32_t *)DESIG_UNIQUE_ID_BASE; +#if DFU_SERIAL_LENGTH == 9 + int i; + volatile uint32_t *unique_id_p = (volatile uint32_t *)DESIG_UNIQUE_ID_BASE; uint32_t unique_id = *unique_id_p + - *(unique_id_p + 1) + - *(unique_id_p + 2); - snprintf(s, max, "%08" PRIX32, unique_id); -#else + *(unique_id_p + 1) + + *(unique_id_p + 2); + /* Fetch serial number from chip's unique ID */ + for(i = 0; i < 8; i++) { + s[7-i] = ((unique_id >> (4*i)) & 0xF) + '0'; + } + for(i = 0; i < 8; i++) + if(s[i] > '9') + s[i] += 'A' - '9' - 1; +#elif DFU_SERIAL_LENGTH == 13 /* Use the same serial number as the ST DFU Bootloader.*/ uint16_t *uid = (uint16_t *)DESIG_UNIQUE_ID_BASE; -# if defined(STM32F4) +# if defined(STM32F4) || defined(STM32F7) int offset = 3; # elif defined(STM32L0) || defined(STM32F3) int offset = 5; # endif - snprintf(s, max, "%04X%04X%04X", + sprintf(s, "%04X%04X%04X", uid[1] + uid[5], uid[0] + uid[4], uid[offset]); - +#elif DFU_SERIAL_LENGTH == 25 + int i; + uint32_t unique_id[3]; + memcpy(unique_id, (uint32_t *)DESIG_UNIQUE_ID_BASE, 12); + for(i = 0; i < 8; i++) { + s[ 7-i] = ((unique_id[0] >> (4*i)) & 0xF) + '0'; + s[15-i] = ((unique_id[1] >> (4*i)) & 0xF) + '0'; + s[23-i] = ((unique_id[2] >> (4*i)) & 0xF) + '0'; + } + for (i = 0; i < 24; i++) + if(s[i] > '9') + s[i] += 'A' - '9' - 1; +#else +# WARNING "Unhandled DFU_SERIAL_LENGTH" #endif + s[DFU_SERIAL_LENGTH - 1] = 0; return s; } diff --git a/src/platforms/swlink/Makefile.inc b/src/platforms/swlink/Makefile.inc index 18841fb..4f9fa19 100644 --- a/src/platforms/swlink/Makefile.inc +++ b/src/platforms/swlink/Makefile.inc @@ -3,7 +3,7 @@ CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy CFLAGS += -mcpu=cortex-m3 -mthumb \ - -DSTM32F1 -DDISCOVERY_SWLINK -I../libopencm3/include \ + -DSTM32F1 -DDFU_SERIAL_LENGTH=9 -I../libopencm3/include \ -I platforms/stm32 LDFLAGS_BOOT := $(LDFLAGS) --specs=nano.specs -lopencm3_stm32f1 \ -Wl,-T,platforms/stm32/stlink.ld -nostartfiles -lc\ @@ -30,7 +30,7 @@ SRC += cdcacm.c \ all: blackmagic.bin blackmagic_dfu.bin blackmagic_dfu.hex -blackmagic_dfu.elf: usbdfu.o dfucore.o dfu_f1.o platform_common.o +blackmagic_dfu.elf: usbdfu.o dfucore.o dfu_f1.o platform_common.o serialno.o @echo " LD $@" $(Q)$(CC) $^ -o $@ $(LDFLAGS_BOOT)