@@ -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