@@ -551,7 +551,47 @@ static bool at32f43_mass_erase(target_s *target)
551551 return true;
552552}
553553
554- static bool at32f43x_swd_raw_access_noabort (adiv5_debug_port_s * dp , uint8_t rnw , uint16_t addr , uint32_t value )
554+ /* Borrow macros from adiv5_jtag.c */
555+ #define JTAGDP_ACK_OK 0x02U
556+ #define JTAGDP_ACK_WAIT 0x01U
557+
558+ #define IR_DPACC 0xaU
559+ #define IR_APACC 0xbU
560+
561+ uint32_t adiv5_jtag_raw_access_noabort (adiv5_debug_port_s * dp , uint8_t rnw , uint16_t addr , uint32_t value )
562+ {
563+ const bool is_ap = addr & ADIV5_APnDP ;
564+ addr &= 0xffU ;
565+
566+ const uint64_t request = ((uint64_t )value << 3U ) | ((addr >> 1U ) & 0x06U ) | (rnw ? 1U : 0U );
567+
568+ uint32_t result = 0U ;
569+ uint8_t ack = JTAGDP_ACK_WAIT ;
570+
571+ jtag_dev_write_ir (dp -> dev_index , is_ap ? IR_APACC : IR_DPACC );
572+
573+ platform_timeout_s timeout_progressbar ;
574+ platform_timeout_set (& timeout_progressbar , 500U );
575+ platform_timeout_s timeout_erase ;
576+ platform_timeout_set (& timeout_erase , 15000U );
577+ while (ack == JTAGDP_ACK_WAIT && !platform_timeout_is_expired (& timeout_erase )) {
578+ uint64_t response ;
579+ jtag_dev_shift_dr (dp -> dev_index , (uint8_t * )& response , (uint8_t * )& request , 35 );
580+ result = response >> 3U ;
581+ ack = response & 0x07U ;
582+ platform_delay (5U );
583+ target_print_progress (& timeout_progressbar );
584+ }
585+
586+ if (ack != JTAGDP_ACK_OK ) {
587+ DEBUG_ERROR ("JTAG access resulted in: %" PRIx32 ":%x\n" , result , ack );
588+ raise_exception (EXCEPTION_ERROR , "JTAG-DP invalid ACK" );
589+ }
590+
591+ return result ;
592+ }
593+
594+ static bool adiv5_swd_raw_access_noabort (adiv5_debug_port_s * dp , uint8_t rnw , uint16_t addr , uint32_t value )
555595{
556596 const uint8_t request = make_packet_request (rnw , addr );
557597 uint32_t response = 0 ;
@@ -612,7 +652,10 @@ static bool at32f43x_mem_write_noabort(target_s *target, target_addr32_t dest, u
612652 volatile uint32_t rdbuff = 0 ;
613653 TRY (EXCEPTION_ALL ) {
614654 //ack = ap->dp->low_access(dp, rnw, addr, value)
615- rdbuff = at32f43x_swd_raw_access_noabort (ap -> dp , ADIV5_LOW_READ , ADIV5_DP_RDBUFF , 0 );
655+ if (ap -> dp -> low_access == adiv5_swd_raw_access )
656+ rdbuff = adiv5_swd_raw_access_noabort (ap -> dp , ADIV5_LOW_READ , ADIV5_DP_RDBUFF , 0 );
657+ else if (ap -> dp -> low_access == adiv5_jtag_raw_access )
658+ rdbuff = adiv5_jtag_raw_access_noabort (ap -> dp , ADIV5_LOW_READ , ADIV5_DP_RDBUFF , 0 );
616659 }
617660 CATCH () {
618661 case EXCEPTION_TIMEOUT :
0 commit comments