@@ -43,7 +43,7 @@ uint8_t data[4];
4343uint16_t dap_execute_command (uint16_t idxidx , uint8_t len ) {
4444 (void )len ;
4545 uint8_t idx = idxidx & 0xFF ;
46- uint8_t * ptr = & EP2FIFOBUF [idxidx >> 8 ];
46+ __xdata uint8_t * ptr = & EP2FIFOBUF [idxidx >> 8 ];
4747 uint8_t cmd = * ptr ++ ;
4848 scratch [idx ++ ] = cmd ;
4949 if (cmd == ID_DAP_ExecuteCommands ) {
@@ -102,7 +102,7 @@ uint16_t dap_execute_command(uint16_t idxidx, uint8_t len) {
102102 scratch [idx ++ ] = 1 ;
103103 scratch [idx ++ ] = 1 ;
104104 } else {
105- idx -- ;
105+ scratch [ idx ++ ] = 0 ;
106106 }
107107 } else if (cmd == ID_DAP_HostStatus ) {
108108 if (* ptr == 0 ) {
@@ -130,53 +130,76 @@ uint16_t dap_execute_command(uint16_t idxidx, uint8_t len) {
130130 } else if (cmd == ID_DAP_SWD_Configure ) {
131131 ptr += 1 ;
132132 // Configure pins
133- // PIN_SWDIO = 1; // set SWDIO to high
134- // PIN_SWCLK = 1; // set SWCLK to high
135- // PIN_SWDIO_OE |= PIN_SWDIO_MASK;
136- // PIN_SWCLK_OE |= PIN_SWCLK_MASK;
137133 SWD_Init ();
138134 scratch [idx ++ ] = DAP_OK ;
139135 } else if (cmd == ID_DAP_SWJ_Sequence ) {
140136 idxidx = (uint16_t )idx | (uint16_t )((uint16_t )ptr & 0xFF ) << 8 ;
141- return dap_execute_sequence (idxidx , len );
137+ return dap_execute_swj_sequence (idxidx , len );
138+ } else if (cmd == ID_DAP_SWD_Sequence ) {
139+ idxidx = (uint16_t )idx | (uint16_t )((uint16_t )ptr & 0xFF ) << 8 ;
140+ return dap_execute_swd_sequence (idxidx , len );
142141 } else {
143142 scratch [idx ++ ] = DAP_ERROR ;
144143 }
145144 idxidx = (uint16_t )idx | (uint16_t )((uint16_t )ptr & 0xFF ) << 8 ;
146145 return idxidx ;
147146}
148147
149- uint16_t dap_execute_sequence (uint16_t idxidx , uint8_t len ) {
148+ uint16_t dap_execute_swj_sequence (uint16_t idxidx , uint8_t len ) {
150149 (void )len ;
151150 uint8_t idx = idxidx & 0xFF ;
152- uint8_t * ptr = & EP2FIFOBUF [idxidx >> 8 ];
151+ __xdata uint8_t * ptr = & EP2FIFOBUF [idxidx >> 8 ];
153152
154- led_blink ();
153+ // led_blink();
155154
156155 uint8_t num = * ptr ++ ;
157156 // num == 0 indicates 256bits
158- if ((num & 7 ) != 0 ) {
159- num = (num ^ 7 ) + 9 ;
160- }
161- do {
162- uint8_t bits = * ptr ++ ;
163- num -= 8 ;
164- uint8_t n = ((num & 0xF8 ) != 0 ) ? 8 : 8 - num ;
165- for (uint8_t i = 0 ; i < n ; i ++ ) {
166- SWJ_Cycle (bits );
167- bits >>= 1 ;
168- }
169- } while ((num & 0xF8 ) != 0 );
157+ SWD_WriteSequence (num , ptr );
158+ ptr += (uint8_t )(((uint8_t )(num - 1 ) >> 3 ) + 1 );
170159 scratch [idx ++ ] = DAP_OK ;
171160 idxidx = (uint16_t )idx | (uint16_t )((uint16_t )ptr & 0xFF ) << 8 ;
172161 return idxidx ;
173162}
174163
164+ uint16_t dap_execute_swd_sequence (uint16_t idxidx , uint8_t len ) {
165+ (void )len ;
166+ uint8_t idx = idxidx & 0xFF ;
167+ __xdata uint8_t * ptr = & EP2FIFOBUF [idxidx >> 8 ];
168+
169+ // led_blink();
170+
171+ scratch [idx ++ ] = DAP_OK ;
172+ uint8_t count = * ptr ++ ;
173+ while (count -- ) {
174+ uint8_t num = * ptr ++ ;
175+ if ((num & 0x80 ) == 0 ) {
176+ num &= 0x3F ;
177+ // num == 0 indicates 64bits
178+ if (num == 0 ) {
179+ num = 64 ;
180+ }
181+ SWD_WriteSequence (num , ptr );
182+ ptr += ((uint8_t )(num + 7 ) >> 3 );
183+ } else {
184+ num &= 0x3F ;
185+ // num == 0 indicates 64bits
186+ if (num == 0 ) {
187+ num = 64 ;
188+ }
189+ SWD_ReadSequence (num , & scratch [idx ]);
190+ idx += ((uint8_t )(num + 7 ) >> 3 );
191+ }
192+ }
193+
194+ idxidx = (uint16_t )idx | (uint16_t )((uint16_t )ptr & 0xFF ) << 8 ;
195+ return idxidx ;
196+ }
197+
175198uint16_t dap_execute_transfer (uint16_t idxidx , uint8_t len ) {
176199 (void )len ;
177- uint8_t * request = & EP2FIFOBUF [idxidx >> 8 ];
200+ __xdata uint8_t * request = & EP2FIFOBUF [idxidx >> 8 ];
178201 uint8_t idx = idxidx & 0xFF ;
179- uint8_t * response = & scratch [idx ];
202+ __xdata uint8_t * response = & scratch [idx ];
180203
181204 // uint8_t dap_port = *ptr++;
182205 // uint8_t cnt = *ptr++;
@@ -186,7 +209,7 @@ uint16_t dap_execute_transfer(uint16_t idxidx, uint8_t len) {
186209 // uint8_t *request_head;
187210 uint8_t request_count ;
188211 uint8_t request_value ;
189- uint8_t * response_head ;
212+ __xdata uint8_t * response_head ;
190213 uint8_t response_count ;
191214 uint8_t response_value ;
192215 uint8_t post_read ;
@@ -443,17 +466,17 @@ uint16_t dap_execute_transfer(uint16_t idxidx, uint8_t len) {
443466
444467uint16_t dap_execute_transfer_block (uint16_t idxidx , uint8_t len ) {
445468 (void )len ;
446- uint8_t * request = & EP2FIFOBUF [idxidx >> 8 ];
469+ __xdata uint8_t * request = & EP2FIFOBUF [idxidx >> 8 ];
447470 uint8_t idx = idxidx & 0xFF ;
448- uint8_t * response = & scratch [idx ];
471+ __xdata uint8_t * response = & scratch [idx ];
449472
450473 // static uint32_t DAP_SWD_TransferBlock(const uint8_t *request, uint8_t *response) {
451474
452475 uint16_t request_count ;
453476 uint8_t request_value ;
454477 uint16_t response_count ;
455478 uint8_t response_value ;
456- uint8_t * response_head ;
479+ __xdata uint8_t * response_head ;
457480 uint8_t retry ;
458481 // uint32_t data;
459482
0 commit comments