Skip to content

Commit 4ef6b1b

Browse files
now supports multiple sequences in one command
1 parent 3083293 commit 4ef6b1b

File tree

2 files changed

+89
-72
lines changed

2 files changed

+89
-72
lines changed

src/dap.rs

Lines changed: 85 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -375,79 +375,44 @@ where
375375
}
376376

377377
fn process_swd_sequence(&mut self, mut req: Request, resp: &mut ResponseWriter) {
378-
let sequence_info = req.next_u8();
379-
380-
let nbits: usize = match sequence_info & 0x3F {
381-
// CMSIS-DAP says 0 means 64 bits
382-
0 => 64,
383-
// Other integers are normal.
384-
n => n as usize,
385-
};
386-
let output = (sequence_info & 0x80) == 0;
387-
388-
if output {
389-
self.process_swd_sequence_output(req, resp, nbits);
390-
} else {
391-
self.process_swd_sequence_input(req, resp, nbits);
392-
}
393-
}
394-
395-
fn process_swd_sequence_output(
396-
&mut self,
397-
req: Request,
398-
resp: &mut ResponseWriter,
399-
nbits: usize,
400-
) {
401-
let payload = req.rest();
402-
let nbytes = (nbits + 7) / 8;
403-
let seq = if nbytes <= payload.len() {
404-
&payload[..nbytes]
405-
} else {
406-
resp.write_err();
407-
return;
408-
};
409-
410378
self.state.to_swd();
411-
412-
match &mut self.state {
413-
State::Swd(swd) => {
414-
if swd.write_sequence(nbits, seq).is_ok() {
415-
resp.write_ok();
416-
} else {
417-
resp.write_err();
418-
}
379+
let swd = match &mut self.state {
380+
State::Swd(swd) => swd,
381+
_ => {
382+
resp.write_err();
383+
return;
419384
}
420-
_ => resp.write_err(),
421-
}
422-
}
423-
424-
fn process_swd_sequence_input(
425-
&mut self,
426-
_req: Request,
427-
resp: &mut ResponseWriter,
428-
nbits: usize,
429-
) {
430-
let payload = resp.remaining();
431-
let nbytes = (nbits + 7) / 8;
432-
let buf = if nbytes + 1 <= payload.len() {
433-
&mut payload[1..nbytes + 1]
434-
} else {
435-
resp.write_err();
436-
return;
437385
};
438386

439-
self.state.to_swd();
440-
441-
match &mut self.state {
442-
State::Swd(swd) => {
443-
if swd.read_sequence(nbits, buf).is_ok() {
444-
resp.write_ok();
445-
resp.skip(nbytes);
446-
} else {
447-
resp.write_err();
448-
}
387+
resp.write_ok(); // assume ok until we finish
388+
let sequence_count = req.next_u8();
389+
let success = (0..sequence_count).map(|_| {
390+
// parse the seqnence info
391+
let sequence_info = req.next_u8();
392+
let nbits: usize = match sequence_info & 0x3F {
393+
// CMSIS-DAP says 0 means 64 bits
394+
0 => 64,
395+
// Other integers are normal.
396+
n => n as usize,
397+
};
398+
let nbytes = (nbits + 7) / 8;
399+
let output = (sequence_info & 0x80) == 0;
400+
401+
if output {
402+
let output_data = req.data.get(..nbytes).ok_or(())?;
403+
swd.write_sequence(nbits, output_data).or(Err(()))?;
404+
req.consume(nbytes);
405+
Ok(0)
406+
} else {
407+
let input_data = resp.remaining().get_mut(..nbytes).ok_or(())?;
408+
swd.read_sequence(nbits, input_data).or(Err(()))?;
409+
resp.skip(nbytes);
410+
Ok(nbytes)
449411
}
450-
_ => resp.write_err(),
412+
}).all(|r: Result<usize, ()>| r.is_ok());
413+
414+
if !success {
415+
resp.write_u8_at(0, 0xFF);
451416
}
452417
}
453418

@@ -904,7 +869,7 @@ mod test {
904869
"test_dap",
905870
);
906871

907-
let report = [0x1Du8, 52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0];
872+
let report = [0x1Du8, 1, 52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0];
908873
let mut rbuf = [0u8; 64];
909874
dap.state.to_swd();
910875
match &mut dap.state {
@@ -931,7 +896,7 @@ mod test {
931896
"test_dap",
932897
);
933898

934-
let report = [0x1Du8, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00];
899+
let report = [0x1Du8, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00];
935900
let mut rbuf = [0u8; 64];
936901
dap.state.to_swd();
937902
match &mut dap.state {
@@ -961,7 +926,7 @@ mod test {
961926
"test_dap",
962927
);
963928

964-
let report = [0x1Du8, 0x80 | 52];
929+
let report = [0x1Du8, 1, 0x80 | 52];
965930
let mut rbuf = [0u8; 64];
966931
dap.state.to_swd();
967932
match &mut dap.state {
@@ -994,7 +959,7 @@ mod test {
994959
"test_dap",
995960
);
996961

997-
let report = [0x1Du8, 0x80];
962+
let report = [0x1Du8, 1, 0x80];
998963
let mut rbuf = [0u8; 64];
999964
dap.state.to_swd();
1000965
match &mut dap.state {
@@ -1017,4 +982,52 @@ mod test {
1017982
&[0x1Du8, 0x00, 0xFFu8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00]
1018983
)
1019984
}
985+
986+
#[test]
987+
fn test_target_select() {
988+
let mut dap = TestDap::new(
989+
MockSwdJtagDevice::new(),
990+
FakeLEDs {},
991+
StdDelayUs {},
992+
None,
993+
"test_dap",
994+
);
995+
996+
// write 8 bits, read 5 bits, write 33 bits
997+
let report = [0x1Du8, 3, 8, 0b10111101, 0x80 | 5, 33, 0x56, 0x83, 0xAB, 0x32, 0x01];
998+
let mut rbuf = [0u8; 64];
999+
dap.state.to_swd();
1000+
match &mut dap.state {
1001+
State::Swd(swd) => {
1002+
swd.expect_write_sequence()
1003+
.once()
1004+
.with(
1005+
eq(8),
1006+
eq([0b10111101u8]),
1007+
)
1008+
.return_const(Ok(()));
1009+
swd.expect_read_sequence()
1010+
.once()
1011+
.withf(|nbits, buf| buf.len() >= 1 && *nbits == 5)
1012+
.returning(|_, buf| {
1013+
buf[0] = 0x1F;
1014+
Ok(())
1015+
});
1016+
swd.expect_write_sequence()
1017+
.once()
1018+
.with(
1019+
eq(33),
1020+
eq([0x56, 0x83, 0xAB, 0x32, 0x01]),
1021+
)
1022+
.return_const(Ok(()));
1023+
}
1024+
_ => assert!(false, "can't switch to swd"),
1025+
}
1026+
let rsize = dap.process_command(&report, &mut rbuf, DapVersion::V2);
1027+
assert_eq!(rsize, 3);
1028+
assert_eq!(
1029+
&rbuf[..3],
1030+
&[0x1Du8, 0x00, 0x1F]
1031+
)
1032+
}
10201033
}

src/dap/request.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ impl<'a> Request<'a> {
3333
value
3434
}
3535

36+
pub fn consume(&mut self, count: usize) {
37+
self.data = &self.data[count..];
38+
}
39+
3640
pub fn rest(self) -> &'a [u8] {
3741
&self.data
3842
}

0 commit comments

Comments
 (0)