@@ -306,8 +306,7 @@ where
306
306
return ;
307
307
}
308
308
309
- const JTAG_ABORT : u32 = 0x08 ;
310
- jtag. shift_ir ( JTAG_ABORT ) ;
309
+ jtag. shift_ir ( jtag:: JTAG_IR_ABORT ) ;
311
310
jtag. write_abort ( word) ;
312
311
313
312
resp. write_ok ( ) ;
@@ -655,9 +654,7 @@ where
655
654
return ;
656
655
}
657
656
658
- const JTAG_IDCODE : u32 = 0x0E ;
659
-
660
- jtag. shift_ir ( JTAG_IDCODE ) ;
657
+ jtag. shift_ir ( jtag:: JTAG_IR_IDCODE ) ;
661
658
let data = jtag. shift_dr ( 0 ) ;
662
659
663
660
resp. write_ok ( ) ;
@@ -814,29 +811,19 @@ where
814
811
return ;
815
812
}
816
813
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
-
825
814
let mut post_read = false ;
826
815
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 ;
829
817
let mut response_count = 0 ;
830
- let wait_retries = transfer_config. wait_retries ;
831
818
832
819
while ntransfers > 0 {
833
820
debug ! ( "JTAG transfer {}/{}" , response_count + 1 , transfer_count) ;
834
821
let request_value = jtag:: TransferInfo :: from ( req. next_u8 ( ) ) ;
835
822
ntransfers -= 1 ;
836
823
let request_ir = if request_value. ap_ndp == APnDP :: AP {
837
- JTAG_APACC
824
+ jtag :: JTAG_IR_APACC
838
825
} else {
839
- JTAG_DPACC
826
+ jtag :: JTAG_IR_DPACC
840
827
} ;
841
828
if request_value. r_nw == RnW :: R {
842
829
// Read register
@@ -845,28 +832,18 @@ where
845
832
if ir == request_ir && !request_value. match_value {
846
833
// Read previous data and post next read
847
834
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 ) ;
855
837
} else {
856
838
// Select JTAG chain
857
- if ir != JTAG_DPACC {
858
- ir = JTAG_DPACC ;
839
+ if ir != jtag :: JTAG_IR_DPACC {
840
+ ir = jtag :: JTAG_IR_DPACC ;
859
841
jtag. shift_ir ( ir) ;
860
842
}
861
843
862
844
// Read previous data
863
- response_value = transfer_with_retry (
864
- jtag,
865
- read_rdbuff,
866
- transfer_config,
867
- 0 ,
868
- wait_retries,
869
- ) ;
845
+ response_value =
846
+ transfer_with_retry ( jtag, TransferInfo :: RDBUFF , transfer_config, 0 ) ;
870
847
post_read = false ;
871
848
}
872
849
@@ -893,19 +870,13 @@ where
893
870
jtag. shift_ir ( ir) ;
894
871
}
895
872
// Post DP/AP read
896
- response_value =
897
- transfer_with_retry ( jtag, request_value, transfer_config, 0 , wait_retries) ;
873
+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
898
874
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
899
875
break ;
900
876
}
901
877
loop {
902
- response_value = transfer_with_retry (
903
- jtag,
904
- request_value,
905
- transfer_config,
906
- 0 ,
907
- wait_retries,
908
- ) ;
878
+ response_value =
879
+ transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
909
880
match response_value {
910
881
TransferResult :: Ok ( data)
911
882
if ( data & transfer_config. match_mask ) != match_value => { }
@@ -935,13 +906,8 @@ where
935
906
jtag. shift_ir ( ir) ;
936
907
}
937
908
// Post DP/AP read
938
- response_value = transfer_with_retry (
939
- jtag,
940
- request_value,
941
- transfer_config,
942
- 0 ,
943
- wait_retries,
944
- ) ;
909
+ response_value =
910
+ transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
945
911
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
946
912
break ;
947
913
}
@@ -956,13 +922,13 @@ where
956
922
// Write register
957
923
if post_read {
958
924
// Select JTAG chain
959
- if ir != JTAG_DPACC {
960
- ir = JTAG_DPACC ;
925
+ if ir != jtag :: JTAG_IR_DPACC {
926
+ ir = jtag :: JTAG_IR_DPACC ;
961
927
jtag. shift_ir ( ir) ;
962
928
}
963
929
// Read previous data
964
930
response_value =
965
- transfer_with_retry ( jtag, read_rdbuff , transfer_config, 0 , wait_retries ) ;
931
+ transfer_with_retry ( jtag, TransferInfo :: RDBUFF , transfer_config, 0 ) ;
966
932
967
933
if let TransferResult :: Ok ( data) = response_value {
968
934
// Store previous data
@@ -986,7 +952,7 @@ where
986
952
}
987
953
988
954
response_value =
989
- transfer_with_retry ( jtag, request_value, transfer_config, data, retry ) ;
955
+ transfer_with_retry ( jtag, request_value, transfer_config, data) ;
990
956
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
991
957
break ;
992
958
}
@@ -1017,13 +983,12 @@ where
1017
983
1018
984
if matches ! ( response_value, TransferResult :: Ok ( _) ) {
1019
985
// Select JTAG chain
1020
- if ir != JTAG_DPACC {
1021
- jtag. shift_ir ( JTAG_DPACC ) ;
986
+ if ir != jtag :: JTAG_IR_DPACC {
987
+ jtag. shift_ir ( jtag :: JTAG_IR_DPACC ) ;
1022
988
}
1023
989
1024
990
// Check last write, or read previous read's result.
1025
- response_value =
1026
- transfer_with_retry ( jtag, read_rdbuff, transfer_config, 0 , wait_retries) ;
991
+ response_value = transfer_with_retry ( jtag, TransferInfo :: RDBUFF , transfer_config, 0 ) ;
1027
992
1028
993
if post_read {
1029
994
// Read previous data
@@ -1131,15 +1096,6 @@ where
1131
1096
mut req : Request ,
1132
1097
resp : & mut ResponseWriter ,
1133
1098
) {
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
-
1143
1099
let idx = req. next_u8 ( ) ;
1144
1100
let request_count = req. next_u16 ( ) ;
1145
1101
let mut nrequests = request_count;
@@ -1165,17 +1121,17 @@ where
1165
1121
1166
1122
// Select JTAG chain
1167
1123
let ir = if request_value. ap_ndp == APnDP :: AP {
1168
- JTAG_APACC
1124
+ jtag :: JTAG_IR_APACC
1169
1125
} else {
1170
- JTAG_DPACC
1126
+ jtag :: JTAG_IR_DPACC
1171
1127
} ;
1172
1128
jtag. shift_ir ( ir) ;
1173
1129
1174
- let mut response_value = jtag:: TransferResult :: Nack ;
1130
+ let mut response_value = jtag:: TransferResult :: Fault ;
1175
1131
if request_value. r_nw == RnW :: R {
1176
1132
// Post read
1177
1133
debug ! ( "Posting read for {} transfers" , request_count) ;
1178
- response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 , retry ) ;
1134
+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
1179
1135
if matches ! ( response_value, TransferResult :: Ok ( _) ) {
1180
1136
// Read register block
1181
1137
while nrequests > 0 {
@@ -1184,13 +1140,12 @@ where
1184
1140
// Read DP/AP register
1185
1141
if nrequests == 0 {
1186
1142
// Last read
1187
- if ir != JTAG_DPACC {
1188
- jtag. shift_ir ( JTAG_DPACC ) ;
1143
+ if ir != jtag :: JTAG_IR_DPACC {
1144
+ jtag. shift_ir ( jtag :: JTAG_IR_DPACC ) ;
1189
1145
}
1190
- request_value = read_rdbuff ;
1146
+ request_value = TransferInfo :: RDBUFF ;
1191
1147
}
1192
- response_value =
1193
- transfer_with_retry ( jtag, request_value, transfer_config, 0 , retry) ;
1148
+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, 0 ) ;
1194
1149
if let TransferResult :: Ok ( data) = response_value {
1195
1150
// Store data
1196
1151
resp. write_u32 ( data) ;
@@ -1209,8 +1164,7 @@ where
1209
1164
// Load data
1210
1165
let data = req. next_u32 ( ) ;
1211
1166
// Write DP/AP register
1212
- response_value =
1213
- transfer_with_retry ( jtag, request_value, transfer_config, data, retry) ;
1167
+ response_value = transfer_with_retry ( jtag, request_value, transfer_config, data) ;
1214
1168
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
1215
1169
// goto end
1216
1170
break ;
@@ -1219,11 +1173,11 @@ where
1219
1173
1220
1174
if request_count == 0 {
1221
1175
// Check last write
1222
- if ir != JTAG_DPACC {
1223
- jtag. shift_ir ( JTAG_DPACC ) ;
1176
+ if ir != jtag :: JTAG_IR_DPACC {
1177
+ jtag. shift_ir ( jtag :: JTAG_IR_DPACC ) ;
1224
1178
}
1225
1179
response_value =
1226
- transfer_with_retry ( jtag, read_rdbuff , transfer_config, 0 , retry ) ;
1180
+ transfer_with_retry ( jtag, TransferInfo :: RDBUFF , transfer_config, 0 ) ;
1227
1181
}
1228
1182
}
1229
1183
}
@@ -1279,28 +1233,35 @@ impl<T> CheckResult<T> for swd::Result<T> {
1279
1233
1280
1234
fn transfer_with_retry < DEPS > (
1281
1235
jtag : & mut impl jtag:: Jtag < DEPS > ,
1282
- request_value : jtag:: TransferInfo ,
1236
+ info : jtag:: TransferInfo ,
1283
1237
transfer_config : & TransferConfig ,
1284
1238
data : u32 ,
1285
- mut retry : usize ,
1286
1239
) -> jtag:: TransferResult {
1287
1240
let mut response_value;
1241
+ let mut retry = transfer_config. wait_retries ;
1288
1242
1289
- if request_value . r_nw == RnW :: W {
1290
- debug ! ( "Transfer: {:?} ({:x})" , request_value , data) ;
1243
+ if info . r_nw == RnW :: W {
1244
+ debug ! ( "Transfer: {:?} ({:x})" , info , data) ;
1291
1245
} else {
1292
- debug ! ( "Transfer: {:?}" , request_value ) ;
1246
+ debug ! ( "Transfer: {:?}" , info ) ;
1293
1247
}
1294
1248
1295
1249
loop {
1296
1250
// Read register until retry counter expires or the read returns !Wait
1297
- response_value = jtag. transfer ( request_value , transfer_config, data) ;
1251
+ response_value = jtag. transfer ( info . r_nw , info . a2a3 as u8 , transfer_config, data) ;
1298
1252
if response_value != jtag:: TransferResult :: Wait || retry == 0 {
1299
1253
debug ! ( "Transfer result: {:x}" , response_value) ;
1300
1254
break ;
1301
1255
}
1302
1256
retry -= 1 ;
1303
1257
}
1258
+ if !matches ! ( response_value, jtag:: TransferResult :: Ok ( _) ) {
1259
+ // If we get a wait response, we need to abort the transfer
1260
+ // and set the abort bit in the response.
1261
+ warn ! ( "Transfer aborted" ) ;
1262
+ jtag. shift_ir ( jtag:: JTAG_IR_ABORT ) ;
1263
+ jtag. write_abort ( 1 ) ;
1264
+ }
1304
1265
response_value
1305
1266
}
1306
1267
0 commit comments