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