@@ -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}
0 commit comments