Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit a4b00b0

Browse files
committed
at32f43x: Extend read unprotect to JTAG transport
1 parent 61d6092 commit a4b00b0

1 file changed

Lines changed: 45 additions & 2 deletions

File tree

src/target/at32f43x.c

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,47 @@ static bool at32f43_mass_erase(target_s *const target, platform_timeout_s *const
546546
return true;
547547
}
548548

549-
static bool at32f43x_swd_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
549+
/* Borrow macros from adiv5_jtag.c */
550+
#define JTAGDP_ACK_OK 0x02U
551+
#define JTAGDP_ACK_WAIT 0x01U
552+
553+
#define IR_DPACC 0xaU
554+
#define IR_APACC 0xbU
555+
556+
uint32_t adiv5_jtag_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
557+
{
558+
const bool is_ap = addr & ADIV5_APnDP;
559+
addr &= 0xffU;
560+
561+
const uint64_t request = ((uint64_t)value << 3U) | ((addr >> 1U) & 0x06U) | (rnw ? 1U : 0U);
562+
563+
uint32_t result = 0U;
564+
uint8_t ack = JTAGDP_ACK_WAIT;
565+
566+
jtag_dev_write_ir(dp->dev_index, is_ap ? IR_APACC : IR_DPACC);
567+
568+
platform_timeout_s timeout_progressbar;
569+
platform_timeout_set(&timeout_progressbar, 500U);
570+
platform_timeout_s timeout_erase;
571+
platform_timeout_set(&timeout_erase, 15000U);
572+
while (ack == JTAGDP_ACK_WAIT && !platform_timeout_is_expired(&timeout_erase)) {
573+
uint64_t response;
574+
jtag_dev_shift_dr(dp->dev_index, (uint8_t *)&response, (const uint8_t *)&request, 35);
575+
result = response >> 3U;
576+
ack = response & 0x07U;
577+
platform_delay(5U);
578+
target_print_progress(&timeout_progressbar);
579+
}
580+
581+
if (ack != JTAGDP_ACK_OK) {
582+
DEBUG_ERROR("JTAG access resulted in: %" PRIx32 ":%x\n", result, ack);
583+
raise_exception(EXCEPTION_ERROR, "JTAG-DP invalid ACK");
584+
}
585+
586+
return result;
587+
}
588+
589+
static bool adiv5_swd_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
550590
{
551591
const uint8_t request = make_packet_request(rnw, addr);
552592
uint32_t response = 0;
@@ -607,7 +647,10 @@ static bool at32f43x_mem_write_noabort(target_s *target, target_addr32_t dest, u
607647
volatile uint32_t rdbuff = 0;
608648
TRY (EXCEPTION_ALL) {
609649
//ack = ap->dp->low_access(dp, rnw, addr, value)
610-
rdbuff = at32f43x_swd_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
650+
if (ap->dp->low_access == adiv5_swd_raw_access)
651+
rdbuff = adiv5_swd_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
652+
else if (ap->dp->low_access == adiv5_jtag_raw_access)
653+
rdbuff = adiv5_jtag_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
611654
}
612655
CATCH () {
613656
case EXCEPTION_TIMEOUT:

0 commit comments

Comments
 (0)