11use crate :: {
2- jtag:: { self , TransferInfo , TransferResult } ,
2+ jtag:: { self , TransferResult , JTAG_IR_ABORT , JTAG_IR_APACC , JTAG_IR_DPACC , JTAG_IR_IDCODE } ,
33 swd:: { self , APnDP , RnW } ,
44 swj, swo, usb,
55} ;
@@ -306,8 +306,7 @@ where
306306 return ;
307307 }
308308
309- const JTAG_ABORT : u32 = 0x08 ;
310- jtag. shift_ir ( JTAG_ABORT ) ;
309+ jtag. shift_ir ( JTAG_IR_ABORT ) ;
311310 jtag. write_abort ( word) ;
312311
313312 resp. write_ok ( ) ;
@@ -655,9 +654,7 @@ where
655654 return ;
656655 }
657656
658- const JTAG_IDCODE : u32 = 0x0E ;
659-
660- jtag. shift_ir ( JTAG_IDCODE ) ;
657+ jtag. shift_ir ( JTAG_IR_IDCODE ) ;
661658 let data = jtag. shift_dr ( 0 ) ;
662659
663660 resp. write_ok ( ) ;
@@ -814,29 +811,19 @@ where
814811 return ;
815812 }
816813
817- const JTAG_DPACC : u32 = 0x0A ;
818- const JTAG_APACC : u32 = 0x0B ;
819- const DP_RDBUFF : u8 = 0x0C ;
820- let read_rdbuff = TransferInfo {
821- r_nw : RnW :: R ,
822- ..TransferInfo :: from ( DP_RDBUFF )
823- } ;
824-
825814 let mut post_read = false ;
826815 let mut ir = 0 ;
827- let mut response_value = TransferResult :: Nack ;
828- let retry = transfer_config. wait_retries ;
816+ let mut response_value = TransferResult :: Fault ;
829817 let mut response_count = 0 ;
830- let wait_retries = transfer_config. wait_retries ;
831818
832819 while ntransfers > 0 {
833820 debug ! ( "JTAG transfer {}/{}" , response_count + 1 , transfer_count) ;
834821 let request_value = jtag:: TransferInfo :: from ( req. next_u8 ( ) ) ;
835822 ntransfers -= 1 ;
836823 let request_ir = if request_value. ap_ndp == APnDP :: AP {
837- JTAG_APACC
824+ JTAG_IR_APACC
838825 } else {
839- JTAG_DPACC
826+ JTAG_IR_DPACC
840827 } ;
841828 if request_value. r_nw == RnW :: R {
842829 // Read register
@@ -845,27 +832,21 @@ where
845832 if ir == request_ir && !request_value. match_value {
846833 // Read previous data and post next read
847834
848- response_value = transfer_with_retry (
849- jtag,
850- request_value,
851- transfer_config,
852- 0 ,
853- wait_retries,
854- ) ;
835+ response_value =
836+ transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
855837 } else {
856838 // Select JTAG chain
857- if ir != JTAG_DPACC {
858- ir = JTAG_DPACC ;
839+ if ir != JTAG_IR_DPACC {
840+ ir = JTAG_IR_DPACC ;
859841 jtag. shift_ir ( ir) ;
860842 }
861843
862844 // Read previous data
863845 response_value = transfer_with_retry (
864846 jtag,
865- read_rdbuff ,
847+ jtag :: TransferInfo :: RDBUFF ,
866848 transfer_config,
867849 0 ,
868- wait_retries,
869850 ) ;
870851 post_read = false ;
871852 }
@@ -893,19 +874,13 @@ where
893874 jtag. shift_ir ( ir) ;
894875 }
895876 // Post DP/AP read
896- response_value =
897- transfer_with_retry ( jtag, request_value, transfer_config, 0 , wait_retries) ;
877+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
898878 if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
899879 break ;
900880 }
901881 loop {
902- response_value = transfer_with_retry (
903- jtag,
904- request_value,
905- transfer_config,
906- 0 ,
907- wait_retries,
908- ) ;
882+ response_value =
883+ transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
909884 match response_value {
910885 TransferResult :: Ok ( data)
911886 if ( data & transfer_config. match_mask ) != match_value => { }
@@ -935,13 +910,8 @@ where
935910 jtag. shift_ir ( ir) ;
936911 }
937912 // Post DP/AP read
938- response_value = transfer_with_retry (
939- jtag,
940- request_value,
941- transfer_config,
942- 0 ,
943- wait_retries,
944- ) ;
913+ response_value =
914+ transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
945915 if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
946916 break ;
947917 }
@@ -956,13 +926,13 @@ where
956926 // Write register
957927 if post_read {
958928 // Select JTAG chain
959- if ir != JTAG_DPACC {
960- ir = JTAG_DPACC ;
929+ if ir != JTAG_IR_DPACC {
930+ ir = JTAG_IR_DPACC ;
961931 jtag. shift_ir ( ir) ;
962932 }
963933 // Read previous data
964934 response_value =
965- transfer_with_retry ( jtag, read_rdbuff , transfer_config, 0 , wait_retries ) ;
935+ transfer_with_retry ( jtag, jtag :: TransferInfo :: RDBUFF , transfer_config, 0 ) ;
966936
967937 if let TransferResult :: Ok ( data) = response_value {
968938 // Store previous data
@@ -986,7 +956,7 @@ where
986956 }
987957
988958 response_value =
989- transfer_with_retry ( jtag, request_value, transfer_config, data, retry ) ;
959+ transfer_with_retry ( jtag, request_value, transfer_config, data) ;
990960 if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
991961 break ;
992962 }
@@ -1002,7 +972,7 @@ where
1002972 while ntransfers > 0 {
1003973 ntransfers -= 1 ;
1004974 // Process canceled requests
1005- let request_value = TransferInfo :: from ( req. next_u8 ( ) ) ;
975+ let request_value = jtag :: TransferInfo :: from ( req. next_u8 ( ) ) ;
1006976 if request_value. r_nw == RnW :: R {
1007977 // Read register
1008978 if request_value. match_value {
@@ -1017,13 +987,13 @@ where
1017987
1018988 if matches ! ( response_value, TransferResult :: Ok ( _) ) {
1019989 // Select JTAG chain
1020- if ir != JTAG_DPACC {
1021- jtag. shift_ir ( JTAG_DPACC ) ;
990+ if ir != JTAG_IR_DPACC {
991+ jtag. shift_ir ( JTAG_IR_DPACC ) ;
1022992 }
1023993
1024994 // Check last write, or read previous read's result.
1025995 response_value =
1026- transfer_with_retry ( jtag, read_rdbuff , transfer_config, 0 , wait_retries ) ;
996+ transfer_with_retry ( jtag, jtag :: TransferInfo :: RDBUFF , transfer_config, 0 ) ;
1027997
1028998 if post_read {
1029999 // Read previous data
@@ -1131,19 +1101,10 @@ where
11311101 mut req : Request ,
11321102 resp : & mut ResponseWriter ,
11331103 ) {
1134- const JTAG_DPACC : u32 = 0x0A ;
1135- const JTAG_APACC : u32 = 0x0B ;
1136- const DP_RDBUFF : u8 = 0x0C ;
1137- let read_rdbuff = TransferInfo {
1138- r_nw : RnW :: R ,
1139- ..TransferInfo :: from ( DP_RDBUFF )
1140- } ;
1141- let retry = transfer_config. wait_retries ;
1142-
11431104 let idx = req. next_u8 ( ) ;
11441105 let request_count = req. next_u16 ( ) ;
11451106 let mut nrequests = request_count;
1146- let mut request_value = TransferInfo :: from ( req. next_u8 ( ) ) ;
1107+ let mut request_value = jtag :: TransferInfo :: from ( req. next_u8 ( ) ) ;
11471108
11481109 let mut response_count = 0 ;
11491110 resp. skip ( 3 ) ;
@@ -1165,17 +1126,17 @@ where
11651126
11661127 // Select JTAG chain
11671128 let ir = if request_value. ap_ndp == APnDP :: AP {
1168- JTAG_APACC
1129+ JTAG_IR_APACC
11691130 } else {
1170- JTAG_DPACC
1131+ JTAG_IR_DPACC
11711132 } ;
11721133 jtag. shift_ir ( ir) ;
11731134
1174- let mut response_value = jtag:: TransferResult :: Nack ;
1135+ let mut response_value = jtag:: TransferResult :: Fault ;
11751136 if request_value. r_nw == RnW :: R {
11761137 // Post read
11771138 debug ! ( "Posting read for {} transfers" , request_count) ;
1178- response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 , retry ) ;
1139+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
11791140 if matches ! ( response_value, TransferResult :: Ok ( _) ) {
11801141 // Read register block
11811142 while nrequests > 0 {
@@ -1184,13 +1145,12 @@ where
11841145 // Read DP/AP register
11851146 if nrequests == 0 {
11861147 // Last read
1187- if ir != JTAG_DPACC {
1188- jtag. shift_ir ( JTAG_DPACC ) ;
1148+ if ir != JTAG_IR_APACC {
1149+ jtag. shift_ir ( JTAG_IR_APACC ) ;
11891150 }
1190- request_value = read_rdbuff ;
1151+ request_value = jtag :: TransferInfo :: RDBUFF ;
11911152 }
1192- response_value =
1193- transfer_with_retry ( jtag, request_value, transfer_config, 0 , retry) ;
1153+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
11941154 if let TransferResult :: Ok ( data) = response_value {
11951155 // Store data
11961156 resp. write_u32 ( data) ;
@@ -1209,8 +1169,7 @@ where
12091169 // Load data
12101170 let data = req. next_u32 ( ) ;
12111171 // Write DP/AP register
1212- response_value =
1213- transfer_with_retry ( jtag, request_value, transfer_config, data, retry) ;
1172+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, data) ;
12141173 if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
12151174 // goto end
12161175 break ;
@@ -1219,11 +1178,11 @@ where
12191178
12201179 if request_count == 0 {
12211180 // Check last write
1222- if ir != JTAG_DPACC {
1223- jtag. shift_ir ( JTAG_DPACC ) ;
1181+ if ir != JTAG_IR_DPACC {
1182+ jtag. shift_ir ( JTAG_IR_DPACC ) ;
12241183 }
12251184 response_value =
1226- transfer_with_retry ( jtag, read_rdbuff , transfer_config, 0 , retry ) ;
1185+ transfer_with_retry ( jtag, jtag :: TransferInfo :: RDBUFF , transfer_config, 0 ) ;
12271186 }
12281187 }
12291188 }
@@ -1279,28 +1238,34 @@ impl<T> CheckResult<T> for swd::Result<T> {
12791238
12801239fn transfer_with_retry < DEPS > (
12811240 jtag : & mut impl jtag:: Jtag < DEPS > ,
1282- request_value : jtag:: TransferInfo ,
1241+ info : jtag:: TransferInfo ,
12831242 transfer_config : & TransferConfig ,
12841243 data : u32 ,
1285- mut retry : usize ,
12861244) -> jtag:: TransferResult {
1245+ let mut retry = transfer_config. wait_retries ;
12871246 let mut response_value;
12881247
1289- if request_value . r_nw == RnW :: W {
1290- debug ! ( "Transfer: {:?} ({:x})" , request_value , data) ;
1248+ if info . r_nw == RnW :: W {
1249+ debug ! ( "Transfer: {:?} ({:x})" , info , data) ;
12911250 } else {
1292- debug ! ( "Transfer: {:?}" , request_value ) ;
1251+ debug ! ( "Transfer: {:?}" , info ) ;
12931252 }
12941253
12951254 loop {
12961255 // Read register until retry counter expires or the read returns !Wait
1297- response_value = jtag. transfer ( request_value , transfer_config, data) ;
1256+ response_value = jtag. transfer ( info . r_nw , info . a2a3 as u8 , transfer_config, data) ;
12981257 if response_value != jtag:: TransferResult :: Wait || retry == 0 {
12991258 debug ! ( "Transfer result: {:x}" , response_value) ;
13001259 break ;
13011260 }
13021261 retry -= 1 ;
13031262 }
1263+
1264+ if retry == 0 {
1265+ jtag. shift_ir ( JTAG_IR_ABORT ) ;
1266+ jtag. write_abort ( 1 ) ;
1267+ }
1268+
13041269 response_value
13051270}
13061271
0 commit comments