From ef372d01617f599afa17d7809389aac90a1f6066 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Mon, 5 Aug 2019 15:24:16 +0200 Subject: [PATCH 1/6] build: Use a separate NO_LIBOPENCM3 flag to disable libopencm3 This prepares to allow other architectures than pc that don't use libopencm3. Signed-off-by: Sylvain Munaut --- Makefile | 7 +++++-- src/include/gdb_if.h | 2 +- src/platforms/libftdi/Makefile.inc | 2 +- src/platforms/pc-stlinkv2/Makefile.inc | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index a3446b00..db9178f4 100644 --- a/Makefile +++ b/Makefile @@ -4,15 +4,18 @@ Q := @ endif PC_HOSTED = +NO_LIBOPENCM3 = ifeq ($(PROBE_HOST), libftdi) PC_HOSTED = true + NO_LIBOPENCM3 = true endif ifeq ($(PROBE_HOST), pc-stlinkv2) PC_HOSTED = true + NO_LIBOPENCM3 = true endif all: -ifndef PC_HOSTED +ifndef NO_LIBOPENCM3 $(Q)if [ ! -f libopencm3/Makefile ]; then \ echo "Initialising git submodules..." ;\ git submodule init ;\ @@ -23,7 +26,7 @@ endif $(Q)$(MAKE) $(MFLAGS) -C src clean: -ifndef PC_HOSTED +ifndef NO_LIBOPENCM3 $(Q)$(MAKE) $(MFLAGS) -C libopencm3 $@ endif $(Q)$(MAKE) $(MFLAGS) -C src $@ diff --git a/src/include/gdb_if.h b/src/include/gdb_if.h index d2ad2439..1dc9e28d 100644 --- a/src/include/gdb_if.h +++ b/src/include/gdb_if.h @@ -21,7 +21,7 @@ #ifndef __GDB_IF_H #define __GDB_IF_H -#if !defined(PC_HOSTED) +#if !defined(NO_LIBOPENCM3) #include void gdb_usb_out_cb(usbd_device *dev, uint8_t ep); #endif diff --git a/src/platforms/libftdi/Makefile.inc b/src/platforms/libftdi/Makefile.inc index 06c07d76..0ddabe89 100644 --- a/src/platforms/libftdi/Makefile.inc +++ b/src/platforms/libftdi/Makefile.inc @@ -1,5 +1,5 @@ SYS = $(shell $(CC) -dumpmachine) -CFLAGS += -DPC_HOSTED -DENABLE_DEBUG +CFLAGS += -DPC_HOSTED -DNO_LIBOPENCM3 -DENABLE_DEBUG LDFLAGS += -lftdi1 ifneq (, $(findstring mingw, $(SYS))) LDFLAGS += -lusb-1.0 -lws2_32 diff --git a/src/platforms/pc-stlinkv2/Makefile.inc b/src/platforms/pc-stlinkv2/Makefile.inc index 53ec16a1..8762885d 100644 --- a/src/platforms/pc-stlinkv2/Makefile.inc +++ b/src/platforms/pc-stlinkv2/Makefile.inc @@ -1,6 +1,6 @@ TARGET=blackmagic_stlinkv2 SYS = $(shell $(CC) -dumpmachine) -CFLAGS += -DPC_HOSTED -DSTLINKV2 -DJTAG_HL -DENABLE_DEBUG +CFLAGS += -DPC_HOSTED -DNO_LIBOPENCM3 -DSTLINKV2 -DJTAG_HL -DENABLE_DEBUG CFLAGS +=-I ./target LDFLAGS += -lusb-1.0 ifneq (, $(findstring mingw, $(SYS))) From 804ec24df93338c85f9d4e0fc51bfe3a8f5695f1 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Mon, 5 Aug 2019 15:29:00 +0200 Subject: [PATCH 2/6] build: Apply OPT_FLAGS after platform Makefile.inc include This allows the platform to specify another optimization level than the default (like -Os if space is limited) Signed-off-by: Sylvain Munaut --- src/Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Makefile b/src/Makefile index 72132449..ec34d361 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,12 +8,9 @@ MAKEFLAGS += --no-print-dir Q := @ endif -OPT_FLAGS ?= -O2 - CFLAGS += -Wall -Wextra -Werror -Wno-char-subscripts -Wno-cast-function-type \ - $(OPT_FLAGS) -std=gnu99 -g3 -MD \ + -std=gnu99 -g3 -MD \ -I. -Iinclude -Iplatforms/common -I$(PLATFORM_DIR) -LDFLAGS += $(OPT_FLAGS) ifeq ($(ENABLE_DEBUG), 1) CFLAGS += -DENABLE_DEBUG @@ -60,6 +57,10 @@ SRC = \ include $(PLATFORM_DIR)/Makefile.inc +OPT_FLAGS ?= -O2 +CFLAGS += $(OPT_FLAGS) +LDFLAGS += $(OPT_FLAGS) + ifndef TARGET TARGET=blackmagic endif From 544bcd9845cc03ec1db5a0f0b5687b2e658fe431 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Mon, 5 Aug 2019 15:41:46 +0200 Subject: [PATCH 3/6] build: Allow support for .S assembly file in SRC Signed-off-by: Sylvain Munaut --- src/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index ec34d361..05f032e0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -73,7 +73,7 @@ ifndef OWN_HL SRC += jtag_scan.c jtagtap.c swdptap.c endif -OBJ = $(SRC:.c=.o) +OBJ = $(patsubst %.S,%.o,$(patsubst %.c,%.o,$(SRC))) $(TARGET): include/version.h $(OBJ) @echo " LD $@" @@ -83,6 +83,10 @@ $(TARGET): include/version.h $(OBJ) @echo " CC $<" $(Q)$(CC) $(CFLAGS) -c $< -o $@ +%.o: %.S + @echo " AS $<" + $(Q)$(CC) $(CFLAGS) -c $< -o $@ + %.bin: % @echo " OBJCOPY $@" $(Q)$(OBJCOPY) -O binary $^ $@ From 1d4152a36ff021d95c1ab9ad22bda7aae020bc0f Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Mon, 5 Aug 2019 15:42:29 +0200 Subject: [PATCH 4/6] target: Make sure variant_string is consistent in size It's a global symbol and LTO will complain if the one in this file and the one in EFM32 target are inconsistent. Signed-off-by: Sylvain Munaut --- src/target/samd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/target/samd.c b/src/target/samd.c index 588ca83c..13e97fd9 100644 --- a/src/target/samd.c +++ b/src/target/samd.c @@ -364,7 +364,7 @@ static void samd_add_flash(target *t, uint32_t addr, size_t length) target_add_flash(t, f); } -char variant_string[40]; +char variant_string[60]; bool samd_probe(target *t) { uint32_t cid = samd_read_cid(t); From 4289788e0b4d264b0445806eb6d0b1b74ecfd1a1 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Mon, 5 Aug 2019 15:43:33 +0200 Subject: [PATCH 5/6] src: Replace sprintf with snprintf snprintf is needed anyway, that's one less function to have :p And it's bad practice anyway. Signed-off-by: Sylvain Munaut --- src/gdb_packet.c | 2 +- src/target/efm32.c | 2 +- src/target/samd.c | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/gdb_packet.c b/src/gdb_packet.c index f738996a..0396e0d3 100644 --- a/src/gdb_packet.c +++ b/src/gdb_packet.c @@ -120,7 +120,7 @@ void gdb_putpacket(const char *packet, int size) } } gdb_if_putchar('#', 0); - sprintf(xmit_csum, "%02X", csum); + snprintf(xmit_csum, sizeof(xmit_csum), "%02X", csum); gdb_if_putchar(xmit_csum[0], 0); gdb_if_putchar(xmit_csum[1], 1); #ifdef DEBUG_GDBPACKET diff --git a/src/target/efm32.c b/src/target/efm32.c index fff186ba..4405d99a 100644 --- a/src/target/efm32.c +++ b/src/target/efm32.c @@ -611,7 +611,7 @@ bool efm32_probe(target *t) uint32_t ram_size = ram_kib * 0x400; uint32_t flash_page_size = device->flash_page_size; - sprintf(variant_string, "%c\b%c\b%s %d F%d %s", + snprintf(variant_string, sizeof(variant_string), "%c\b%c\b%s %d F%d %s", di_version + 48, (uint8_t)device_index + 32, device->name, part_number, flash_kib, device->description); diff --git a/src/target/samd.c b/src/target/samd.c index 13e97fd9..3117f2ae 100644 --- a/src/target/samd.c +++ b/src/target/samd.c @@ -390,15 +390,15 @@ bool samd_probe(target *t) /* Part String */ if (protected) { - sprintf(variant_string, - "Atmel SAMD%d%c%dA%s (rev %c) (PROT=1)", - samd.series, samd.pin, samd.mem, - samd.package, samd.revision); + snprintf(variant_string, sizeof(variant_string), + "Atmel SAMD%d%c%dA%s (rev %c) (PROT=1)", + samd.series, samd.pin, samd.mem, + samd.package, samd.revision); } else { - sprintf(variant_string, - "Atmel SAMD%d%c%dA%s (rev %c)", - samd.series, samd.pin, samd.mem, - samd.package, samd.revision); + snprintf(variant_string, sizeof(variant_string), + "Atmel SAMD%d%c%dA%s (rev %c)", + samd.series, samd.pin, samd.mem, + samd.package, samd.revision); } /* Setup Target */ From 443ced62d4e47d73da13746a836369d8421b4fe8 Mon Sep 17 00:00:00 2001 From: Brennan Ashton Date: Tue, 13 Aug 2019 23:31:07 -0700 Subject: [PATCH 6/6] Target latest libopencm3 Required fixes: * use usbd_request_return_codes -- commit 54b117c5a5767df8dc114612dfd8e8cb88b72c6b * drop deprecated timer_reset() -- commit 034dbf20ff8c54dcbee5238390b37a0d35180f44 * drop 48 & 120 MHz configs -- commit a9dde2832eb8039b9e0d21a50b9b991ddbfc4e2d * ld scripts: drop duplication of standard sections -- commit 9a05dcb6c0aef712052d337457838f6041ffd57a --- libopencm3 | 2 +- src/platforms/common/cdcacm.c | 24 ++++++++++++------------ src/platforms/f4discovery/platform.c | 2 +- src/platforms/hydrabus/platform.c | 2 +- src/platforms/launchpad-icdi/platform.h | 2 +- src/platforms/stm32/blackmagic.ld | 2 +- src/platforms/stm32/dfucore.c | 24 ++++++++++++------------ src/platforms/stm32/f4discovery.ld | 2 +- src/platforms/stm32/stlink.ld | 2 +- src/platforms/stm32/stm32_can.ld | 2 +- src/platforms/stm32/traceswo.c | 2 -- src/platforms/stm32/usbuart.c | 1 - src/platforms/tm4c/tm4c.ld | 2 +- 13 files changed, 33 insertions(+), 36 deletions(-) diff --git a/libopencm3 b/libopencm3 index db7a8d71..3eff201a 160000 --- a/libopencm3 +++ b/libopencm3 @@ -1 +1 @@ -Subproject commit db7a8d71ca30dd9ce7947aa036897b910bdc4ad2 +Subproject commit 3eff201a4bb3759a9c967a6f5e3fd0aad46dc5af diff --git a/src/platforms/common/cdcacm.c b/src/platforms/common/cdcacm.c index ccf6706e..8f5f779b 100644 --- a/src/platforms/common/cdcacm.c +++ b/src/platforms/common/cdcacm.c @@ -419,7 +419,7 @@ static void dfu_detach_complete(usbd_device *dev, struct usb_setup_data *req) scb_reset_core(); } -static int cdcacm_control_request(usbd_device *dev, +static enum usbd_request_return_codes cdcacm_control_request(usbd_device *dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void (**complete)(usbd_device *dev, struct usb_setup_data *req)) { @@ -433,23 +433,23 @@ static int cdcacm_control_request(usbd_device *dev, cdcacm_set_modem_state(dev, req->wIndex, true, true); /* Ignore if not for GDB interface */ if(req->wIndex != 0) - return 1; + return USBD_REQ_HANDLED; cdcacm_gdb_dtr = req->wValue & 1; - return 1; + return USBD_REQ_HANDLED; case USB_CDC_REQ_SET_LINE_CODING: if(*len < sizeof(struct usb_cdc_line_coding)) - return 0; + return USBD_REQ_NOTSUPP; switch(req->wIndex) { case 2: usbuart_set_line_coding((struct usb_cdc_line_coding*)*buf); - return 1; + return USBD_REQ_HANDLED; case 0: - return 1; /* Ignore on GDB Port */ + return USBD_REQ_HANDLED; /* Ignore on GDB Port */ default: - return 0; + return USBD_REQ_NOTSUPP; } case DFU_GETSTATUS: if(req->wIndex == DFU_IF_NO) { @@ -461,17 +461,17 @@ static int cdcacm_control_request(usbd_device *dev, (*buf)[5] = 0; /* iString not used here */ *len = 6; - return 1; + return USBD_REQ_HANDLED; } - return 0; + return USBD_REQ_NOTSUPP; case DFU_DETACH: if(req->wIndex == DFU_IF_NO) { *complete = dfu_detach_complete; - return 1; + return USBD_REQ_HANDLED; } - return 0; + return USBD_REQ_NOTSUPP; } - return 0; + return USBD_REQ_NOTSUPP; } int cdcacm_get_config(void) diff --git a/src/platforms/f4discovery/platform.c b/src/platforms/f4discovery/platform.c index 89b82c16..4703317d 100644 --- a/src/platforms/f4discovery/platform.c +++ b/src/platforms/f4discovery/platform.c @@ -62,7 +62,7 @@ void platform_init(void) scb_reset_core(); } - rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_48MHZ]); + rcc_clock_setup_pll(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]); /* Enable peripherals */ rcc_periph_clock_enable(RCC_OTGFS); diff --git a/src/platforms/hydrabus/platform.c b/src/platforms/hydrabus/platform.c index bf3db04b..e0893e8c 100644 --- a/src/platforms/hydrabus/platform.c +++ b/src/platforms/hydrabus/platform.c @@ -46,7 +46,7 @@ void platform_init(void) scb_reset_core(); } - rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_48MHZ]); + rcc_clock_setup_pll(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]); /* Enable peripherals */ rcc_peripheral_enable_clock(&RCC_AHB2ENR, RCC_AHB2ENR_OTGFSEN); diff --git a/src/platforms/launchpad-icdi/platform.h b/src/platforms/launchpad-icdi/platform.h index a710c52b..7450aa74 100644 --- a/src/platforms/launchpad-icdi/platform.h +++ b/src/platforms/launchpad-icdi/platform.h @@ -68,7 +68,7 @@ extern uint8_t running_status; gpio_set_output_config(SWDIO_PORT, GPIO_OTYPE_PP, GPIO_DRIVE_2MA, SWDIO_PIN); \ } -extern usbd_driver lm4f_usb_driver; +extern const usbd_driver lm4f_usb_driver; #define USB_DRIVER lm4f_usb_driver #define USB_IRQ NVIC_USB0_IRQ #define USB_ISR usb0_isr diff --git a/src/platforms/stm32/blackmagic.ld b/src/platforms/stm32/blackmagic.ld index 9755309e..c1d1ce78 100644 --- a/src/platforms/stm32/blackmagic.ld +++ b/src/platforms/stm32/blackmagic.ld @@ -25,5 +25,5 @@ MEMORY } /* Include the common ld script from libopenstm32. */ -INCLUDE libopencm3_stm32f1.ld +INCLUDE cortex-m-generic.ld diff --git a/src/platforms/stm32/dfucore.c b/src/platforms/stm32/dfucore.c index 61cfd041..adeff9ae 100644 --- a/src/platforms/stm32/dfucore.c +++ b/src/platforms/stm32/dfucore.c @@ -198,20 +198,20 @@ usbdfu_getstatus_complete(usbd_device *dev, struct usb_setup_data *req) } } -static int usbdfu_control_request(usbd_device *dev, +static enum usbd_request_return_codes usbdfu_control_request(usbd_device *dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void (**complete)(usbd_device *dev, struct usb_setup_data *req)) { (void)dev; if((req->bmRequestType & 0x7F) != 0x21) - return 0; /* Only accept class request */ + return USBD_REQ_NOTSUPP; /* Only accept class request */ switch(req->bRequest) { case DFU_DNLOAD: if((len == NULL) || (*len == 0)) { usbdfu_state = STATE_DFU_MANIFEST_SYNC; - return 1; + return USBD_REQ_HANDLED; } else { /* Copy download data for use on GET_STATUS */ prog.blocknum = req->wValue; @@ -222,22 +222,22 @@ static int usbdfu_control_request(usbd_device *dev, if ((addr < app_address) || (addr >= max_address)) { current_error = DFU_STATUS_ERR_TARGET; usbdfu_state = STATE_DFU_ERROR; - return 1; + return USBD_REQ_HANDLED; } else prog.addr = addr; } usbdfu_state = STATE_DFU_DNLOAD_SYNC; - return 1; + return USBD_REQ_HANDLED; } case DFU_CLRSTATUS: /* Clear error and return to dfuIDLE */ if(usbdfu_state == STATE_DFU_ERROR) usbdfu_state = STATE_DFU_IDLE; - return 1; + return USBD_REQ_HANDLED; case DFU_ABORT: /* Abort returns to dfuIDLE state */ usbdfu_state = STATE_DFU_IDLE; - return 1; + return USBD_REQ_HANDLED; case DFU_UPLOAD: if ((usbdfu_state == STATE_DFU_IDLE) || (usbdfu_state == STATE_DFU_DNLOAD_IDLE) || @@ -250,10 +250,10 @@ static int usbdfu_control_request(usbd_device *dev, dfu_function.wTransferSize); memcpy(*buf, (void*)baseaddr, *len); } - return 1; + return USBD_REQ_HANDLED; } else { usbd_ep_stall_set(dev, 0, 1); - return 0; + return USBD_REQ_NOTSUPP; } case DFU_GETSTATUS: { uint32_t bwPollTimeout = 0; /* 24-bit integer in DFU class spec */ @@ -268,16 +268,16 @@ static int usbdfu_control_request(usbd_device *dev, *complete = usbdfu_getstatus_complete; - return 1; + return USBD_REQ_HANDLED; } case DFU_GETSTATE: /* Return state with no state transision */ *buf[0] = usbdfu_state; *len = 1; - return 1; + return USBD_REQ_HANDLED; } - return 0; + return USBD_REQ_NOTSUPP; } void dfu_init(const usbd_driver *driver, dfu_mode_t mode) diff --git a/src/platforms/stm32/f4discovery.ld b/src/platforms/stm32/f4discovery.ld index b0664264..812d2ebb 100644 --- a/src/platforms/stm32/f4discovery.ld +++ b/src/platforms/stm32/f4discovery.ld @@ -25,5 +25,5 @@ MEMORY } /* Include the common ld script from libopenstm32. */ -INCLUDE libopencm3_stm32f4.ld +INCLUDE cortex-m-generic.ld diff --git a/src/platforms/stm32/stlink.ld b/src/platforms/stm32/stlink.ld index 3b4af4ea..64a3a846 100644 --- a/src/platforms/stm32/stlink.ld +++ b/src/platforms/stm32/stlink.ld @@ -25,4 +25,4 @@ MEMORY } /* Include the common ld script from libopenstm32. */ -INCLUDE libopencm3_stm32f1.ld +INCLUDE cortex-m-generic.ld diff --git a/src/platforms/stm32/stm32_can.ld b/src/platforms/stm32/stm32_can.ld index 86861b8d..0b497fcd 100644 --- a/src/platforms/stm32/stm32_can.ld +++ b/src/platforms/stm32/stm32_can.ld @@ -25,4 +25,4 @@ MEMORY } /* Include the common ld script from libopenstm32. */ -INCLUDE libopencm3_stm32f1.ld +INCLUDE cortex-m-generic.ld diff --git a/src/platforms/stm32/traceswo.c b/src/platforms/stm32/traceswo.c index 50073788..25ae60a0 100644 --- a/src/platforms/stm32/traceswo.c +++ b/src/platforms/stm32/traceswo.c @@ -42,8 +42,6 @@ void traceswo_init(void) { TRACE_TIM_CLK_EN(); - timer_reset(TRACE_TIM); - /* Refer to ST doc RM0008 - STM32F10xx Reference Manual. * Section 14.3.4 - 14.3.6 (General Purpose Timer - Input Capture) * diff --git a/src/platforms/stm32/usbuart.c b/src/platforms/stm32/usbuart.c index a466ab55..ddcda807 100644 --- a/src/platforms/stm32/usbuart.c +++ b/src/platforms/stm32/usbuart.c @@ -68,7 +68,6 @@ void usbuart_init(void) /* Setup timer for running deferred FIFO processing */ USBUSART_TIM_CLK_EN(); - timer_reset(USBUSART_TIM); timer_set_mode(USBUSART_TIM, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); timer_set_prescaler(USBUSART_TIM, diff --git a/src/platforms/tm4c/tm4c.ld b/src/platforms/tm4c/tm4c.ld index 8fe93a40..c2169c7e 100644 --- a/src/platforms/tm4c/tm4c.ld +++ b/src/platforms/tm4c/tm4c.ld @@ -25,5 +25,5 @@ MEMORY } /* Include the common ld script from libopenstm32. */ -INCLUDE libopencm3_lm4f.ld +INCLUDE cortex-m-generic.ld