This is an automated email from Gerrit. Antonio Borneo ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/4849
-- gerrit commit 8c4b275b6c8925adf67b7cb796617b7b33a2f724 Author: Antonio Borneo <[email protected]> Date: Tue Aug 28 16:26:30 2018 +0200 [RFC] target/arm_adi_v5: remove sequence declaration from include file A static array declared in an include file will cause a new instance of the array each time the file is included (then it's up to the linker to eventually remove the unused symbols). E.g. check with command: "nm openocd | grep swd_seq_jtag_to_swd" Move the declaration of Arm ADIv5 bit sequences from swd.h to the proper file arm_adi_v5.c and put the extern declarations in arm_adi_v5.h Change the names to the variables since they are not swd only. Note 1: I have labeled this change as [RFC] and I'm not going to give my +1 to it as is. This change creates a dependency of libocdjtagdrivers from libtarget and it will be probably considered as a layering violation. Is this change ok for you? Would it be better if I move the bit sequences in the existing file src/jtag/drivers/driver.c? Or is it needed a new file, e.g. src/jtag/drivers/arm_adi_v5.c? Note 2: another duplicate of two of these bit sequences is in - src/target/adi_v5_jtag.c: swd2jtag_bitseq[] - src/target/adi_v5_swd.c: jtag2swd_bitseq[] I will rework them once this change is finalized, but we can start considering them in this RFC. Change-Id: I58b43bdaff929640295776b1b7cc0714c43bb578 Signed-off-by: Antonio Borneo <[email protected]> diff --git a/src/jtag/drivers/bitbang.c b/src/jtag/drivers/bitbang.c index 722a5f2..dc3d76a 100644 --- a/src/jtag/drivers/bitbang.c +++ b/src/jtag/drivers/bitbang.c @@ -449,15 +449,15 @@ int bitbang_swd_switch_seq(enum swd_special_seq seq) switch (seq) { case LINE_RESET: LOG_DEBUG("SWD line reset"); - bitbang_exchange(false, (uint8_t *)swd_seq_line_reset, 0, swd_seq_line_reset_len); + bitbang_exchange(false, (uint8_t *)adiv5_seq_swd_line_reset, 0, adiv5_seq_swd_line_reset_len); break; case JTAG_TO_SWD: LOG_DEBUG("JTAG-to-SWD"); - bitbang_exchange(false, (uint8_t *)swd_seq_jtag_to_swd, 0, swd_seq_jtag_to_swd_len); + bitbang_exchange(false, (uint8_t *)adiv5_seq_jtag_to_swd, 0, adiv5_seq_jtag_to_swd_len); break; case SWD_TO_JTAG: LOG_DEBUG("SWD-to-JTAG"); - bitbang_exchange(false, (uint8_t *)swd_seq_swd_to_jtag, 0, swd_seq_swd_to_jtag_len); + bitbang_exchange(false, (uint8_t *)adiv5_seq_swd_to_jtag, 0, adiv5_seq_swd_to_jtag_len); break; default: LOG_ERROR("Sequence %d not supported", seq); @@ -470,7 +470,7 @@ int bitbang_swd_switch_seq(enum swd_special_seq seq) void bitbang_switch_to_swd(void) { LOG_DEBUG("bitbang_switch_to_swd"); - bitbang_exchange(false, (uint8_t *)swd_seq_jtag_to_swd, 0, swd_seq_jtag_to_swd_len); + bitbang_exchange(false, (uint8_t *)adiv5_seq_jtag_to_swd, 0, adiv5_seq_jtag_to_swd_len); } static void swd_clear_sticky_errors(void) diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c index 35649c2..b56475a 100644 --- a/src/jtag/drivers/buspirate.c +++ b/src/jtag/drivers/buspirate.c @@ -1316,18 +1316,18 @@ static int buspirate_swd_switch_seq(enum swd_special_seq seq) switch (seq) { case LINE_RESET: LOG_DEBUG("SWD line reset"); - sequence = swd_seq_line_reset; - sequence_len = DIV_ROUND_UP(swd_seq_line_reset_len, 8); + sequence = adiv5_seq_swd_line_reset; + sequence_len = DIV_ROUND_UP(adiv5_seq_swd_line_reset_len, 8); break; case JTAG_TO_SWD: LOG_DEBUG("JTAG-to-SWD"); - sequence = swd_seq_jtag_to_swd; - sequence_len = DIV_ROUND_UP(swd_seq_jtag_to_swd_len, 8); + sequence = adiv5_seq_jtag_to_swd; + sequence_len = DIV_ROUND_UP(adiv5_seq_jtag_to_swd_len, 8); break; case SWD_TO_JTAG: LOG_DEBUG("SWD-to-JTAG"); - sequence = swd_seq_swd_to_jtag; - sequence_len = DIV_ROUND_UP(swd_seq_swd_to_jtag_len, 8); + sequence = adiv5_seq_swd_to_jtag; + sequence_len = DIV_ROUND_UP(adiv5_seq_swd_to_jtag_len, 8); break; default: LOG_ERROR("Sequence %d not supported", seq); diff --git a/src/jtag/drivers/cmsis_dap_usb.c b/src/jtag/drivers/cmsis_dap_usb.c index 9d6bf7f..bdda727 100644 --- a/src/jtag/drivers/cmsis_dap_usb.c +++ b/src/jtag/drivers/cmsis_dap_usb.c @@ -922,18 +922,18 @@ static int cmsis_dap_swd_switch_seq(enum swd_special_seq seq) switch (seq) { case LINE_RESET: LOG_DEBUG("SWD line reset"); - s = swd_seq_line_reset; - s_len = swd_seq_line_reset_len; + s = adiv5_seq_swd_line_reset; + s_len = adiv5_seq_swd_line_reset_len; break; case JTAG_TO_SWD: LOG_DEBUG("JTAG-to-SWD"); - s = swd_seq_jtag_to_swd; - s_len = swd_seq_jtag_to_swd_len; + s = adiv5_seq_jtag_to_swd; + s_len = adiv5_seq_jtag_to_swd_len; break; case SWD_TO_JTAG: LOG_DEBUG("SWD-to-JTAG"); - s = swd_seq_swd_to_jtag; - s_len = swd_seq_swd_to_jtag_len; + s = adiv5_seq_swd_to_jtag; + s_len = adiv5_seq_swd_to_jtag_len; break; default: LOG_ERROR("Sequence %d not supported", seq); diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c index 1afedd1..3951a07 100644 --- a/src/jtag/drivers/ftdi.c +++ b/src/jtag/drivers/ftdi.c @@ -1242,17 +1242,17 @@ static int ftdi_swd_switch_seq(enum swd_special_seq seq) case LINE_RESET: LOG_DEBUG("SWD line reset"); ftdi_swd_swdio_en(true); - mpsse_clock_data_out(mpsse_ctx, swd_seq_line_reset, 0, swd_seq_line_reset_len, SWD_MODE); + mpsse_clock_data_out(mpsse_ctx, adiv5_seq_swd_line_reset, 0, adiv5_seq_swd_line_reset_len, SWD_MODE); break; case JTAG_TO_SWD: LOG_DEBUG("JTAG-to-SWD"); ftdi_swd_swdio_en(true); - mpsse_clock_data_out(mpsse_ctx, swd_seq_jtag_to_swd, 0, swd_seq_jtag_to_swd_len, SWD_MODE); + mpsse_clock_data_out(mpsse_ctx, adiv5_seq_jtag_to_swd, 0, adiv5_seq_jtag_to_swd_len, SWD_MODE); break; case SWD_TO_JTAG: LOG_DEBUG("SWD-to-JTAG"); ftdi_swd_swdio_en(true); - mpsse_clock_data_out(mpsse_ctx, swd_seq_swd_to_jtag, 0, swd_seq_swd_to_jtag_len, SWD_MODE); + mpsse_clock_data_out(mpsse_ctx, adiv5_seq_swd_to_jtag, 0, adiv5_seq_swd_to_jtag_len, SWD_MODE); break; default: LOG_ERROR("Sequence %d not supported", seq); diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c index e74965e..95dd719 100644 --- a/src/jtag/drivers/jlink.c +++ b/src/jtag/drivers/jlink.c @@ -2048,18 +2048,18 @@ static int jlink_swd_switch_seq(enum swd_special_seq seq) switch (seq) { case LINE_RESET: LOG_DEBUG("SWD line reset"); - s = swd_seq_line_reset; - s_len = swd_seq_line_reset_len; + s = adiv5_seq_swd_line_reset; + s_len = adiv5_seq_swd_line_reset_len; break; case JTAG_TO_SWD: LOG_DEBUG("JTAG-to-SWD"); - s = swd_seq_jtag_to_swd; - s_len = swd_seq_jtag_to_swd_len; + s = adiv5_seq_jtag_to_swd; + s_len = adiv5_seq_jtag_to_swd_len; break; case SWD_TO_JTAG: LOG_DEBUG("SWD-to-JTAG"); - s = swd_seq_swd_to_jtag; - s_len = swd_seq_swd_to_jtag_len; + s = adiv5_seq_swd_to_jtag; + s_len = adiv5_seq_swd_to_jtag_len; break; default: LOG_ERROR("Sequence %d not supported.", seq); diff --git a/src/jtag/drivers/vsllink.c b/src/jtag/drivers/vsllink.c index 6f7e9ca..2910dcf 100644 --- a/src/jtag/drivers/vsllink.c +++ b/src/jtag/drivers/vsllink.c @@ -764,18 +764,18 @@ static int vsllink_swd_switch_seq(enum swd_special_seq seq) switch (seq) { case LINE_RESET: LOG_DEBUG("SWD line reset"); - versaloon_interface.adaptors.swd.seqout(0, swd_seq_line_reset, - swd_seq_line_reset_len); + versaloon_interface.adaptors.swd.seqout(0, adiv5_seq_swd_line_reset, + adiv5_seq_swd_line_reset_len); break; case JTAG_TO_SWD: LOG_DEBUG("JTAG-to-SWD"); - versaloon_interface.adaptors.swd.seqout(0, swd_seq_jtag_to_swd, - swd_seq_jtag_to_swd_len); + versaloon_interface.adaptors.swd.seqout(0, adiv5_seq_jtag_to_swd, + adiv5_seq_jtag_to_swd_len); break; case SWD_TO_JTAG: LOG_DEBUG("SWD-to-JTAG"); - versaloon_interface.adaptors.swd.seqout(0, swd_seq_swd_to_jtag, - swd_seq_swd_to_jtag_len); + versaloon_interface.adaptors.swd.seqout(0, adiv5_seq_swd_to_jtag, + adiv5_seq_swd_to_jtag_len); break; default: LOG_ERROR("Sequence %d not supported", seq); diff --git a/src/jtag/swd.h b/src/jtag/swd.h index 52f41d5..602b5c6 100644 --- a/src/jtag/swd.h +++ b/src/jtag/swd.h @@ -53,72 +53,6 @@ static inline uint8_t swd_cmd(bool is_read, bool is_ap, uint8_t regnum) /* SWD_ACK_* bits are defined in <target/arm_adi_v5.h> */ -/** - * Line reset. - * - * Line reset is at least 50 SWCLK cycles with SWDIO driven high, followed - * by at least one idle (low) cycle. - */ -static const uint8_t swd_seq_line_reset[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 -}; -static const unsigned swd_seq_line_reset_len = 51; - -/** - * JTAG-to-SWD sequence. - * - * The JTAG-to-SWD sequence is at least 50 TCK/SWCLK cycles with TMS/SWDIO - * high, putting either interface logic into reset state, followed by a - * specific 16-bit sequence and finally a line reset in case the SWJ-DP was - * already in SWD mode. - */ -static const uint8_t swd_seq_jtag_to_swd[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x9e, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, -}; -static const unsigned swd_seq_jtag_to_swd_len = 118; - -/** - * SWD-to-JTAG sequence. - * - * The SWD-to-JTAG sequence is at least 50 TCK/SWCLK cycles with TMS/SWDIO - * high, putting either interface logic into reset state, followed by a - * specific 16-bit sequence and finally at least 5 TCK cycles to put the - * JTAG TAP in TLR. - */ -static const uint8_t swd_seq_swd_to_jtag[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9c, 0xff -}; -static const unsigned swd_seq_swd_to_jtag_len = 71; - -/** - * SWD-to-dormant sequence. - * - * This is at least 50 SWCLK cycles with SWDIO high to put the interface - * in reset state, followed by a specific 16-bit sequence. - */ -static const uint8_t swd_seq_swd_to_dormant[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x8e, 0x03 -}; -static const unsigned swd_seq_swd_to_dormant_len = 66; - -/** - * Dormant-to-SWD sequence. - * - * This is at least 8 TCK/SWCLK cycles with TMS/SWDIO high to abort any ongoing - * selection alert sequence, followed by a specific 128-bit selection alert - * sequence, followed by 4 TCK/SWCLK cycles with TMS/SWDIO low, followed by - * a specific protocol-dependent activation code. For SWD the activation code - * is an 8-bit sequence. The sequence ends with a line reset. - */ -static const uint8_t swd_seq_dormant_to_swd[] = { - 0xff, - 0x92, 0xf3, 0x09, 0x62, 0x95, 0x2d, 0x85, 0x86, - 0xe9, 0xaf, 0xdd, 0xe3, 0xa2, 0x0e, 0xbc, 0x19, - 0x10, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f -}; -static const unsigned swd_seq_dormant_to_swd_len = 199; - enum swd_special_seq { LINE_RESET, JTAG_TO_SWD, diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index 03e642b..3c96625 100644 --- a/src/target/arm_adi_v5.c +++ b/src/target/arm_adi_v5.c @@ -78,6 +78,72 @@ #include <helper/list.h> #include <helper/jim-nvp.h> +/** + * SWD Line reset. + * + * SWD Line reset is at least 50 SWCLK cycles with SWDIO driven high, + * followed by at least one idle (low) cycle. + */ +const uint8_t adiv5_seq_swd_line_reset[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 +}; +const unsigned adiv5_seq_swd_line_reset_len = 51; + +/** + * JTAG-to-SWD sequence. + * + * The JTAG-to-SWD sequence is at least 50 TCK/SWCLK cycles with TMS/SWDIO + * high, putting either interface logic into reset state, followed by a + * specific 16-bit sequence and finally a line reset in case the SWJ-DP was + * already in SWD mode. + */ +const uint8_t adiv5_seq_jtag_to_swd[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, +}; +const unsigned adiv5_seq_jtag_to_swd_len = 118; + +/** + * SWD-to-JTAG sequence. + * + * The SWD-to-JTAG sequence is at least 50 TCK/SWCLK cycles with TMS/SWDIO + * high, putting either interface logic into reset state, followed by a + * specific 16-bit sequence and finally at least 5 TCK cycles to put the + * JTAG TAP in TLR. + */ +const uint8_t adiv5_seq_swd_to_jtag[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9c, 0xff +}; +const unsigned adiv5_seq_swd_to_jtag_len = 71; + +/** + * SWD-to-dormant sequence. + * + * This is at least 50 SWCLK cycles with SWDIO high to put the interface + * in reset state, followed by a specific 16-bit sequence. + */ +const uint8_t adiv5_seq_swd_to_dormant[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x8e, 0x03 +}; +const unsigned adiv5_seq_swd_to_dormant_len = 66; + +/** + * Dormant-to-SWD sequence. + * + * This is at least 8 TCK/SWCLK cycles with TMS/SWDIO high to abort any ongoing + * selection alert sequence, followed by a specific 128-bit selection alert + * sequence, followed by 4 TCK/SWCLK cycles with TMS/SWDIO low, followed by + * a specific protocol-dependent activation code. For SWD the activation code + * is an 8-bit sequence. The sequence ends with a line reset. + */ +const uint8_t adiv5_seq_dormant_to_swd[] = { + 0xff, + 0x92, 0xf3, 0x09, 0x62, 0x95, 0x2d, 0x85, 0x86, + 0xe9, 0xaf, 0xdd, 0xe3, 0xa2, 0x0e, 0xbc, 0x19, + 0x10, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f +}; +const unsigned adiv5_seq_dormant_to_swd_len = 199; + /* ARM ADI Specification requires at least 10 bits used for TAR autoincrement */ /* diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h index a340b76..e9b44b3 100644 --- a/src/target/arm_adi_v5.h +++ b/src/target/arm_adi_v5.h @@ -295,6 +295,20 @@ struct dap_ops { }; /* + * Bit sequences + */ +extern const uint8_t adiv5_seq_swd_line_reset[]; +extern const unsigned adiv5_seq_swd_line_reset_len; +extern const uint8_t adiv5_seq_jtag_to_swd[]; +extern const unsigned adiv5_seq_jtag_to_swd_len; +extern const uint8_t adiv5_seq_swd_to_jtag[]; +extern const unsigned adiv5_seq_swd_to_jtag_len; +extern const uint8_t adiv5_seq_swd_to_dormant[]; +extern const unsigned adiv5_seq_swd_to_dormant_len; +extern const uint8_t adiv5_seq_dormant_to_swd[]; +extern const unsigned adiv5_seq_dormant_to_swd_len; + +/* * Access Port classes */ enum ap_class { -- _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
