1
1
use crate :: {
2
- jtag:: { self , TransferInfo , TransferResult } ,
2
+ jtag:: { self , TransferResult , JTAG_IR_ABORT , JTAG_IR_APACC , JTAG_IR_DPACC , JTAG_IR_IDCODE } ,
3
3
swd:: { self , APnDP , RnW } ,
4
4
swj, swo, usb,
5
5
} ;
@@ -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_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_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_IR_APACC
838
825
} else {
839
- JTAG_DPACC
826
+ JTAG_IR_DPACC
840
827
} ;
841
828
if request_value. r_nw == RnW :: R {
842
829
// Read register
@@ -845,27 +832,21 @@ 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_IR_DPACC {
840
+ ir = JTAG_IR_DPACC ;
859
841
jtag. shift_ir ( ir) ;
860
842
}
861
843
862
844
// Read previous data
863
845
response_value = transfer_with_retry (
864
846
jtag,
865
- read_rdbuff ,
847
+ jtag :: TransferInfo :: RDBUFF ,
866
848
transfer_config,
867
849
0 ,
868
- wait_retries,
869
850
) ;
870
851
post_read = false ;
871
852
}
@@ -893,19 +874,13 @@ where
893
874
jtag. shift_ir ( ir) ;
894
875
}
895
876
// 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 ) ;
898
878
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
899
879
break ;
900
880
}
901
881
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 ) ;
909
884
match response_value {
910
885
TransferResult :: Ok ( data)
911
886
if ( data & transfer_config. match_mask ) != match_value => { }
@@ -935,13 +910,8 @@ where
935
910
jtag. shift_ir ( ir) ;
936
911
}
937
912
// 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 ) ;
945
915
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
946
916
break ;
947
917
}
@@ -956,13 +926,13 @@ where
956
926
// Write register
957
927
if post_read {
958
928
// Select JTAG chain
959
- if ir != JTAG_DPACC {
960
- ir = JTAG_DPACC ;
929
+ if ir != JTAG_IR_DPACC {
930
+ ir = JTAG_IR_DPACC ;
961
931
jtag. shift_ir ( ir) ;
962
932
}
963
933
// Read previous data
964
934
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 ) ;
966
936
967
937
if let TransferResult :: Ok ( data) = response_value {
968
938
// Store previous data
@@ -986,7 +956,7 @@ where
986
956
}
987
957
988
958
response_value =
989
- transfer_with_retry ( jtag, request_value, transfer_config, data, retry ) ;
959
+ transfer_with_retry ( jtag, request_value, transfer_config, data) ;
990
960
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
991
961
break ;
992
962
}
@@ -1002,7 +972,7 @@ where
1002
972
while ntransfers > 0 {
1003
973
ntransfers -= 1 ;
1004
974
// Process canceled requests
1005
- let request_value = TransferInfo :: from ( req. next_u8 ( ) ) ;
975
+ let request_value = jtag :: TransferInfo :: from ( req. next_u8 ( ) ) ;
1006
976
if request_value. r_nw == RnW :: R {
1007
977
// Read register
1008
978
if request_value. match_value {
@@ -1017,13 +987,13 @@ where
1017
987
1018
988
if matches ! ( response_value, TransferResult :: Ok ( _) ) {
1019
989
// 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 ) ;
1022
992
}
1023
993
1024
994
// Check last write, or read previous read's result.
1025
995
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 ) ;
1027
997
1028
998
if post_read {
1029
999
// Read previous data
@@ -1131,19 +1101,10 @@ where
1131
1101
mut req : Request ,
1132
1102
resp : & mut ResponseWriter ,
1133
1103
) {
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
1104
let idx = req. next_u8 ( ) ;
1144
1105
let request_count = req. next_u16 ( ) ;
1145
1106
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 ( ) ) ;
1147
1108
1148
1109
let mut response_count = 0 ;
1149
1110
resp. skip ( 3 ) ;
@@ -1165,17 +1126,17 @@ where
1165
1126
1166
1127
// Select JTAG chain
1167
1128
let ir = if request_value. ap_ndp == APnDP :: AP {
1168
- JTAG_APACC
1129
+ JTAG_IR_APACC
1169
1130
} else {
1170
- JTAG_DPACC
1131
+ JTAG_IR_DPACC
1171
1132
} ;
1172
1133
jtag. shift_ir ( ir) ;
1173
1134
1174
- let mut response_value = jtag:: TransferResult :: Nack ;
1135
+ let mut response_value = jtag:: TransferResult :: Fault ;
1175
1136
if request_value. r_nw == RnW :: R {
1176
1137
// Post read
1177
1138
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 ) ;
1179
1140
if matches ! ( response_value, TransferResult :: Ok ( _) ) {
1180
1141
// Read register block
1181
1142
while nrequests > 0 {
@@ -1184,13 +1145,12 @@ where
1184
1145
// Read DP/AP register
1185
1146
if nrequests == 0 {
1186
1147
// 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 ) ;
1189
1150
}
1190
- request_value = read_rdbuff ;
1151
+ request_value = jtag :: TransferInfo :: RDBUFF ;
1191
1152
}
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 ) ;
1194
1154
if let TransferResult :: Ok ( data) = response_value {
1195
1155
// Store data
1196
1156
resp. write_u32 ( data) ;
@@ -1209,8 +1169,7 @@ where
1209
1169
// Load data
1210
1170
let data = req. next_u32 ( ) ;
1211
1171
// 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) ;
1214
1173
if !matches ! ( response_value, TransferResult :: Ok ( _) ) {
1215
1174
// goto end
1216
1175
break ;
@@ -1219,11 +1178,11 @@ where
1219
1178
1220
1179
if request_count == 0 {
1221
1180
// 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 ) ;
1224
1183
}
1225
1184
response_value =
1226
- transfer_with_retry ( jtag, read_rdbuff , transfer_config, 0 , retry ) ;
1185
+ transfer_with_retry ( jtag, jtag :: TransferInfo :: RDBUFF , transfer_config, 0 ) ;
1227
1186
}
1228
1187
}
1229
1188
}
@@ -1279,28 +1238,34 @@ impl<T> CheckResult<T> for swd::Result<T> {
1279
1238
1280
1239
fn transfer_with_retry < DEPS > (
1281
1240
jtag : & mut impl jtag:: Jtag < DEPS > ,
1282
- request_value : jtag:: TransferInfo ,
1241
+ info : jtag:: TransferInfo ,
1283
1242
transfer_config : & TransferConfig ,
1284
1243
data : u32 ,
1285
- mut retry : usize ,
1286
1244
) -> jtag:: TransferResult {
1245
+ let mut retry = transfer_config. wait_retries ;
1287
1246
let mut response_value;
1288
1247
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) ;
1291
1250
} else {
1292
- debug ! ( "Transfer: {:?}" , request_value ) ;
1251
+ debug ! ( "Transfer: {:?}" , info ) ;
1293
1252
}
1294
1253
1295
1254
loop {
1296
1255
// 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) ;
1298
1257
if response_value != jtag:: TransferResult :: Wait || retry == 0 {
1299
1258
debug ! ( "Transfer result: {:x}" , response_value) ;
1300
1259
break ;
1301
1260
}
1302
1261
retry -= 1 ;
1303
1262
}
1263
+
1264
+ if retry == 0 {
1265
+ jtag. shift_ir ( JTAG_IR_ABORT ) ;
1266
+ jtag. write_abort ( 1 ) ;
1267
+ }
1268
+
1304
1269
response_value
1305
1270
}
1306
1271
0 commit comments