1 /***************************************************************************
2 * Copyright (C) 2016 by Maksym Hilliaka *
3 * oter@frozen-team.com *
5 * Copyright (C) 2016 by Phillip Pearson *
8 * Copyright (C) 2014 by Paul Fertser *
9 * fercerpav@gmail.com *
11 * Copyright (C) 2013 by mike brown *
12 * mike@theshedworks.org.uk *
14 * Copyright (C) 2013 by Spencer Oliver *
15 * spen@spen-soft.co.uk *
17 * This program is free software; you can redistribute it and/or modify *
18 * it under the terms of the GNU General Public License as published by *
19 * the Free Software Foundation; either version 2 of the License, or *
20 * (at your option) any later version. *
22 * This program is distributed in the hope that it will be useful, *
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
25 * GNU General Public License for more details. *
27 * You should have received a copy of the GNU General Public License *
28 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
29 ***************************************************************************/
35 #include <transport/transport.h>
37 #include <jtag/interface.h>
38 #include <jtag/commands.h>
44 * See CMSIS-DAP documentation:
45 * Version 0.01 - Beta.
50 /* Known vid/pid pairs:
51 * VID 0xc251: Keil Software
52 * PID 0xf001: LPC-Link-II CMSIS_DAP
53 * PID 0xf002: OPEN-SDA CMSIS_DAP (Freedom Board)
54 * PID 0x2722: Keil ULINK2 CMSIS-DAP
56 * VID 0x0d28: mbed Software
57 * PID 0x0204: MBED CMSIS-DAP
61 /* vid = pid = 0 marks the end of the list */
62 static uint16_t cmsis_dap_vid
[MAX_USB_IDS
+ 1] = { 0 };
63 static uint16_t cmsis_dap_pid
[MAX_USB_IDS
+ 1] = { 0 };
64 static wchar_t *cmsis_dap_serial
;
67 #define PACKET_SIZE (64 + 1) /* 64 bytes plus report id */
68 #define USB_TIMEOUT 1000
70 /* CMSIS-DAP General Commands */
71 #define CMD_DAP_INFO 0x00
72 #define CMD_DAP_LED 0x01
73 #define CMD_DAP_CONNECT 0x02
74 #define CMD_DAP_DISCONNECT 0x03
75 #define CMD_DAP_WRITE_ABORT 0x08
76 #define CMD_DAP_DELAY 0x09
77 #define CMD_DAP_RESET_TARGET 0x0A
80 #define INFO_ID_VID 0x00 /* string */
81 #define INFO_ID_PID 0x02 /* string */
82 #define INFO_ID_SERNUM 0x03 /* string */
83 #define INFO_ID_FW_VER 0x04 /* string */
84 #define INFO_ID_TD_VEND 0x05 /* string */
85 #define INFO_ID_TD_NAME 0x06 /* string */
86 #define INFO_ID_CAPS 0xf0 /* byte */
87 #define INFO_ID_PKT_CNT 0xfe /* byte */
88 #define INFO_ID_PKT_SZ 0xff /* short */
90 #define INFO_CAPS_SWD 0x01
91 #define INFO_CAPS_JTAG 0x02
94 #define LED_ID_CONNECT 0x00
95 #define LED_ID_RUN 0x01
101 #define CONNECT_DEFAULT 0x00
102 #define CONNECT_SWD 0x01
103 #define CONNECT_JTAG 0x02
105 /* CMSIS-DAP Common SWD/JTAG Commands */
106 #define CMD_DAP_DELAY 0x09
107 #define CMD_DAP_SWJ_PINS 0x10
108 #define CMD_DAP_SWJ_CLOCK 0x11
109 #define CMD_DAP_SWJ_SEQ 0x12
121 #define SWJ_PIN_TCK (1<<0)
122 #define SWJ_PIN_TMS (1<<1)
123 #define SWJ_PIN_TDI (1<<2)
124 #define SWJ_PIN_TDO (1<<3)
125 #define SWJ_PIN_TRST (1<<5)
126 #define SWJ_PIN_SRST (1<<7)
128 /* CMSIS-DAP SWD Commands */
129 #define CMD_DAP_SWD_CONFIGURE 0x13
131 /* CMSIS-DAP JTAG Commands */
132 #define CMD_DAP_JTAG_SEQ 0x14
133 #define CMD_DAP_JTAG_CONFIGURE 0x15
134 #define CMD_DAP_JTAG_IDCODE 0x16
136 /* CMSIS-DAP JTAG sequence info masks */
137 /* Number of bits to clock through (0 means 64) */
138 #define DAP_JTAG_SEQ_TCK 0x3F
139 /* TMS will be set during the sequence if this bit is set */
140 #define DAP_JTAG_SEQ_TMS 0x40
141 /* TDO output will be captured if this bit is set */
142 #define DAP_JTAG_SEQ_TDO 0x80
145 /* CMSIS-DAP Transfer Commands */
146 #define CMD_DAP_TFER_CONFIGURE 0x04
147 #define CMD_DAP_TFER 0x05
148 #define CMD_DAP_TFER_BLOCK 0x06
149 #define CMD_DAP_TFER_ABORT 0x07
151 /* DAP Status Code */
153 #define DAP_ERROR 0xFF
155 /* CMSIS-DAP Vendor Commands
158 static const char * const info_caps_str
[] = {
163 /* max clock speed (kHz) */
164 #define DAP_MAX_CLOCK 5000
167 hid_device
*dev_handle
;
168 uint16_t packet_size
;
170 uint8_t *packet_buffer
;
175 struct pending_transfer_result
{
181 struct pending_request_block
{
182 struct pending_transfer_result
*transfers
;
186 struct pending_scan_result
{
187 /** Offset in bytes in the CMD_DAP_JTAG_SEQ response buffer. */
189 /** Number of bits to read. */
191 /** Location to store the result */
193 /** Offset in the destination buffer */
194 unsigned buffer_offset
;
197 /* Up to MIN(packet_count, MAX_PENDING_REQUESTS) requests may be issued
198 * until the first response arrives */
199 #define MAX_PENDING_REQUESTS 3
201 /* Pending requests are organized as a FIFO - circular buffer */
202 /* Each block in FIFO can contain up to pending_queue_len transfers */
203 static int pending_queue_len
;
204 static struct pending_request_block pending_fifo
[MAX_PENDING_REQUESTS
];
205 static int pending_fifo_put_idx
, pending_fifo_get_idx
;
206 static int pending_fifo_block_count
;
208 /* pointers to buffers that will receive jtag scan results on the next flush */
209 #define MAX_PENDING_SCAN_RESULTS 256
210 static int pending_scan_result_count
;
211 static struct pending_scan_result pending_scan_results
[MAX_PENDING_SCAN_RESULTS
];
213 /* queued JTAG sequences that will be executed on the next flush */
214 #define QUEUED_SEQ_BUF_LEN (cmsis_dap_handle->packet_size - 3)
215 static int queued_seq_count
;
216 static int queued_seq_buf_end
;
217 static int queued_seq_tdo_ptr
;
218 static uint8_t queued_seq_buf
[1024]; /* TODO: make dynamic / move into cmsis object */
220 static int queued_retval
;
222 static uint8_t output_pins
= SWJ_PIN_SRST
| SWJ_PIN_TRST
;
224 static struct cmsis_dap
*cmsis_dap_handle
;
226 static int cmsis_dap_usb_open(void)
228 hid_device
*dev
= NULL
;
230 struct hid_device_info
*devs
, *cur_dev
;
231 unsigned short target_vid
, target_pid
;
232 wchar_t *target_serial
= NULL
;
235 bool serial_found
= false;
241 * The CMSIS-DAP specification stipulates:
242 * "The Product String must contain "CMSIS-DAP" somewhere in the string. This is used by the
243 * debuggers to identify a CMSIS-DAP compliant Debug Unit that is connected to a host computer."
245 devs
= hid_enumerate(0x0, 0x0);
247 while (NULL
!= cur_dev
) {
248 if (0 == cmsis_dap_vid
[0]) {
249 if (NULL
== cur_dev
->product_string
) {
250 LOG_DEBUG("Cannot read product string of device 0x%x:0x%x",
251 cur_dev
->vendor_id
, cur_dev
->product_id
);
253 if (wcsstr(cur_dev
->product_string
, L
"CMSIS-DAP")) {
254 /* if the user hasn't specified VID:PID *and*
255 * product string contains "CMSIS-DAP", pick it
261 /* otherwise, exhaustively compare against all VID:PID in list */
262 for (i
= 0; cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
]; i
++) {
263 if ((cmsis_dap_vid
[i
] == cur_dev
->vendor_id
) && (cmsis_dap_pid
[i
] == cur_dev
->product_id
))
267 if (cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
])
272 /* we have found an adapter, so exit further checks */
273 /* check serial number matches if given */
274 if (cmsis_dap_serial
!= NULL
) {
275 if ((cur_dev
->serial_number
!= NULL
) && wcscmp(cmsis_dap_serial
, cur_dev
->serial_number
) == 0) {
285 cur_dev
= cur_dev
->next
;
288 if (NULL
!= cur_dev
) {
289 target_vid
= cur_dev
->vendor_id
;
290 target_pid
= cur_dev
->product_id
;
292 target_serial
= cmsis_dap_serial
;
295 hid_free_enumeration(devs
);
297 if (target_vid
== 0 && target_pid
== 0) {
298 LOG_ERROR("unable to find CMSIS-DAP device");
302 if (hid_init() != 0) {
303 LOG_ERROR("unable to open HIDAPI");
307 dev
= hid_open(target_vid
, target_pid
, target_serial
);
310 LOG_ERROR("unable to open CMSIS-DAP device 0x%x:0x%x", target_vid
, target_pid
);
314 struct cmsis_dap
*dap
= malloc(sizeof(struct cmsis_dap
));
316 LOG_ERROR("unable to allocate memory");
320 dap
->dev_handle
= dev
;
324 cmsis_dap_handle
= dap
;
326 /* allocate default packet buffer, may be changed later.
327 * currently with HIDAPI we have no way of getting the output report length
328 * without this info we cannot communicate with the adapter.
329 * For the moment we ahve to hard code the packet size */
331 int packet_size
= PACKET_SIZE
;
333 /* atmel cmsis-dap uses 512 byte reports */
334 /* except when it doesn't e.g. with mEDBG on SAMD10 Xplained
336 /* TODO: HID report descriptor should be parsed instead of
337 * hardcoding a match by VID */
338 if (target_vid
== 0x03eb && target_pid
!= 0x2145)
339 packet_size
= 512 + 1;
341 cmsis_dap_handle
->packet_buffer
= malloc(packet_size
);
342 cmsis_dap_handle
->packet_size
= packet_size
;
344 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
345 LOG_ERROR("unable to allocate memory");
352 static void cmsis_dap_usb_close(struct cmsis_dap
*dap
)
354 hid_close(dap
->dev_handle
);
357 free(cmsis_dap_handle
->packet_buffer
);
358 free(cmsis_dap_handle
);
359 cmsis_dap_handle
= NULL
;
360 free(cmsis_dap_serial
);
361 cmsis_dap_serial
= NULL
;
363 for (int i
= 0; i
< MAX_PENDING_REQUESTS
; i
++) {
364 free(pending_fifo
[i
].transfers
);
365 pending_fifo
[i
].transfers
= NULL
;
371 static int cmsis_dap_usb_write(struct cmsis_dap
*dap
, int txlen
)
373 #ifdef CMSIS_DAP_JTAG_DEBUG
374 LOG_DEBUG("cmsis-dap usb xfer cmd=%02X", dap
->packet_buffer
[1]);
376 /* Pad the rest of the TX buffer with 0's */
377 memset(dap
->packet_buffer
+ txlen
, 0, dap
->packet_size
- txlen
);
379 /* write data to device */
380 int retval
= hid_write(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
);
382 LOG_ERROR("error writing data: %ls", hid_error(dap
->dev_handle
));
389 /* Send a message and receive the reply */
390 static int cmsis_dap_usb_xfer(struct cmsis_dap
*dap
, int txlen
)
392 if (pending_fifo_block_count
) {
393 LOG_ERROR("pending %d blocks, flushing", pending_fifo_block_count
);
394 while (pending_fifo_block_count
) {
395 hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, 10);
396 pending_fifo_block_count
--;
398 pending_fifo_put_idx
= 0;
399 pending_fifo_get_idx
= 0;
402 int retval
= cmsis_dap_usb_write(dap
, txlen
);
403 if (retval
!= ERROR_OK
)
407 retval
= hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, USB_TIMEOUT
);
408 if (retval
== -1 || retval
== 0) {
409 LOG_DEBUG("error reading data: %ls", hid_error(dap
->dev_handle
));
416 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins
, uint8_t mask
, uint32_t delay
, uint8_t *input
)
419 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
421 buffer
[0] = 0; /* report number */
422 buffer
[1] = CMD_DAP_SWJ_PINS
;
425 buffer
[4] = delay
& 0xff;
426 buffer
[5] = (delay
>> 8) & 0xff;
427 buffer
[6] = (delay
>> 16) & 0xff;
428 buffer
[7] = (delay
>> 24) & 0xff;
429 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 8);
431 if (retval
!= ERROR_OK
) {
432 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
433 return ERROR_JTAG_DEVICE_ERROR
;
442 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock
)
445 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
447 /* set clock in Hz */
449 buffer
[0] = 0; /* report number */
450 buffer
[1] = CMD_DAP_SWJ_CLOCK
;
451 buffer
[2] = swj_clock
& 0xff;
452 buffer
[3] = (swj_clock
>> 8) & 0xff;
453 buffer
[4] = (swj_clock
>> 16) & 0xff;
454 buffer
[5] = (swj_clock
>> 24) & 0xff;
455 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 6);
457 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
458 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
459 return ERROR_JTAG_DEVICE_ERROR
;
465 /* clock a sequence of bits out on TMS, to change JTAG states */
466 static int cmsis_dap_cmd_DAP_SWJ_Sequence(uint8_t s_len
, const uint8_t *sequence
)
469 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
471 #ifdef CMSIS_DAP_JTAG_DEBUG
472 LOG_DEBUG("cmsis-dap TMS sequence: len=%d", s_len
);
473 for (int i
= 0; i
< DIV_ROUND_UP(s_len
, 8); ++i
)
474 printf("%02X ", sequence
[i
]);
479 buffer
[0] = 0; /* report number */
480 buffer
[1] = CMD_DAP_SWJ_SEQ
;
482 bit_copy(&buffer
[3], 0, sequence
, 0, s_len
);
484 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, DIV_ROUND_UP(s_len
, 8) + 3);
486 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
492 static int cmsis_dap_cmd_DAP_Info(uint8_t info
, uint8_t **data
)
495 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
497 buffer
[0] = 0; /* report number */
498 buffer
[1] = CMD_DAP_INFO
;
500 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
502 if (retval
!= ERROR_OK
) {
503 LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
504 return ERROR_JTAG_DEVICE_ERROR
;
507 *data
= &(buffer
[1]);
512 static int cmsis_dap_cmd_DAP_LED(uint8_t leds
)
515 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
517 buffer
[0] = 0; /* report number */
518 buffer
[1] = CMD_DAP_LED
;
521 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
523 if (retval
!= ERROR_OK
|| buffer
[1] != 0x00) {
524 LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
525 return ERROR_JTAG_DEVICE_ERROR
;
531 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode
)
534 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
536 buffer
[0] = 0; /* report number */
537 buffer
[1] = CMD_DAP_CONNECT
;
539 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
541 if (retval
!= ERROR_OK
) {
542 LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
543 return ERROR_JTAG_DEVICE_ERROR
;
546 if (buffer
[1] != mode
) {
547 LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode
);
548 return ERROR_JTAG_DEVICE_ERROR
;
554 static int cmsis_dap_cmd_DAP_Disconnect(void)
557 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
559 buffer
[0] = 0; /* report number */
560 buffer
[1] = CMD_DAP_DISCONNECT
;
561 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
563 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
564 LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
565 return ERROR_JTAG_DEVICE_ERROR
;
571 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle
, uint16_t retry_count
, uint16_t match_retry
)
574 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
576 buffer
[0] = 0; /* report number */
577 buffer
[1] = CMD_DAP_TFER_CONFIGURE
;
579 buffer
[3] = retry_count
& 0xff;
580 buffer
[4] = (retry_count
>> 8) & 0xff;
581 buffer
[5] = match_retry
& 0xff;
582 buffer
[6] = (match_retry
>> 8) & 0xff;
583 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
585 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
586 LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
587 return ERROR_JTAG_DEVICE_ERROR
;
593 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg
)
596 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
598 buffer
[0] = 0; /* report number */
599 buffer
[1] = CMD_DAP_SWD_CONFIGURE
;
601 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
603 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
604 LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
605 return ERROR_JTAG_DEVICE_ERROR
;
612 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us
)
615 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
617 buffer
[0] = 0; /* report number */
618 buffer
[1] = CMD_DAP_DELAY
;
619 buffer
[2] = delay_us
& 0xff;
620 buffer
[3] = (delay_us
>> 8) & 0xff;
621 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
623 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
624 LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
625 return ERROR_JTAG_DEVICE_ERROR
;
632 static void cmsis_dap_swd_write_from_queue(struct cmsis_dap
*dap
)
634 uint8_t *buffer
= dap
->packet_buffer
;
635 struct pending_request_block
*block
= &pending_fifo
[pending_fifo_put_idx
];
637 LOG_DEBUG_IO("Executing %d queued transactions from FIFO index %d", block
->transfer_count
, pending_fifo_put_idx
);
639 if (queued_retval
!= ERROR_OK
) {
640 LOG_DEBUG("Skipping due to previous errors: %d", queued_retval
);
644 if (block
->transfer_count
== 0)
648 buffer
[idx
++] = 0; /* report number */
649 buffer
[idx
++] = CMD_DAP_TFER
;
650 buffer
[idx
++] = 0x00; /* DAP Index */
651 buffer
[idx
++] = block
->transfer_count
;
653 for (int i
= 0; i
< block
->transfer_count
; i
++) {
654 struct pending_transfer_result
*transfer
= &(block
->transfers
[i
]);
655 uint8_t cmd
= transfer
->cmd
;
656 uint32_t data
= transfer
->data
;
658 LOG_DEBUG_IO("%s %s reg %x %"PRIx32
,
659 cmd
& SWD_CMD_APnDP
? "AP" : "DP",
660 cmd
& SWD_CMD_RnW
? "read" : "write",
661 (cmd
& SWD_CMD_A32
) >> 1, data
);
663 /* When proper WAIT handling is implemented in the
664 * common SWD framework, this kludge can be
665 * removed. However, this might lead to minor
666 * performance degradation as the adapter wouldn't be
667 * able to automatically retry anything (because ARM
668 * has forgotten to implement sticky error flags
669 * clearing). See also comments regarding
670 * cmsis_dap_cmd_DAP_TFER_Configure() and
671 * cmsis_dap_cmd_DAP_SWD_Configure() in
674 if (!(cmd
& SWD_CMD_RnW
) &&
675 !(cmd
& SWD_CMD_APnDP
) &&
676 (cmd
& SWD_CMD_A32
) >> 1 == DP_CTRL_STAT
&&
677 (data
& CORUNDETECT
)) {
678 LOG_DEBUG("refusing to enable sticky overrun detection");
679 data
&= ~CORUNDETECT
;
682 buffer
[idx
++] = (cmd
>> 1) & 0x0f;
683 if (!(cmd
& SWD_CMD_RnW
)) {
684 buffer
[idx
++] = (data
) & 0xff;
685 buffer
[idx
++] = (data
>> 8) & 0xff;
686 buffer
[idx
++] = (data
>> 16) & 0xff;
687 buffer
[idx
++] = (data
>> 24) & 0xff;
691 queued_retval
= cmsis_dap_usb_write(dap
, idx
);
692 if (queued_retval
!= ERROR_OK
)
695 pending_fifo_put_idx
= (pending_fifo_put_idx
+ 1) % dap
->packet_count
;
696 pending_fifo_block_count
++;
697 if (pending_fifo_block_count
> dap
->packet_count
)
698 LOG_ERROR("too much pending writes %d", pending_fifo_block_count
);
703 block
->transfer_count
= 0;
706 static void cmsis_dap_swd_read_process(struct cmsis_dap
*dap
, int timeout_ms
)
708 uint8_t *buffer
= dap
->packet_buffer
;
709 struct pending_request_block
*block
= &pending_fifo
[pending_fifo_get_idx
];
711 if (pending_fifo_block_count
== 0)
712 LOG_ERROR("no pending write");
715 int retval
= hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, timeout_ms
);
716 if (retval
== 0 && timeout_ms
< USB_TIMEOUT
)
719 if (retval
== -1 || retval
== 0) {
720 LOG_DEBUG("error reading data: %ls", hid_error(dap
->dev_handle
));
721 queued_retval
= ERROR_FAIL
;
725 if (buffer
[2] & 0x08) {
726 LOG_DEBUG("CMSIS-DAP Protocol Error @ %d (wrong parity)", buffer
[1]);
727 queued_retval
= ERROR_FAIL
;
730 uint8_t ack
= buffer
[2] & 0x07;
731 if (ack
!= SWD_ACK_OK
) {
732 LOG_DEBUG("SWD ack not OK @ %d %s", buffer
[1],
733 ack
== SWD_ACK_WAIT
? "WAIT" : ack
== SWD_ACK_FAULT
? "FAULT" : "JUNK");
734 queued_retval
= ack
== SWD_ACK_WAIT
? ERROR_WAIT
: ERROR_FAIL
;
738 if (block
->transfer_count
!= buffer
[1])
739 LOG_ERROR("CMSIS-DAP transfer count mismatch: expected %d, got %d",
740 block
->transfer_count
, buffer
[1]);
742 LOG_DEBUG_IO("Received results of %d queued transactions FIFO index %d", buffer
[1], pending_fifo_get_idx
);
744 for (int i
= 0; i
< buffer
[1]; i
++) {
745 struct pending_transfer_result
*transfer
= &(block
->transfers
[i
]);
746 if (transfer
->cmd
& SWD_CMD_RnW
) {
747 static uint32_t last_read
;
748 uint32_t data
= le_to_h_u32(&buffer
[idx
]);
752 LOG_DEBUG_IO("Read result: %"PRIx32
, data
);
754 /* Imitate posted AP reads */
755 if ((transfer
->cmd
& SWD_CMD_APnDP
) ||
756 ((transfer
->cmd
& SWD_CMD_A32
) >> 1 == DP_RDBUFF
)) {
761 if (transfer
->buffer
)
762 *(uint32_t *)(transfer
->buffer
) = tmp
;
767 block
->transfer_count
= 0;
768 pending_fifo_get_idx
= (pending_fifo_get_idx
+ 1) % dap
->packet_count
;
769 pending_fifo_block_count
--;
772 static int cmsis_dap_swd_run_queue(void)
774 if (pending_fifo_block_count
)
775 cmsis_dap_swd_read_process(cmsis_dap_handle
, 0);
777 cmsis_dap_swd_write_from_queue(cmsis_dap_handle
);
779 while (pending_fifo_block_count
)
780 cmsis_dap_swd_read_process(cmsis_dap_handle
, USB_TIMEOUT
);
782 pending_fifo_put_idx
= 0;
783 pending_fifo_get_idx
= 0;
785 int retval
= queued_retval
;
786 queued_retval
= ERROR_OK
;
791 static void cmsis_dap_swd_queue_cmd(uint8_t cmd
, uint32_t *dst
, uint32_t data
)
793 if (pending_fifo
[pending_fifo_put_idx
].transfer_count
== pending_queue_len
) {
794 if (pending_fifo_block_count
)
795 cmsis_dap_swd_read_process(cmsis_dap_handle
, 0);
797 /* Not enough room in the queue. Run the queue. */
798 cmsis_dap_swd_write_from_queue(cmsis_dap_handle
);
800 if (pending_fifo_block_count
>= cmsis_dap_handle
->packet_count
)
801 cmsis_dap_swd_read_process(cmsis_dap_handle
, USB_TIMEOUT
);
804 if (queued_retval
!= ERROR_OK
)
807 struct pending_request_block
*block
= &pending_fifo
[pending_fifo_put_idx
];
808 struct pending_transfer_result
*transfer
= &(block
->transfers
[block
->transfer_count
]);
809 transfer
->data
= data
;
811 if (cmd
& SWD_CMD_RnW
) {
812 /* Queue a read transaction */
813 transfer
->buffer
= dst
;
815 block
->transfer_count
++;
818 static void cmsis_dap_swd_write_reg(uint8_t cmd
, uint32_t value
, uint32_t ap_delay_clk
)
820 assert(!(cmd
& SWD_CMD_RnW
));
821 cmsis_dap_swd_queue_cmd(cmd
, NULL
, value
);
824 static void cmsis_dap_swd_read_reg(uint8_t cmd
, uint32_t *value
, uint32_t ap_delay_clk
)
826 assert(cmd
& SWD_CMD_RnW
);
827 cmsis_dap_swd_queue_cmd(cmd
, value
, 0);
830 static int cmsis_dap_get_serial_info(void)
834 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_SERNUM
, &data
);
835 if (retval
!= ERROR_OK
)
838 if (data
[0]) /* strlen */
839 LOG_INFO("CMSIS-DAP: Serial# = %s", &data
[1]);
844 static int cmsis_dap_get_version_info(void)
848 /* INFO_ID_FW_VER - string */
849 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER
, &data
);
850 if (retval
!= ERROR_OK
)
853 if (data
[0]) /* strlen */
854 LOG_INFO("CMSIS-DAP: FW Version = %s", &data
[1]);
859 static int cmsis_dap_get_caps_info(void)
863 /* INFO_ID_CAPS - byte */
864 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS
, &data
);
865 if (retval
!= ERROR_OK
)
869 uint8_t caps
= data
[1];
871 cmsis_dap_handle
->caps
= caps
;
873 if (caps
& INFO_CAPS_SWD
)
874 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[0]);
875 if (caps
& INFO_CAPS_JTAG
)
876 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[1]);
882 static int cmsis_dap_get_status(void)
886 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d
);
888 if (retval
== ERROR_OK
) {
889 LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
890 (d
& SWJ_PIN_TCK
) ? 1 : 0,
891 (d
& SWJ_PIN_TMS
) ? 1 : 0,
892 (d
& SWJ_PIN_TDI
) ? 1 : 0,
893 (d
& SWJ_PIN_TDO
) ? 1 : 0,
894 (d
& SWJ_PIN_TRST
) ? 1 : 0,
895 (d
& SWJ_PIN_SRST
) ? 1 : 0);
901 static int cmsis_dap_swd_switch_seq(enum swd_special_seq seq
)
907 if ((output_pins
& (SWJ_PIN_SRST
| SWJ_PIN_TRST
)) == (SWJ_PIN_SRST
| SWJ_PIN_TRST
)) {
908 /* Following workaround deasserts reset on most adapters.
909 * Do not reconnect if a reset line is active!
910 * Reconnecting would break connecting under reset. */
912 /* First disconnect before connecting, Atmel EDBG needs it for SAMD/R/L/C */
913 cmsis_dap_cmd_DAP_Disconnect();
915 /* When we are reconnecting, DAP_Connect needs to be rerun, at
916 * least on Keil ULINK-ME */
917 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
918 if (retval
!= ERROR_OK
)
924 LOG_DEBUG("SWD line reset");
925 s
= swd_seq_line_reset
;
926 s_len
= swd_seq_line_reset_len
;
929 LOG_DEBUG("JTAG-to-SWD");
930 s
= swd_seq_jtag_to_swd
;
931 s_len
= swd_seq_jtag_to_swd_len
;
934 LOG_DEBUG("SWD-to-JTAG");
935 s
= swd_seq_swd_to_jtag
;
936 s_len
= swd_seq_swd_to_jtag_len
;
939 LOG_ERROR("Sequence %d not supported", seq
);
943 retval
= cmsis_dap_cmd_DAP_SWJ_Sequence(s_len
, s
);
944 if (retval
!= ERROR_OK
)
947 /* Atmel EDBG needs renew clock setting after SWJ_Sequence
948 * otherwise default frequency is used */
949 return cmsis_dap_cmd_DAP_SWJ_Clock(jtag_get_speed_khz());
952 static int cmsis_dap_swd_open(void)
956 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_SWD
)) {
957 LOG_ERROR("CMSIS-DAP: SWD not supported");
958 return ERROR_JTAG_DEVICE_ERROR
;
961 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
962 if (retval
!= ERROR_OK
)
965 /* Add more setup here.??... */
967 LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
971 static int cmsis_dap_init(void)
976 retval
= cmsis_dap_usb_open();
977 if (retval
!= ERROR_OK
)
980 retval
= cmsis_dap_get_caps_info();
981 if (retval
!= ERROR_OK
)
984 retval
= cmsis_dap_get_version_info();
985 if (retval
!= ERROR_OK
)
988 retval
= cmsis_dap_get_serial_info();
989 if (retval
!= ERROR_OK
)
993 retval
= cmsis_dap_swd_open();
994 if (retval
!= ERROR_OK
)
997 /* Connect in JTAG mode */
998 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_JTAG
)) {
999 LOG_ERROR("CMSIS-DAP: JTAG not supported");
1000 return ERROR_JTAG_DEVICE_ERROR
;
1003 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_JTAG
);
1004 if (retval
!= ERROR_OK
)
1007 LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
1010 /* Be conservative and supress submiting multiple HID requests
1011 * until we get packet count info from the adaptor */
1012 cmsis_dap_handle
->packet_count
= 1;
1013 pending_queue_len
= 12;
1015 /* INFO_ID_PKT_SZ - short */
1016 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ
, &data
);
1017 if (retval
!= ERROR_OK
)
1020 if (data
[0] == 2) { /* short */
1021 uint16_t pkt_sz
= data
[1] + (data
[2] << 8);
1023 /* 4 bytes of command header + 5 bytes per register
1024 * write. For bulk read sequences just 4 bytes are
1025 * needed per transfer, so this is suboptimal. */
1026 pending_queue_len
= (pkt_sz
- 4) / 5;
1028 if (cmsis_dap_handle
->packet_size
!= pkt_sz
+ 1) {
1029 /* reallocate buffer */
1030 cmsis_dap_handle
->packet_size
= pkt_sz
+ 1;
1031 cmsis_dap_handle
->packet_buffer
= realloc(cmsis_dap_handle
->packet_buffer
,
1032 cmsis_dap_handle
->packet_size
);
1033 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
1034 LOG_ERROR("unable to reallocate memory");
1039 LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16
, pkt_sz
);
1042 /* INFO_ID_PKT_CNT - byte */
1043 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT
, &data
);
1044 if (retval
!= ERROR_OK
)
1047 if (data
[0] == 1) { /* byte */
1048 int pkt_cnt
= data
[1];
1050 cmsis_dap_handle
->packet_count
= MIN(MAX_PENDING_REQUESTS
, pkt_cnt
);
1052 LOG_DEBUG("CMSIS-DAP: Packet Count = %d", pkt_cnt
);
1055 LOG_DEBUG("Allocating FIFO for %d pending HID requests", cmsis_dap_handle
->packet_count
);
1056 for (int i
= 0; i
< cmsis_dap_handle
->packet_count
; i
++) {
1057 pending_fifo
[i
].transfers
= malloc(pending_queue_len
* sizeof(struct pending_transfer_result
));
1058 if (!pending_fifo
[i
].transfers
) {
1059 LOG_ERROR("Unable to allocate memory for CMSIS-DAP queue");
1065 retval
= cmsis_dap_get_status();
1066 if (retval
!= ERROR_OK
)
1069 /* Now try to connect to the target
1070 * TODO: This is all SWD only @ present */
1071 retval
= cmsis_dap_cmd_DAP_SWJ_Clock(jtag_get_speed_khz());
1072 if (retval
!= ERROR_OK
)
1075 /* Ask CMSIS-DAP to automatically retry on receiving WAIT for
1076 * up to 64 times. This must be changed to 0 if sticky
1077 * overrun detection is enabled. */
1078 retval
= cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
1079 if (retval
!= ERROR_OK
)
1083 /* Data Phase (bit 2) must be set to 1 if sticky overrun
1084 * detection is enabled */
1085 retval
= cmsis_dap_cmd_DAP_SWD_Configure(0); /* 1 TRN, no Data Phase */
1086 if (retval
!= ERROR_OK
)
1090 retval
= cmsis_dap_cmd_DAP_LED(0x03); /* Both LEDs on */
1091 if (retval
!= ERROR_OK
)
1094 /* support connecting with srst asserted */
1095 enum reset_types jtag_reset_config
= jtag_get_reset_config();
1097 if (jtag_reset_config
& RESET_CNCT_UNDER_SRST
) {
1098 if (jtag_reset_config
& RESET_SRST_NO_GATING
) {
1099 retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL
);
1100 if (retval
!= ERROR_OK
)
1102 LOG_INFO("Connecting under reset");
1106 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
1108 LOG_INFO("CMSIS-DAP: Interface ready");
1113 static int cmsis_dap_swd_init(void)
1119 static int cmsis_dap_quit(void)
1121 cmsis_dap_cmd_DAP_Disconnect();
1122 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
1124 cmsis_dap_usb_close(cmsis_dap_handle
);
1129 static void cmsis_dap_execute_reset(struct jtag_command
*cmd
)
1131 /* Set both TRST and SRST even if they're not enabled as
1132 * there's no way to tristate them */
1135 if (!cmd
->cmd
.reset
->srst
)
1136 output_pins
|= SWJ_PIN_SRST
;
1137 if (!cmd
->cmd
.reset
->trst
)
1138 output_pins
|= SWJ_PIN_TRST
;
1140 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(output_pins
,
1141 SWJ_PIN_TRST
| SWJ_PIN_SRST
, 0, NULL
);
1142 if (retval
!= ERROR_OK
)
1143 LOG_ERROR("CMSIS-DAP: Interface reset failed");
1146 static void cmsis_dap_execute_sleep(struct jtag_command
*cmd
)
1149 int retval
= cmsis_dap_cmd_DAP_Delay(cmd
->cmd
.sleep
->us
);
1150 if (retval
!= ERROR_OK
)
1152 jtag_sleep(cmd
->cmd
.sleep
->us
);
1155 /* Set TMS high for five TCK clocks, to move the TAP to the Test-Logic-Reset state */
1156 static int cmsis_dap_execute_tlr_reset(struct jtag_command
*cmd
)
1158 LOG_INFO("cmsis-dap JTAG TLR_RESET");
1160 int ret
= cmsis_dap_cmd_DAP_SWJ_Sequence(8, &seq
);
1161 if (ret
== ERROR_OK
)
1162 tap_set_state(TAP_RESET
);
1166 /* Set new end state */
1167 static void cmsis_dap_end_state(tap_state_t state
)
1169 if (tap_is_state_stable(state
))
1170 tap_set_end_state(state
);
1172 LOG_ERROR("BUG: %i is not a valid end state", state
);
1177 #ifdef SPRINT_BINARY
1178 static void sprint_binary(char *s
, const uint8_t *buf
, int offset
, int len
)
1184 buf = { 0x18 } len=5 should result in: 11000
1185 buf = { 0xff 0x18 } len=13 should result in: 11111111 11000
1186 buf = { 0xc0 0x18 } offset=3 len=10 should result in: 11000 11000
1187 i=3 there means i/8 = 0 so c = 0xFF, and
1189 for (int i
= offset
; i
< offset
+ len
; ++i
) {
1190 uint8_t c
= buf
[i
/ 8], mask
= 1 << (i
% 8);
1191 if ((i
!= offset
) && !(i
% 8))
1193 *s
++ = (c
& mask
) ? '1' : '0';
1199 #ifdef CMSIS_DAP_JTAG_DEBUG
1200 static void debug_parse_cmsis_buf(const uint8_t *cmd
, int cmdlen
)
1202 /* cmd is a usb packet to go to the cmsis-dap interface */
1203 printf("cmsis-dap buffer (%d b): ", cmdlen
);
1204 for (int i
= 0; i
< cmdlen
; ++i
)
1205 printf(" %02x", cmd
[i
]);
1208 case CMD_DAP_JTAG_SEQ
: {
1209 printf("cmsis-dap jtag sequence command %02x (n=%d)\n", cmd
[1], cmd
[2]);
1211 * #2 = number of sequences
1212 * #3 = sequence info 1
1213 * #4...4+n_bytes-1 = sequence 1
1214 * #4+n_bytes = sequence info 2
1215 * #5+n_bytes = sequence 2 (single bit)
1218 for (int seq
= 0; seq
< cmd
[2]; ++seq
) {
1219 uint8_t info
= cmd
[pos
++];
1220 int len
= info
& DAP_JTAG_SEQ_TCK
;
1223 printf(" sequence %d starting %d: info %02x (len=%d tms=%d read_tdo=%d): ",
1224 seq
, pos
, info
, len
, info
& DAP_JTAG_SEQ_TMS
, info
& DAP_JTAG_SEQ_TDO
);
1225 for (int i
= 0; i
< DIV_ROUND_UP(len
, 8); ++i
)
1226 printf(" %02x", cmd
[pos
+i
]);
1227 pos
+= DIV_ROUND_UP(len
, 8);
1230 if (pos
!= cmdlen
) {
1231 printf("BUFFER LENGTH MISMATCH looks like %d but %d specified", pos
, cmdlen
);
1238 LOG_DEBUG("unknown cmsis-dap command %02x", cmd
[1]);
1244 static void cmsis_dap_flush(void)
1246 if (!queued_seq_count
)
1249 DEBUG_JTAG_IO("Flushing %d queued sequences (%d bytes) with %d pending scan results to capture",
1250 queued_seq_count
, queued_seq_buf_end
, pending_scan_result_count
);
1252 /* prep CMSIS-DAP packet */
1253 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
1254 buffer
[0] = 0; /* report number */
1255 buffer
[1] = CMD_DAP_JTAG_SEQ
;
1256 buffer
[2] = queued_seq_count
;
1257 memcpy(buffer
+ 3, queued_seq_buf
, queued_seq_buf_end
);
1259 #ifdef CMSIS_DAP_JTAG_DEBUG
1260 debug_parse_cmsis_buf(buffer
, queued_seq_buf_end
+ 3);
1263 /* send command to USB device */
1264 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, queued_seq_buf_end
+ 3);
1265 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
1266 LOG_ERROR("CMSIS-DAP command CMD_DAP_JTAG_SEQ failed.");
1270 #ifdef CMSIS_DAP_JTAG_DEBUG
1271 DEBUG_JTAG_IO("USB response buf:");
1272 for (int c
= 0; c
< queued_seq_buf_end
+ 3; ++c
)
1273 printf("%02X ", buffer
[c
]);
1277 /* copy scan results into client buffers */
1278 for (int i
= 0; i
< pending_scan_result_count
; ++i
) {
1279 struct pending_scan_result
*scan
= &pending_scan_results
[i
];
1280 DEBUG_JTAG_IO("Copying pending_scan_result %d/%d: %d bits from byte %d -> buffer + %d bits",
1281 i
, pending_scan_result_count
, scan
->length
, scan
->first
+ 2, scan
->buffer_offset
);
1282 #ifdef CMSIS_DAP_JTAG_DEBUG
1283 for (uint32_t b
= 0; b
< DIV_ROUND_UP(scan
->length
, 8); ++b
)
1284 printf("%02X ", buffer
[2+scan
->first
+b
]);
1287 bit_copy(scan
->buffer
, scan
->buffer_offset
, buffer
+ 2 + scan
->first
, 0, scan
->length
);
1291 queued_seq_count
= 0;
1292 queued_seq_buf_end
= 0;
1293 queued_seq_tdo_ptr
= 0;
1294 pending_scan_result_count
= 0;
1297 /* queue a sequence of bits to clock out TDI / in TDO, executing if the buffer is full.
1299 * sequence=NULL means clock out zeros on TDI
1300 * tdo_buffer=NULL means don't capture TDO
1302 static void cmsis_dap_add_jtag_sequence(int s_len
, const uint8_t *sequence
, int s_offset
,
1303 bool tms
, uint8_t *tdo_buffer
, int tdo_buffer_offset
)
1305 DEBUG_JTAG_IO("[at %d] %d bits, tms %s, seq offset %d, tdo buf %p, tdo offset %d",
1307 s_len
, tms
? "HIGH" : "LOW", s_offset
, tdo_buffer
, tdo_buffer_offset
);
1313 DEBUG_JTAG_IO("START JTAG SEQ SPLIT");
1314 for (int offset
= 0; offset
< s_len
; offset
+= 64) {
1315 int len
= s_len
- offset
;
1318 DEBUG_JTAG_IO("Splitting long jtag sequence: %d-bit chunk starting at offset %d", len
, offset
);
1319 cmsis_dap_add_jtag_sequence(
1325 tdo_buffer
== NULL
? 0 : (tdo_buffer_offset
+ offset
)
1328 DEBUG_JTAG_IO("END JTAG SEQ SPLIT");
1332 int cmd_len
= 1 + DIV_ROUND_UP(s_len
, 8);
1333 if (queued_seq_count
>= 255 || queued_seq_buf_end
+ cmd_len
> QUEUED_SEQ_BUF_LEN
)
1334 /* empty out the buffer */
1340 queued_seq_buf
[queued_seq_buf_end
] =
1341 (tms
? DAP_JTAG_SEQ_TMS
: 0) |
1342 (tdo_buffer
!= NULL
? DAP_JTAG_SEQ_TDO
: 0) |
1343 (s_len
== 64 ? 0 : s_len
);
1345 if (sequence
!= NULL
)
1346 bit_copy(&queued_seq_buf
[queued_seq_buf_end
+ 1], 0, sequence
, s_offset
, s_len
);
1348 memset(&queued_seq_buf
[queued_seq_buf_end
+ 1], 0, DIV_ROUND_UP(s_len
, 8));
1350 queued_seq_buf_end
+= cmd_len
;
1352 if (tdo_buffer
!= NULL
) {
1353 struct pending_scan_result
*scan
= &pending_scan_results
[pending_scan_result_count
++];
1354 scan
->first
= queued_seq_tdo_ptr
;
1355 queued_seq_tdo_ptr
+= DIV_ROUND_UP(s_len
, 8);
1356 scan
->length
= s_len
;
1357 scan
->buffer
= tdo_buffer
;
1358 scan
->buffer_offset
= tdo_buffer_offset
;
1362 /* queue a sequence of bits to clock out TMS, executing if the buffer is full */
1363 static void cmsis_dap_add_tms_sequence(const uint8_t *sequence
, int s_len
)
1365 DEBUG_JTAG_IO("%d bits: %02X", s_len
, *sequence
);
1366 /* we use a series of CMD_DAP_JTAG_SEQ commands to toggle TMS,
1367 because even though it seems ridiculously inefficient, it
1368 allows us to combine TMS and scan sequences into the same
1370 /* TODO: combine runs of the same tms value */
1371 for (int i
= 0; i
< s_len
; ++i
) {
1372 bool bit
= (sequence
[i
/ 8] & (1 << (i
% 8))) != 0;
1373 cmsis_dap_add_jtag_sequence(1, NULL
, 0, bit
, NULL
, 0);
1377 /* Move to the end state by queuing a sequence to clock into TMS */
1378 static void cmsis_dap_state_move(void)
1381 uint8_t tms_scan_bits
;
1383 tms_scan
= tap_get_tms_path(tap_get_state(), tap_get_end_state());
1384 tms_scan_bits
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1386 DEBUG_JTAG_IO("state move from %s to %s: %d clocks, %02X on tms",
1387 tap_state_name(tap_get_state()), tap_state_name(tap_get_end_state()),
1388 tms_scan_bits
, tms_scan
);
1389 cmsis_dap_add_tms_sequence(&tms_scan
, tms_scan_bits
);
1391 tap_set_state(tap_get_end_state());
1395 /* Execute a JTAG scan operation by queueing TMS and TDI/TDO sequences */
1396 static void cmsis_dap_execute_scan(struct jtag_command
*cmd
)
1398 DEBUG_JTAG_IO("%s type:%d", cmd
->cmd
.scan
->ir_scan
? "IRSCAN" : "DRSCAN",
1399 jtag_scan_type(cmd
->cmd
.scan
));
1401 /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
1402 while (cmd
->cmd
.scan
->num_fields
> 0
1403 && cmd
->cmd
.scan
->fields
[cmd
->cmd
.scan
->num_fields
- 1].num_bits
== 0) {
1404 cmd
->cmd
.scan
->num_fields
--;
1405 LOG_DEBUG("discarding trailing empty field");
1408 if (cmd
->cmd
.scan
->num_fields
== 0) {
1409 LOG_DEBUG("empty scan, doing nothing");
1413 if (cmd
->cmd
.scan
->ir_scan
) {
1414 if (tap_get_state() != TAP_IRSHIFT
) {
1415 cmsis_dap_end_state(TAP_IRSHIFT
);
1416 cmsis_dap_state_move();
1419 if (tap_get_state() != TAP_DRSHIFT
) {
1420 cmsis_dap_end_state(TAP_DRSHIFT
);
1421 cmsis_dap_state_move();
1425 cmsis_dap_end_state(cmd
->cmd
.scan
->end_state
);
1427 struct scan_field
*field
= cmd
->cmd
.scan
->fields
;
1428 unsigned scan_size
= 0;
1430 for (int i
= 0; i
< cmd
->cmd
.scan
->num_fields
; i
++, field
++) {
1431 scan_size
+= field
->num_bits
;
1432 DEBUG_JTAG_IO("%s%s field %d/%d %d bits",
1433 field
->in_value
? "in" : "",
1434 field
->out_value
? "out" : "",
1436 cmd
->cmd
.scan
->num_fields
,
1439 if (i
== cmd
->cmd
.scan
->num_fields
- 1 && tap_get_state() != tap_get_end_state()) {
1440 DEBUG_JTAG_IO("Last field and have to move out of SHIFT state");
1441 /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
1442 * movement. This last field can't have length zero, it was checked above. */
1443 cmsis_dap_add_jtag_sequence(
1444 field
->num_bits
- 1, /* number of bits to clock */
1445 field
->out_value
, /* output sequence */
1446 0, /* output offset */
1447 false, /* TMS low */
1451 /* Clock the last bit out, with TMS high */
1452 uint8_t last_bit
= 0;
1453 if (field
->out_value
)
1454 bit_copy(&last_bit
, 0, field
->out_value
, field
->num_bits
- 1, 1);
1455 cmsis_dap_add_jtag_sequence(
1461 field
->num_bits
- 1);
1462 tap_set_state(tap_state_transition(tap_get_state(), 1));
1464 /* Now clock one more cycle, with TMS low, to get us into a PAUSE state */
1465 cmsis_dap_add_jtag_sequence(
1472 tap_set_state(tap_state_transition(tap_get_state(), 0));
1474 DEBUG_JTAG_IO("Internal field, staying in SHIFT state afterwards");
1475 /* Clocking part of a sequence into DR or IR with TMS=0,
1476 leaving TMS=0 at the end so we can continue later */
1477 cmsis_dap_add_jtag_sequence(
1487 if (tap_get_state() != tap_get_end_state()) {
1488 cmsis_dap_end_state(tap_get_end_state());
1489 cmsis_dap_state_move();
1492 DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
1493 (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", scan_size
,
1494 tap_state_name(tap_get_end_state()));
1497 static void cmsis_dap_pathmove(int num_states
, tap_state_t
*path
)
1500 uint8_t tms0
= 0x00;
1501 uint8_t tms1
= 0xff;
1503 for (i
= 0; i
< num_states
; i
++) {
1504 if (path
[i
] == tap_state_transition(tap_get_state(), false))
1505 cmsis_dap_add_tms_sequence(&tms0
, 1);
1506 else if (path
[i
] == tap_state_transition(tap_get_state(), true))
1507 cmsis_dap_add_tms_sequence(&tms1
, 1);
1509 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition.",
1510 tap_state_name(tap_get_state()), tap_state_name(path
[i
]));
1514 tap_set_state(path
[i
]);
1517 cmsis_dap_end_state(tap_get_state());
1520 static void cmsis_dap_execute_pathmove(struct jtag_command
*cmd
)
1522 DEBUG_JTAG_IO("pathmove: %i states, end in %i",
1523 cmd
->cmd
.pathmove
->num_states
,
1524 cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
1526 cmsis_dap_pathmove(cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
);
1529 static void cmsis_dap_stableclocks(int num_cycles
)
1533 uint8_t tms
= tap_get_state() == TAP_RESET
;
1534 /* TODO: Perform optimizations? */
1535 /* Execute num_cycles. */
1536 for (i
= 0; i
< num_cycles
; i
++)
1537 cmsis_dap_add_tms_sequence(&tms
, 1);
1540 static void cmsis_dap_runtest(int num_cycles
)
1542 tap_state_t saved_end_state
= tap_get_end_state();
1544 /* Only do a state_move when we're not already in IDLE. */
1545 if (tap_get_state() != TAP_IDLE
) {
1546 cmsis_dap_end_state(TAP_IDLE
);
1547 cmsis_dap_state_move();
1549 cmsis_dap_stableclocks(num_cycles
);
1551 /* Finish in end_state. */
1552 cmsis_dap_end_state(saved_end_state
);
1554 if (tap_get_state() != tap_get_end_state())
1555 cmsis_dap_state_move();
1558 static void cmsis_dap_execute_runtest(struct jtag_command
*cmd
)
1560 DEBUG_JTAG_IO("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
,
1561 cmd
->cmd
.runtest
->end_state
);
1563 cmsis_dap_end_state(cmd
->cmd
.runtest
->end_state
);
1564 cmsis_dap_runtest(cmd
->cmd
.runtest
->num_cycles
);
1567 static void cmsis_dap_execute_stableclocks(struct jtag_command
*cmd
)
1569 DEBUG_JTAG_IO("stableclocks %i cycles", cmd
->cmd
.runtest
->num_cycles
);
1570 cmsis_dap_stableclocks(cmd
->cmd
.runtest
->num_cycles
);
1573 static void cmsis_dap_execute_tms(struct jtag_command
*cmd
)
1575 DEBUG_JTAG_IO("TMS: %d bits", cmd
->cmd
.tms
->num_bits
);
1576 cmsis_dap_cmd_DAP_SWJ_Sequence(cmd
->cmd
.tms
->num_bits
, cmd
->cmd
.tms
->bits
);
1579 /* TODO: Is there need to call cmsis_dap_flush() for the JTAG_PATHMOVE,
1580 * JTAG_RUNTEST, JTAG_STABLECLOCKS? */
1581 static void cmsis_dap_execute_command(struct jtag_command
*cmd
)
1583 switch (cmd
->type
) {
1586 cmsis_dap_execute_reset(cmd
);
1590 cmsis_dap_execute_sleep(cmd
);
1592 case JTAG_TLR_RESET
:
1594 cmsis_dap_execute_tlr_reset(cmd
);
1597 cmsis_dap_execute_scan(cmd
);
1600 cmsis_dap_execute_pathmove(cmd
);
1603 cmsis_dap_execute_runtest(cmd
);
1605 case JTAG_STABLECLOCKS
:
1606 cmsis_dap_execute_stableclocks(cmd
);
1609 cmsis_dap_execute_tms(cmd
);
1612 LOG_ERROR("BUG: unknown JTAG command type 0x%X encountered", cmd
->type
);
1617 static int cmsis_dap_execute_queue(void)
1619 struct jtag_command
*cmd
= jtag_command_queue
;
1621 while (cmd
!= NULL
) {
1622 cmsis_dap_execute_command(cmd
);
1631 static int cmsis_dap_speed(int speed
)
1633 if (speed
> DAP_MAX_CLOCK
)
1634 LOG_INFO("High speed (adapter_khz %d) may be limited by adapter firmware.", speed
);
1637 LOG_ERROR("RTCK not supported. Set nonzero adapter_khz.");
1638 return ERROR_JTAG_NOT_IMPLEMENTED
;
1641 return cmsis_dap_cmd_DAP_SWJ_Clock(speed
);
1644 static int cmsis_dap_speed_div(int speed
, int *khz
)
1650 static int cmsis_dap_khz(int khz
, int *jtag_speed
)
1656 static int_least32_t cmsis_dap_swd_frequency(int_least32_t hz
)
1659 cmsis_dap_speed(hz
/ 1000);
1665 COMMAND_HANDLER(cmsis_dap_handle_info_command
)
1667 if (cmsis_dap_get_version_info() == ERROR_OK
)
1668 cmsis_dap_get_status();
1673 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command
)
1675 if (CMD_ARGC
> MAX_USB_IDS
* 2) {
1676 LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
1677 "(maximum is %d pairs)", MAX_USB_IDS
);
1678 CMD_ARGC
= MAX_USB_IDS
* 2;
1680 if (CMD_ARGC
< 2 || (CMD_ARGC
& 1)) {
1681 LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
1683 return ERROR_COMMAND_SYNTAX_ERROR
;
1684 /* remove the incomplete trailing id */
1689 for (i
= 0; i
< CMD_ARGC
; i
+= 2) {
1690 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
], cmsis_dap_vid
[i
>> 1]);
1691 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
+ 1], cmsis_dap_pid
[i
>> 1]);
1695 * Explicitly terminate, in case there are multiples instances of
1696 * cmsis_dap_vid_pid.
1698 cmsis_dap_vid
[i
>> 1] = cmsis_dap_pid
[i
>> 1] = 0;
1703 COMMAND_HANDLER(cmsis_dap_handle_serial_command
)
1705 if (CMD_ARGC
== 1) {
1706 size_t len
= mbstowcs(NULL
, CMD_ARGV
[0], 0);
1707 cmsis_dap_serial
= calloc(len
+ 1, sizeof(wchar_t));
1708 if (cmsis_dap_serial
== NULL
) {
1709 LOG_ERROR("unable to allocate memory");
1712 if (mbstowcs(cmsis_dap_serial
, CMD_ARGV
[0], len
+ 1) == (size_t)-1) {
1713 free(cmsis_dap_serial
);
1714 cmsis_dap_serial
= NULL
;
1715 LOG_ERROR("unable to convert serial");
1718 LOG_ERROR("expected exactly one argument to cmsis_dap_serial <serial-number>");
1724 static const struct command_registration cmsis_dap_subcommand_handlers
[] = {
1727 .handler
= &cmsis_dap_handle_info_command
,
1728 .mode
= COMMAND_EXEC
,
1730 .help
= "show cmsis-dap info",
1732 COMMAND_REGISTRATION_DONE
1735 static const struct command_registration cmsis_dap_command_handlers
[] = {
1737 .name
= "cmsis-dap",
1738 .mode
= COMMAND_ANY
,
1739 .help
= "perform CMSIS-DAP management",
1741 .chain
= cmsis_dap_subcommand_handlers
,
1744 .name
= "cmsis_dap_vid_pid",
1745 .handler
= &cmsis_dap_handle_vid_pid_command
,
1746 .mode
= COMMAND_CONFIG
,
1747 .help
= "the vendor ID and product ID of the CMSIS-DAP device",
1748 .usage
= "(vid pid)* ",
1751 .name
= "cmsis_dap_serial",
1752 .handler
= &cmsis_dap_handle_serial_command
,
1753 .mode
= COMMAND_CONFIG
,
1754 .help
= "set the serial number of the adapter",
1755 .usage
= "serial_string",
1757 COMMAND_REGISTRATION_DONE
1760 static const struct swd_driver cmsis_dap_swd_driver
= {
1761 .init
= cmsis_dap_swd_init
,
1762 .frequency
= cmsis_dap_swd_frequency
,
1763 .switch_seq
= cmsis_dap_swd_switch_seq
,
1764 .read_reg
= cmsis_dap_swd_read_reg
,
1765 .write_reg
= cmsis_dap_swd_write_reg
,
1766 .run
= cmsis_dap_swd_run_queue
,
1769 static const char * const cmsis_dap_transport
[] = { "swd", "jtag", NULL
};
1771 struct jtag_interface cmsis_dap_interface
= {
1772 .name
= "cmsis-dap",
1773 .supported
= DEBUG_CAP_TMS_SEQ
,
1774 .commands
= cmsis_dap_command_handlers
,
1775 .swd
= &cmsis_dap_swd_driver
,
1776 .transports
= cmsis_dap_transport
,
1778 .execute_queue
= cmsis_dap_execute_queue
,
1779 .speed
= cmsis_dap_speed
,
1780 .speed_div
= cmsis_dap_speed_div
,
1781 .khz
= cmsis_dap_khz
,
1782 .init
= cmsis_dap_init
,
1783 .quit
= cmsis_dap_quit
,