Skip to content

Commit 8e4c223

Browse files
committed
Clean up, abort after timeout
1 parent eb570c5 commit 8e4c223

File tree

2 files changed

+185
-236
lines changed

2 files changed

+185
-236
lines changed

src/dap.rs

Lines changed: 48 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -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::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::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::JTAG_IR_APACC
838825
} else {
839-
JTAG_DPACC
826+
jtag::JTAG_IR_DPACC
840827
};
841828
if request_value.r_nw == RnW::R {
842829
// Read register
@@ -845,28 +832,18 @@ 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::JTAG_IR_DPACC {
840+
ir = jtag::JTAG_IR_DPACC;
859841
jtag.shift_ir(ir);
860842
}
861843

862844
// 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);
870847
post_read = false;
871848
}
872849

@@ -893,19 +870,13 @@ where
893870
jtag.shift_ir(ir);
894871
}
895872
// 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);
898874
if !matches!(response_value, TransferResult::Ok(_)) {
899875
break;
900876
}
901877
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);
909880
match response_value {
910881
TransferResult::Ok(data)
911882
if (data & transfer_config.match_mask) != match_value => {}
@@ -935,13 +906,8 @@ where
935906
jtag.shift_ir(ir);
936907
}
937908
// 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);
945911
if !matches!(response_value, TransferResult::Ok(_)) {
946912
break;
947913
}
@@ -956,13 +922,13 @@ where
956922
// Write register
957923
if post_read {
958924
// 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;
961927
jtag.shift_ir(ir);
962928
}
963929
// Read previous data
964930
response_value =
965-
transfer_with_retry(jtag, read_rdbuff, transfer_config, 0, wait_retries);
931+
transfer_with_retry(jtag, TransferInfo::RDBUFF, transfer_config, 0);
966932

967933
if let TransferResult::Ok(data) = response_value {
968934
// Store previous data
@@ -986,7 +952,7 @@ where
986952
}
987953

988954
response_value =
989-
transfer_with_retry(jtag, request_value, transfer_config, data, retry);
955+
transfer_with_retry(jtag, request_value, transfer_config, data);
990956
if !matches!(response_value, TransferResult::Ok(_)) {
991957
break;
992958
}
@@ -1017,13 +983,12 @@ where
1017983

1018984
if matches!(response_value, TransferResult::Ok(_)) {
1019985
// 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);
1022988
}
1023989

1024990
// 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);
1027992

1028993
if post_read {
1029994
// Read previous data
@@ -1131,15 +1096,6 @@ where
11311096
mut req: Request,
11321097
resp: &mut ResponseWriter,
11331098
) {
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-
11431099
let idx = req.next_u8();
11441100
let request_count = req.next_u16();
11451101
let mut nrequests = request_count;
@@ -1165,17 +1121,17 @@ where
11651121

11661122
// Select JTAG chain
11671123
let ir = if request_value.ap_ndp == APnDP::AP {
1168-
JTAG_APACC
1124+
jtag::JTAG_IR_APACC
11691125
} else {
1170-
JTAG_DPACC
1126+
jtag::JTAG_IR_DPACC
11711127
};
11721128
jtag.shift_ir(ir);
11731129

1174-
let mut response_value = jtag::TransferResult::Nack;
1130+
let mut response_value = jtag::TransferResult::Fault;
11751131
if request_value.r_nw == RnW::R {
11761132
// Post read
11771133
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);
11791135
if matches!(response_value, TransferResult::Ok(_)) {
11801136
// Read register block
11811137
while nrequests > 0 {
@@ -1184,13 +1140,12 @@ where
11841140
// Read DP/AP register
11851141
if nrequests == 0 {
11861142
// 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);
11891145
}
1190-
request_value = read_rdbuff;
1146+
request_value = TransferInfo::RDBUFF;
11911147
}
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);
11941149
if let TransferResult::Ok(data) = response_value {
11951150
// Store data
11961151
resp.write_u32(data);
@@ -1209,8 +1164,7 @@ where
12091164
// Load data
12101165
let data = req.next_u32();
12111166
// 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);
12141168
if !matches!(response_value, TransferResult::Ok(_)) {
12151169
// goto end
12161170
break;
@@ -1219,11 +1173,11 @@ where
12191173

12201174
if request_count == 0 {
12211175
// 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);
12241178
}
12251179
response_value =
1226-
transfer_with_retry(jtag, read_rdbuff, transfer_config, 0, retry);
1180+
transfer_with_retry(jtag, TransferInfo::RDBUFF, transfer_config, 0);
12271181
}
12281182
}
12291183
}
@@ -1279,28 +1233,35 @@ impl<T> CheckResult<T> for swd::Result<T> {
12791233

12801234
fn transfer_with_retry<DEPS>(
12811235
jtag: &mut impl jtag::Jtag<DEPS>,
1282-
request_value: jtag::TransferInfo,
1236+
info: jtag::TransferInfo,
12831237
transfer_config: &TransferConfig,
12841238
data: u32,
1285-
mut retry: usize,
12861239
) -> jtag::TransferResult {
12871240
let mut response_value;
1241+
let mut retry = transfer_config.wait_retries;
12881242

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);
12911245
} else {
1292-
debug!("Transfer: {:?}", request_value);
1246+
debug!("Transfer: {:?}", info);
12931247
}
12941248

12951249
loop {
12961250
// 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);
12981252
if response_value != jtag::TransferResult::Wait || retry == 0 {
12991253
debug!("Transfer result: {:x}", response_value);
13001254
break;
13011255
}
13021256
retry -= 1;
13031257
}
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+
}
13041265
response_value
13051266
}
13061267

0 commit comments

Comments
 (0)