Skip to content

Commit 8802d1c

Browse files
committed
Clean up, abort after timeout
1 parent eb570c5 commit 8802d1c

File tree

2 files changed

+186
-233
lines changed

2 files changed

+186
-233
lines changed

src/dap.rs

+49-84
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use 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

12801239
fn 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

Comments
 (0)