From 067956266c886d377231ffdd89e630e41aeb2783 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Thu, 18 Jul 2019 18:16:19 +0200 Subject: [PATCH 1/2] Adiv5: Remove weak attribute to ease windows compile. --- src/platforms/pc-stlinkv2/stlinkv2.c | 6 +++++- src/target/adiv5.c | 23 ++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/platforms/pc-stlinkv2/stlinkv2.c b/src/platforms/pc-stlinkv2/stlinkv2.c index eadc42d..9d2f9b2 100644 --- a/src/platforms/pc-stlinkv2/stlinkv2.c +++ b/src/platforms/pc-stlinkv2/stlinkv2.c @@ -82,6 +82,7 @@ #define STLINK_SWD_AP_WDATA_ERROR 0x18 #define STLINK_SWD_AP_STICKY_ERROR 0x19 #define STLINK_SWD_AP_STICKYORUN_ERROR 0x1a +#define STLINK_BAD_AP_ERROR 0x1d #define STLINK_JTAG_UNKNOWN_CMD 0x42 #define STLINK_CORE_RUNNING 0x80 @@ -455,6 +456,9 @@ static int stlink_usb_error_check(uint8_t *data, bool verbose) if (verbose) DEBUG("STLINK_SWD_AP_STICKYORUN_ERROR\n"); return STLINK_ERROR_FAIL; + case STLINK_BAD_AP_ERROR: + /* ADIV5 probe 256 APs, most of them are non exisitant.*/ + return STLINK_ERROR_FAIL; case STLINK_JTAG_UNKNOWN_CMD : if (verbose) DEBUG("STLINK_JTAG_UNKNOWN_CMD\n"); @@ -1055,7 +1059,7 @@ bool adiv5_ap_setup(int ap) return true; } -void div5_ap_cleanup(int ap) +void adiv5_ap_cleanup(int ap) { uint8_t cmd[16] = { STLINK_DEBUG_COMMAND, diff --git a/src/target/adiv5.c b/src/target/adiv5.c index acf8111..0e507c1 100644 --- a/src/target/adiv5.c +++ b/src/target/adiv5.c @@ -390,9 +390,8 @@ static bool adiv5_component_probe(ADIv5_AP_t *ap, uint32_t addr, int recursion, } return res; } - -bool __attribute__((weak)) adiv5_ap_setup(int i) {(void)i; return true;} -void __attribute__((weak)) adiv5_ap_cleanup(int i) {(void)i;} +bool adiv5_ap_setup(int i); +void adiv5_ap_cleanup(int i); ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel) { @@ -528,6 +527,11 @@ void adiv5_dp_init(ADIv5_DP_t *dp) #define ALIGNOF(x) (((x) & 3) == 0 ? ALIGN_WORD : \ (((x) & 1) == 0 ? ALIGN_HALFWORD : ALIGN_BYTE)) +#if !defined(JTAG_HL) + +bool adiv5_ap_setup(int i) {(void)i; return true;} +void adiv5_ap_cleanup(int i) {(void)i;} + /* Program the CSW and TAR for sequencial access at a given width */ static void ap_mem_access_setup(ADIv5_AP_t *ap, uint32_t addr, enum align align) { @@ -567,8 +571,7 @@ static void * extract(void *dest, uint32_t src, uint32_t val, enum align align) return (uint8_t *)dest + (1 << align); } -void __attribute__((weak)) -adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len) +void adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len) { uint32_t tmp; uint32_t osrc = src; @@ -598,8 +601,7 @@ adiv5_mem_read(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len) extract(dest, src, tmp, align); } -void __attribute__((weak)) -adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src, +void adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len, enum align align) { uint32_t odest = dest; @@ -634,16 +636,14 @@ adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src, } } -void __attribute__((weak)) -adiv5_ap_write(ADIv5_AP_t *ap, uint16_t addr, uint32_t value) +void adiv5_ap_write(ADIv5_AP_t *ap, uint16_t addr, uint32_t value) { adiv5_dp_write(ap->dp, ADIV5_DP_SELECT, ((uint32_t)ap->apsel << 24)|(addr & 0xF0)); adiv5_dp_write(ap->dp, addr, value); } -uint32_t __attribute__((weak)) -adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr) +uint32_t adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr) { uint32_t ret; adiv5_dp_write(ap->dp, ADIV5_DP_SELECT, @@ -651,6 +651,7 @@ adiv5_ap_read(ADIv5_AP_t *ap, uint16_t addr) ret = adiv5_dp_read(ap->dp, addr); return ret; } +#endif void adiv5_mem_write(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len) { From e29f2b4fb95601291afced3af3731385be343988 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Thu, 18 Jul 2019 20:44:59 +0200 Subject: [PATCH 2/2] jtag/swd: Rename defines/make variables to allow removal of weak attribute jtagtap.c is libopencm3 generic. Move to common. --- .gitignore | 2 +- src/Makefile | 8 ++++---- src/include/gdb_if.h | 2 +- src/include/platform_support.h | 2 +- src/include/swdptap.h | 4 +++- src/main.c | 2 +- src/platforms/{stm32 => common}/jtagtap.c | 0 src/platforms/libftdi/Makefile.inc | 2 +- src/platforms/pc-stlinkv2/Makefile.inc | 5 ++--- src/target/jtagtap_generic.c | 9 +++------ src/target/swdptap_generic.c | 12 ++++-------- src/target/target.c | 2 +- 12 files changed, 22 insertions(+), 28 deletions(-) rename src/platforms/{stm32 => common}/jtagtap.c (100%) diff --git a/.gitignore b/.gitignore index a40d44d..945fd3d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,4 @@ tags *.b#* blackmagic_upgrade *.exe - +.vscode diff --git a/src/Makefile b/src/Makefile index 396bfec..7213244 100644 --- a/src/Makefile +++ b/src/Makefile @@ -64,12 +64,12 @@ ifndef TARGET TARGET=blackmagic endif -ifndef SWD_HL -SRC += swdptap.c swdptap_generic.c +ifdef NO_OWN_LL +SRC += jtagtap_generic.c swdptap_generic.c endif -ifndef JTAG_HL -SRC += jtag_scan.c jtagtap.c jtagtap_generic.c +ifndef OWN_HL +SRC += jtag_scan.c jtagtap.c swdptap.c endif OBJ = $(SRC:.c=.o) diff --git a/src/include/gdb_if.h b/src/include/gdb_if.h index 3307454..d2ad243 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(LIBFTDI) +#if !defined(PC_HOSTED) #include void gdb_usb_out_cb(usbd_device *dev, uint8_t ep); #endif diff --git a/src/include/platform_support.h b/src/include/platform_support.h index f595ad1..d431393 100644 --- a/src/include/platform_support.h +++ b/src/include/platform_support.h @@ -24,7 +24,7 @@ # error "Include 'general.h' instead" #endif -#if defined(LIBFTDI) +#if defined(PC_HOSTED) void platform_init(int argc, char **argv); #else void platform_init(void); diff --git a/src/include/swdptap.h b/src/include/swdptap.h index c51a28c..cdb6969 100644 --- a/src/include/swdptap.h +++ b/src/include/swdptap.h @@ -27,7 +27,9 @@ int swdptap_init(void); bool swdptap_bit_in(void); void swdptap_bit_out(bool val); -/* High level functions, provided as weak in swdptap_generic.c */ +/* Low level functions, provided in swdptap_generic.c from the primitives + (indicate NO_OWN_LL in the Makefile.inc or libopencm specific in + platforms/common*/ uint32_t swdptap_seq_in(int ticks); bool swdptap_seq_in_parity(uint32_t *data, int ticks); void swdptap_seq_out(uint32_t MS, int ticks); diff --git a/src/main.c b/src/main.c index de11953..26e8ffd 100644 --- a/src/main.c +++ b/src/main.c @@ -33,7 +33,7 @@ int main(int argc, char **argv) { -#if defined(LIBFTDI) +#if defined(PC_HOSTED) platform_init(argc, argv); #else (void) argc; diff --git a/src/platforms/stm32/jtagtap.c b/src/platforms/common/jtagtap.c similarity index 100% rename from src/platforms/stm32/jtagtap.c rename to src/platforms/common/jtagtap.c diff --git a/src/platforms/libftdi/Makefile.inc b/src/platforms/libftdi/Makefile.inc index c22d101..06c07d7 100644 --- a/src/platforms/libftdi/Makefile.inc +++ b/src/platforms/libftdi/Makefile.inc @@ -1,5 +1,5 @@ SYS = $(shell $(CC) -dumpmachine) -CFLAGS += -DLIBFTDI -DENABLE_DEBUG +CFLAGS += -DPC_HOSTED -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 7fa2479..53ec16a 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 += -DLIBFTDI -DSTLINKV2 -DJTAG_HL -DENABLE_DEBUG +CFLAGS += -DPC_HOSTED -DSTLINKV2 -DJTAG_HL -DENABLE_DEBUG CFLAGS +=-I ./target LDFLAGS += -lusb-1.0 ifneq (, $(findstring mingw, $(SYS))) @@ -11,5 +11,4 @@ LDFLAGS += -lws2_32 endif VPATH += platforms/pc SRC += timing.c stlinkv2.c -SWD_HL = 1 -JTAG_HL = 1 +OWN_HL = 1 diff --git a/src/target/jtagtap_generic.c b/src/target/jtagtap_generic.c index 416bcb6..249c087 100644 --- a/src/target/jtagtap_generic.c +++ b/src/target/jtagtap_generic.c @@ -24,8 +24,7 @@ #include "general.h" #include "jtagtap.h" -void __attribute__((weak)) -jtagtap_tms_seq(uint32_t MS, int ticks) +void jtagtap_tms_seq(uint32_t MS, int ticks) { while(ticks--) { jtagtap_next(MS & 1, 1); @@ -33,8 +32,7 @@ jtagtap_tms_seq(uint32_t MS, int ticks) } } -void __attribute__((weak)) -jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) +void jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks) { uint8_t index = 1; while(ticks--) { @@ -50,8 +48,7 @@ jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int } } -void __attribute__((weak)) -jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks) +void jtagtap_tdi_seq(const uint8_t final_tms, const uint8_t *DI, int ticks) { uint8_t index = 1; while(ticks--) { diff --git a/src/target/swdptap_generic.c b/src/target/swdptap_generic.c index 13ee02f..d170eb0 100644 --- a/src/target/swdptap_generic.c +++ b/src/target/swdptap_generic.c @@ -20,8 +20,7 @@ #include "general.h" #include "swdptap.h" -uint32_t __attribute__((weak)) -swdptap_seq_in(int ticks) +uint32_t swdptap_seq_in(int ticks) { uint32_t index = 1; uint32_t ret = 0; @@ -35,8 +34,7 @@ swdptap_seq_in(int ticks) return ret; } -bool __attribute__((weak)) -swdptap_seq_in_parity(uint32_t *ret, int ticks) +bool swdptap_seq_in_parity(uint32_t *ret, int ticks) { uint32_t index = 1; uint8_t parity = 0; @@ -55,8 +53,7 @@ swdptap_seq_in_parity(uint32_t *ret, int ticks) return parity; } -void __attribute__((weak)) -swdptap_seq_out(uint32_t MS, int ticks) +void swdptap_seq_out(uint32_t MS, int ticks) { while (ticks--) { swdptap_bit_out(MS & 1); @@ -64,8 +61,7 @@ swdptap_seq_out(uint32_t MS, int ticks) } } -void __attribute__((weak)) -swdptap_seq_out_parity(uint32_t MS, int ticks) +void swdptap_seq_out_parity(uint32_t MS, int ticks) { uint8_t parity = 0; diff --git a/src/target/target.c b/src/target/target.c index 48dc748..db396a3 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -314,7 +314,7 @@ void target_detach(target *t) { t->detach(t); t->attached = false; -#if defined(LIBFTDI) +#if defined(PC_HOSTED) # include "platform.h" platform_buffer_flush(); #endif