Skip to content

Commit e253ad2

Browse files
committed
at32f43x: Extend read unprotect to JTAG transport
1 parent 571b8ac commit e253ad2

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

src/target/at32f43x.c

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,47 @@ static bool at32f43_mass_erase(target_s *target)
554554
return true;
555555
}
556556

557-
static bool at32f43x_swd_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
557+
/* Borrow macros from adiv5_jtag.c */
558+
#define JTAGDP_ACK_OK 0x02U
559+
#define JTAGDP_ACK_WAIT 0x01U
560+
561+
#define IR_DPACC 0xaU
562+
#define IR_APACC 0xbU
563+
564+
uint32_t adiv5_jtag_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
565+
{
566+
const bool is_ap = addr & ADIV5_APnDP;
567+
addr &= 0xffU;
568+
569+
const uint64_t request = ((uint64_t)value << 3U) | ((addr >> 1U) & 0x06U) | (rnw ? 1U : 0U);
570+
571+
uint32_t result = 0U;
572+
uint8_t ack = JTAGDP_ACK_WAIT;
573+
574+
jtag_dev_write_ir(dp->dev_index, is_ap ? IR_APACC : IR_DPACC);
575+
576+
platform_timeout_s timeout_progressbar;
577+
platform_timeout_set(&timeout_progressbar, 500U);
578+
platform_timeout_s timeout_erase;
579+
platform_timeout_set(&timeout_erase, 15000U);
580+
while (ack == JTAGDP_ACK_WAIT && !platform_timeout_is_expired(&timeout_erase)) {
581+
uint64_t response;
582+
jtag_dev_shift_dr(dp->dev_index, (uint8_t *)&response, (uint8_t *)&request, 35);
583+
result = response >> 3U;
584+
ack = response & 0x07U;
585+
platform_delay(5U);
586+
target_print_progress(&timeout_progressbar);
587+
}
588+
589+
if (ack != JTAGDP_ACK_OK) {
590+
DEBUG_ERROR("JTAG access resulted in: %" PRIx32 ":%x\n", result, ack);
591+
raise_exception(EXCEPTION_ERROR, "JTAG-DP invalid ACK");
592+
}
593+
594+
return result;
595+
}
596+
597+
static bool adiv5_swd_raw_access_noabort(adiv5_debug_port_s *dp, uint8_t rnw, uint16_t addr, uint32_t value)
558598
{
559599
const uint8_t request = make_packet_request(rnw, addr);
560600
uint32_t response = 0;
@@ -615,7 +655,10 @@ static bool at32f43x_mem_write_noabort(target_s *target, target_addr32_t dest, u
615655
volatile uint32_t rdbuff = 0;
616656
TRY (EXCEPTION_ALL) {
617657
//ack = ap->dp->low_access(dp, rnw, addr, value)
618-
rdbuff = at32f43x_swd_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
658+
if (ap->dp->low_access == adiv5_swd_raw_access)
659+
rdbuff = adiv5_swd_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
660+
else if (ap->dp->low_access == adiv5_jtag_raw_access)
661+
rdbuff = adiv5_jtag_raw_access_noabort(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
619662
}
620663
CATCH () {
621664
case EXCEPTION_TIMEOUT:

0 commit comments

Comments
 (0)