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
;
169 uint16_t packet_count
;
170 uint8_t *packet_buffer
;
175 struct pending_transfer_result
{
181 struct pending_scan_result
{
182 /** Offset in bytes in the CMD_DAP_JTAG_SEQ response buffer. */
184 /** Number of bits to read. */
186 /** Location to store the result */
188 /** Offset in the destination buffer */
189 unsigned buffer_offset
;
192 static int pending_transfer_count
, pending_queue_len
;
193 static struct pending_transfer_result
*pending_transfers
;
195 /* pointers to buffers that will receive jtag scan results on the next flush */
196 #define MAX_PENDING_SCAN_RESULTS 256
197 static int pending_scan_result_count
;
198 static struct pending_scan_result pending_scan_results
[MAX_PENDING_SCAN_RESULTS
];
200 /* queued JTAG sequences that will be executed on the next flush */
201 #define QUEUED_SEQ_BUF_LEN (cmsis_dap_handle->packet_size - 3)
202 static int queued_seq_count
;
203 static int queued_seq_buf_end
;
204 static int queued_seq_tdo_ptr
;
205 static uint8_t queued_seq_buf
[1024]; /* TODO: make dynamic / move into cmsis object */
207 static int queued_retval
;
209 static uint8_t output_pins
= SWJ_PIN_SRST
| SWJ_PIN_TRST
;
211 static struct cmsis_dap
*cmsis_dap_handle
;
213 static int cmsis_dap_usb_open(void)
215 hid_device
*dev
= NULL
;
217 struct hid_device_info
*devs
, *cur_dev
;
218 unsigned short target_vid
, target_pid
;
219 wchar_t *target_serial
= NULL
;
222 bool serial_found
= false;
228 * The CMSIS-DAP specification stipulates:
229 * "The Product String must contain "CMSIS-DAP" somewhere in the string. This is used by the
230 * debuggers to identify a CMSIS-DAP compliant Debug Unit that is connected to a host computer."
232 devs
= hid_enumerate(0x0, 0x0);
234 while (NULL
!= cur_dev
) {
235 if (0 == cmsis_dap_vid
[0]) {
236 if (NULL
== cur_dev
->product_string
) {
237 LOG_DEBUG("Cannot read product string of device 0x%x:0x%x",
238 cur_dev
->vendor_id
, cur_dev
->product_id
);
240 if (wcsstr(cur_dev
->product_string
, L
"CMSIS-DAP")) {
241 /* if the user hasn't specified VID:PID *and*
242 * product string contains "CMSIS-DAP", pick it
248 /* otherwise, exhaustively compare against all VID:PID in list */
249 for (i
= 0; cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
]; i
++) {
250 if ((cmsis_dap_vid
[i
] == cur_dev
->vendor_id
) && (cmsis_dap_pid
[i
] == cur_dev
->product_id
))
254 if (cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
])
259 /* we have found an adapter, so exit further checks */
260 /* check serial number matches if given */
261 if (cmsis_dap_serial
!= NULL
) {
262 if ((cur_dev
->serial_number
!= NULL
) && wcscmp(cmsis_dap_serial
, cur_dev
->serial_number
) == 0) {
272 cur_dev
= cur_dev
->next
;
275 if (NULL
!= cur_dev
) {
276 target_vid
= cur_dev
->vendor_id
;
277 target_pid
= cur_dev
->product_id
;
279 target_serial
= cmsis_dap_serial
;
282 hid_free_enumeration(devs
);
284 if (target_vid
== 0 && target_pid
== 0) {
285 LOG_ERROR("unable to find CMSIS-DAP device");
289 if (hid_init() != 0) {
290 LOG_ERROR("unable to open HIDAPI");
294 dev
= hid_open(target_vid
, target_pid
, target_serial
);
297 LOG_ERROR("unable to open CMSIS-DAP device 0x%x:0x%x", target_vid
, target_pid
);
301 struct cmsis_dap
*dap
= malloc(sizeof(struct cmsis_dap
));
303 LOG_ERROR("unable to allocate memory");
307 dap
->dev_handle
= dev
;
311 cmsis_dap_handle
= dap
;
313 /* allocate default packet buffer, may be changed later.
314 * currently with HIDAPI we have no way of getting the output report length
315 * without this info we cannot communicate with the adapter.
316 * For the moment we ahve to hard code the packet size */
318 int packet_size
= PACKET_SIZE
;
320 /* atmel cmsis-dap uses 512 byte reports */
321 /* except when it doesn't e.g. with mEDBG on SAMD10 Xplained
323 /* TODO: HID report descriptor should be parsed instead of
324 * hardcoding a match by VID */
325 if (target_vid
== 0x03eb && target_pid
!= 0x2145)
326 packet_size
= 512 + 1;
328 cmsis_dap_handle
->packet_buffer
= malloc(packet_size
);
329 cmsis_dap_handle
->packet_size
= packet_size
;
331 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
332 LOG_ERROR("unable to allocate memory");
339 static void cmsis_dap_usb_close(struct cmsis_dap
*dap
)
341 hid_close(dap
->dev_handle
);
344 free(cmsis_dap_handle
->packet_buffer
);
345 free(cmsis_dap_handle
);
346 cmsis_dap_handle
= NULL
;
347 free(cmsis_dap_serial
);
348 cmsis_dap_serial
= NULL
;
349 free(pending_transfers
);
350 pending_transfers
= NULL
;
355 /* Send a message and receive the reply */
356 static int cmsis_dap_usb_xfer(struct cmsis_dap
*dap
, int txlen
)
358 #ifdef CMSIS_DAP_JTAG_DEBUG
359 LOG_DEBUG("cmsis-dap usb xfer cmd=%02X", dap
->packet_buffer
[1]);
361 /* Pad the rest of the TX buffer with 0's */
362 memset(dap
->packet_buffer
+ txlen
, 0, dap
->packet_size
- txlen
);
364 /* write data to device */
365 int retval
= hid_write(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
);
367 LOG_ERROR("error writing data: %ls", hid_error(dap
->dev_handle
));
372 retval
= hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, USB_TIMEOUT
);
373 if (retval
== -1 || retval
== 0) {
374 LOG_DEBUG("error reading data: %ls", hid_error(dap
->dev_handle
));
381 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins
, uint8_t mask
, uint32_t delay
, uint8_t *input
)
384 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
386 buffer
[0] = 0; /* report number */
387 buffer
[1] = CMD_DAP_SWJ_PINS
;
390 buffer
[4] = delay
& 0xff;
391 buffer
[5] = (delay
>> 8) & 0xff;
392 buffer
[6] = (delay
>> 16) & 0xff;
393 buffer
[7] = (delay
>> 24) & 0xff;
394 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 8);
396 if (retval
!= ERROR_OK
) {
397 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
398 return ERROR_JTAG_DEVICE_ERROR
;
407 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock
)
410 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
412 /* set clock in Hz */
414 buffer
[0] = 0; /* report number */
415 buffer
[1] = CMD_DAP_SWJ_CLOCK
;
416 buffer
[2] = swj_clock
& 0xff;
417 buffer
[3] = (swj_clock
>> 8) & 0xff;
418 buffer
[4] = (swj_clock
>> 16) & 0xff;
419 buffer
[5] = (swj_clock
>> 24) & 0xff;
420 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 6);
422 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
423 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
424 return ERROR_JTAG_DEVICE_ERROR
;
430 /* clock a sequence of bits out on TMS, to change JTAG states */
431 static int cmsis_dap_cmd_DAP_SWJ_Sequence(uint8_t s_len
, const uint8_t *sequence
)
434 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
436 #ifdef CMSIS_DAP_JTAG_DEBUG
437 LOG_DEBUG("cmsis-dap TMS sequence: len=%d", s_len
);
438 for (int i
= 0; i
< DIV_ROUND_UP(s_len
, 8); ++i
)
439 printf("%02X ", sequence
[i
]);
444 buffer
[0] = 0; /* report number */
445 buffer
[1] = CMD_DAP_SWJ_SEQ
;
447 bit_copy(&buffer
[3], 0, sequence
, 0, s_len
);
449 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, DIV_ROUND_UP(s_len
, 8) + 3);
451 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
457 static int cmsis_dap_cmd_DAP_Info(uint8_t info
, uint8_t **data
)
460 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
462 buffer
[0] = 0; /* report number */
463 buffer
[1] = CMD_DAP_INFO
;
465 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
467 if (retval
!= ERROR_OK
) {
468 LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
469 return ERROR_JTAG_DEVICE_ERROR
;
472 *data
= &(buffer
[1]);
477 static int cmsis_dap_cmd_DAP_LED(uint8_t leds
)
480 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
482 buffer
[0] = 0; /* report number */
483 buffer
[1] = CMD_DAP_LED
;
486 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
488 if (retval
!= ERROR_OK
|| buffer
[1] != 0x00) {
489 LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
490 return ERROR_JTAG_DEVICE_ERROR
;
496 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode
)
499 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
501 buffer
[0] = 0; /* report number */
502 buffer
[1] = CMD_DAP_CONNECT
;
504 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
506 if (retval
!= ERROR_OK
) {
507 LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
508 return ERROR_JTAG_DEVICE_ERROR
;
511 if (buffer
[1] != mode
) {
512 LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode
);
513 return ERROR_JTAG_DEVICE_ERROR
;
519 static int cmsis_dap_cmd_DAP_Disconnect(void)
522 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
524 buffer
[0] = 0; /* report number */
525 buffer
[1] = CMD_DAP_DISCONNECT
;
526 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
528 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
529 LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
530 return ERROR_JTAG_DEVICE_ERROR
;
536 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle
, uint16_t retry_count
, uint16_t match_retry
)
539 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
541 buffer
[0] = 0; /* report number */
542 buffer
[1] = CMD_DAP_TFER_CONFIGURE
;
544 buffer
[3] = retry_count
& 0xff;
545 buffer
[4] = (retry_count
>> 8) & 0xff;
546 buffer
[5] = match_retry
& 0xff;
547 buffer
[6] = (match_retry
>> 8) & 0xff;
548 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
550 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
551 LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
552 return ERROR_JTAG_DEVICE_ERROR
;
558 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg
)
561 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
563 buffer
[0] = 0; /* report number */
564 buffer
[1] = CMD_DAP_SWD_CONFIGURE
;
566 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
568 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
569 LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
570 return ERROR_JTAG_DEVICE_ERROR
;
577 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us
)
580 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
582 buffer
[0] = 0; /* report number */
583 buffer
[1] = CMD_DAP_DELAY
;
584 buffer
[2] = delay_us
& 0xff;
585 buffer
[3] = (delay_us
>> 8) & 0xff;
586 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
588 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
589 LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
590 return ERROR_JTAG_DEVICE_ERROR
;
597 static int cmsis_dap_swd_run_queue(void)
599 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
601 LOG_DEBUG_IO("Executing %d queued transactions", pending_transfer_count
);
603 if (queued_retval
!= ERROR_OK
) {
604 LOG_DEBUG("Skipping due to previous errors: %d", queued_retval
);
608 if (!pending_transfer_count
)
612 buffer
[idx
++] = 0; /* report number */
613 buffer
[idx
++] = CMD_DAP_TFER
;
614 buffer
[idx
++] = 0x00; /* DAP Index */
615 buffer
[idx
++] = pending_transfer_count
;
617 for (int i
= 0; i
< pending_transfer_count
; i
++) {
618 uint8_t cmd
= pending_transfers
[i
].cmd
;
619 uint32_t data
= pending_transfers
[i
].data
;
621 LOG_DEBUG_IO("%s %s reg %x %"PRIx32
,
622 cmd
& SWD_CMD_APnDP
? "AP" : "DP",
623 cmd
& SWD_CMD_RnW
? "read" : "write",
624 (cmd
& SWD_CMD_A32
) >> 1, data
);
626 /* When proper WAIT handling is implemented in the
627 * common SWD framework, this kludge can be
628 * removed. However, this might lead to minor
629 * performance degradation as the adapter wouldn't be
630 * able to automatically retry anything (because ARM
631 * has forgotten to implement sticky error flags
632 * clearing). See also comments regarding
633 * cmsis_dap_cmd_DAP_TFER_Configure() and
634 * cmsis_dap_cmd_DAP_SWD_Configure() in
637 if (!(cmd
& SWD_CMD_RnW
) &&
638 !(cmd
& SWD_CMD_APnDP
) &&
639 (cmd
& SWD_CMD_A32
) >> 1 == DP_CTRL_STAT
&&
640 (data
& CORUNDETECT
)) {
641 LOG_DEBUG("refusing to enable sticky overrun detection");
642 data
&= ~CORUNDETECT
;
645 buffer
[idx
++] = (cmd
>> 1) & 0x0f;
646 if (!(cmd
& SWD_CMD_RnW
)) {
647 buffer
[idx
++] = (data
) & 0xff;
648 buffer
[idx
++] = (data
>> 8) & 0xff;
649 buffer
[idx
++] = (data
>> 16) & 0xff;
650 buffer
[idx
++] = (data
>> 24) & 0xff;
654 queued_retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, idx
);
655 if (queued_retval
!= ERROR_OK
)
659 uint8_t ack
= buffer
[idx
] & 0x07;
660 if (ack
!= SWD_ACK_OK
|| (buffer
[idx
] & 0x08)) {
661 LOG_DEBUG("SWD ack not OK: %d %s", buffer
[idx
-1],
662 ack
== SWD_ACK_WAIT
? "WAIT" : ack
== SWD_ACK_FAULT
? "FAULT" : "JUNK");
663 queued_retval
= ack
== SWD_ACK_WAIT
? ERROR_WAIT
: ERROR_FAIL
;
668 if (pending_transfer_count
!= buffer
[1])
669 LOG_ERROR("CMSIS-DAP transfer count mismatch: expected %d, got %d",
670 pending_transfer_count
, buffer
[1]);
672 for (int i
= 0; i
< buffer
[1]; i
++) {
673 if (pending_transfers
[i
].cmd
& SWD_CMD_RnW
) {
674 static uint32_t last_read
;
675 uint32_t data
= le_to_h_u32(&buffer
[idx
]);
679 LOG_DEBUG_IO("Read result: %"PRIx32
, data
);
681 /* Imitate posted AP reads */
682 if ((pending_transfers
[i
].cmd
& SWD_CMD_APnDP
) ||
683 ((pending_transfers
[i
].cmd
& SWD_CMD_A32
) >> 1 == DP_RDBUFF
)) {
688 if (pending_transfers
[i
].buffer
)
689 *(uint32_t *)pending_transfers
[i
].buffer
= tmp
;
694 pending_transfer_count
= 0;
695 int retval
= queued_retval
;
696 queued_retval
= ERROR_OK
;
701 static void cmsis_dap_swd_queue_cmd(uint8_t cmd
, uint32_t *dst
, uint32_t data
)
703 if (pending_transfer_count
== pending_queue_len
) {
704 /* Not enough room in the queue. Run the queue. */
705 queued_retval
= cmsis_dap_swd_run_queue();
708 if (queued_retval
!= ERROR_OK
)
711 pending_transfers
[pending_transfer_count
].data
= data
;
712 pending_transfers
[pending_transfer_count
].cmd
= cmd
;
713 if (cmd
& SWD_CMD_RnW
) {
714 /* Queue a read transaction */
715 pending_transfers
[pending_transfer_count
].buffer
= dst
;
717 pending_transfer_count
++;
720 static void cmsis_dap_swd_write_reg(uint8_t cmd
, uint32_t value
, uint32_t ap_delay_clk
)
722 assert(!(cmd
& SWD_CMD_RnW
));
723 cmsis_dap_swd_queue_cmd(cmd
, NULL
, value
);
726 static void cmsis_dap_swd_read_reg(uint8_t cmd
, uint32_t *value
, uint32_t ap_delay_clk
)
728 assert(cmd
& SWD_CMD_RnW
);
729 cmsis_dap_swd_queue_cmd(cmd
, value
, 0);
732 static int cmsis_dap_get_serial_info(void)
736 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_SERNUM
, &data
);
737 if (retval
!= ERROR_OK
)
740 if (data
[0]) /* strlen */
741 LOG_INFO("CMSIS-DAP: Serial# = %s", &data
[1]);
746 static int cmsis_dap_get_version_info(void)
750 /* INFO_ID_FW_VER - string */
751 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER
, &data
);
752 if (retval
!= ERROR_OK
)
755 if (data
[0]) /* strlen */
756 LOG_INFO("CMSIS-DAP: FW Version = %s", &data
[1]);
761 static int cmsis_dap_get_caps_info(void)
765 /* INFO_ID_CAPS - byte */
766 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS
, &data
);
767 if (retval
!= ERROR_OK
)
771 uint8_t caps
= data
[1];
773 cmsis_dap_handle
->caps
= caps
;
775 if (caps
& INFO_CAPS_SWD
)
776 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[0]);
777 if (caps
& INFO_CAPS_JTAG
)
778 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[1]);
784 static int cmsis_dap_get_status(void)
788 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d
);
790 if (retval
== ERROR_OK
) {
791 LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
792 (d
& SWJ_PIN_TCK
) ? 1 : 0,
793 (d
& SWJ_PIN_TMS
) ? 1 : 0,
794 (d
& SWJ_PIN_TDI
) ? 1 : 0,
795 (d
& SWJ_PIN_TDO
) ? 1 : 0,
796 (d
& SWJ_PIN_TRST
) ? 1 : 0,
797 (d
& SWJ_PIN_SRST
) ? 1 : 0);
803 static int cmsis_dap_swd_switch_seq(enum swd_special_seq seq
)
809 if ((output_pins
& (SWJ_PIN_SRST
| SWJ_PIN_TRST
)) == (SWJ_PIN_SRST
| SWJ_PIN_TRST
)) {
810 /* Following workaround deasserts reset on most adapters.
811 * Do not reconnect if a reset line is active!
812 * Reconnecting would break connecting under reset. */
814 /* First disconnect before connecting, Atmel EDBG needs it for SAMD/R/L/C */
815 cmsis_dap_cmd_DAP_Disconnect();
817 /* When we are reconnecting, DAP_Connect needs to be rerun, at
818 * least on Keil ULINK-ME */
819 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
820 if (retval
!= ERROR_OK
)
826 LOG_DEBUG("SWD line reset");
827 s
= swd_seq_line_reset
;
828 s_len
= swd_seq_line_reset_len
;
831 LOG_DEBUG("JTAG-to-SWD");
832 s
= swd_seq_jtag_to_swd
;
833 s_len
= swd_seq_jtag_to_swd_len
;
836 LOG_DEBUG("SWD-to-JTAG");
837 s
= swd_seq_swd_to_jtag
;
838 s_len
= swd_seq_swd_to_jtag_len
;
841 LOG_ERROR("Sequence %d not supported", seq
);
845 retval
= cmsis_dap_cmd_DAP_SWJ_Sequence(s_len
, s
);
846 if (retval
!= ERROR_OK
)
849 /* Atmel EDBG needs renew clock setting after SWJ_Sequence
850 * otherwise default frequency is used */
851 return cmsis_dap_cmd_DAP_SWJ_Clock(jtag_get_speed_khz());
854 static int cmsis_dap_swd_open(void)
858 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_SWD
)) {
859 LOG_ERROR("CMSIS-DAP: SWD not supported");
860 return ERROR_JTAG_DEVICE_ERROR
;
863 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
864 if (retval
!= ERROR_OK
)
867 /* Add more setup here.??... */
869 LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
873 static int cmsis_dap_init(void)
878 retval
= cmsis_dap_usb_open();
879 if (retval
!= ERROR_OK
)
882 retval
= cmsis_dap_get_caps_info();
883 if (retval
!= ERROR_OK
)
886 retval
= cmsis_dap_get_version_info();
887 if (retval
!= ERROR_OK
)
890 retval
= cmsis_dap_get_serial_info();
891 if (retval
!= ERROR_OK
)
895 retval
= cmsis_dap_swd_open();
896 if (retval
!= ERROR_OK
)
899 /* Connect in JTAG mode */
900 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_JTAG
)) {
901 LOG_ERROR("CMSIS-DAP: JTAG not supported");
902 return ERROR_JTAG_DEVICE_ERROR
;
905 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_JTAG
);
906 if (retval
!= ERROR_OK
)
909 LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
912 /* INFO_ID_PKT_SZ - short */
913 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ
, &data
);
914 if (retval
!= ERROR_OK
)
917 if (data
[0] == 2) { /* short */
918 uint16_t pkt_sz
= data
[1] + (data
[2] << 8);
920 /* 4 bytes of command header + 5 bytes per register
921 * write. For bulk read sequences just 4 bytes are
922 * needed per transfer, so this is suboptimal. */
923 pending_queue_len
= (pkt_sz
- 4) / 5;
924 pending_transfers
= malloc(pending_queue_len
* sizeof(*pending_transfers
));
925 if (!pending_transfers
) {
926 LOG_ERROR("Unable to allocate memory for CMSIS-DAP queue");
930 if (cmsis_dap_handle
->packet_size
!= pkt_sz
+ 1) {
931 /* reallocate buffer */
932 cmsis_dap_handle
->packet_size
= pkt_sz
+ 1;
933 cmsis_dap_handle
->packet_buffer
= realloc(cmsis_dap_handle
->packet_buffer
,
934 cmsis_dap_handle
->packet_size
);
935 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
936 LOG_ERROR("unable to reallocate memory");
941 LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16
, pkt_sz
);
944 /* INFO_ID_PKT_CNT - byte */
945 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT
, &data
);
946 if (retval
!= ERROR_OK
)
949 if (data
[0] == 1) { /* byte */
950 uint16_t pkt_cnt
= data
[1];
951 cmsis_dap_handle
->packet_count
= pkt_cnt
;
952 LOG_DEBUG("CMSIS-DAP: Packet Count = %" PRId16
, pkt_cnt
);
955 retval
= cmsis_dap_get_status();
956 if (retval
!= ERROR_OK
)
959 /* Now try to connect to the target
960 * TODO: This is all SWD only @ present */
961 retval
= cmsis_dap_cmd_DAP_SWJ_Clock(jtag_get_speed_khz());
962 if (retval
!= ERROR_OK
)
965 /* Ask CMSIS-DAP to automatically retry on receiving WAIT for
966 * up to 64 times. This must be changed to 0 if sticky
967 * overrun detection is enabled. */
968 retval
= cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
969 if (retval
!= ERROR_OK
)
973 /* Data Phase (bit 2) must be set to 1 if sticky overrun
974 * detection is enabled */
975 retval
= cmsis_dap_cmd_DAP_SWD_Configure(0); /* 1 TRN, no Data Phase */
976 if (retval
!= ERROR_OK
)
980 retval
= cmsis_dap_cmd_DAP_LED(0x03); /* Both LEDs on */
981 if (retval
!= ERROR_OK
)
984 /* support connecting with srst asserted */
985 enum reset_types jtag_reset_config
= jtag_get_reset_config();
987 if (jtag_reset_config
& RESET_CNCT_UNDER_SRST
) {
988 if (jtag_reset_config
& RESET_SRST_NO_GATING
) {
989 retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL
);
990 if (retval
!= ERROR_OK
)
992 LOG_INFO("Connecting under reset");
996 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
998 LOG_INFO("CMSIS-DAP: Interface ready");
1003 static int cmsis_dap_swd_init(void)
1009 static int cmsis_dap_quit(void)
1011 cmsis_dap_cmd_DAP_Disconnect();
1012 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
1014 cmsis_dap_usb_close(cmsis_dap_handle
);
1019 static void cmsis_dap_execute_reset(struct jtag_command
*cmd
)
1021 /* Set both TRST and SRST even if they're not enabled as
1022 * there's no way to tristate them */
1025 if (!cmd
->cmd
.reset
->srst
)
1026 output_pins
|= SWJ_PIN_SRST
;
1027 if (!cmd
->cmd
.reset
->trst
)
1028 output_pins
|= SWJ_PIN_TRST
;
1030 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(output_pins
,
1031 SWJ_PIN_TRST
| SWJ_PIN_SRST
, 0, NULL
);
1032 if (retval
!= ERROR_OK
)
1033 LOG_ERROR("CMSIS-DAP: Interface reset failed");
1036 static void cmsis_dap_execute_sleep(struct jtag_command
*cmd
)
1039 int retval
= cmsis_dap_cmd_DAP_Delay(cmd
->cmd
.sleep
->us
);
1040 if (retval
!= ERROR_OK
)
1042 jtag_sleep(cmd
->cmd
.sleep
->us
);
1045 /* Set TMS high for five TCK clocks, to move the TAP to the Test-Logic-Reset state */
1046 static int cmsis_dap_execute_tlr_reset(struct jtag_command
*cmd
)
1048 LOG_INFO("cmsis-dap JTAG TLR_RESET");
1050 int ret
= cmsis_dap_cmd_DAP_SWJ_Sequence(8, &seq
);
1051 if (ret
== ERROR_OK
)
1052 tap_set_state(TAP_RESET
);
1056 /* Set new end state */
1057 static void cmsis_dap_end_state(tap_state_t state
)
1059 if (tap_is_state_stable(state
))
1060 tap_set_end_state(state
);
1062 LOG_ERROR("BUG: %i is not a valid end state", state
);
1067 #ifdef SPRINT_BINARY
1068 static void sprint_binary(char *s
, const uint8_t *buf
, int offset
, int len
)
1074 buf = { 0x18 } len=5 should result in: 11000
1075 buf = { 0xff 0x18 } len=13 should result in: 11111111 11000
1076 buf = { 0xc0 0x18 } offset=3 len=10 should result in: 11000 11000
1077 i=3 there means i/8 = 0 so c = 0xFF, and
1079 for (int i
= offset
; i
< offset
+ len
; ++i
) {
1080 uint8_t c
= buf
[i
/ 8], mask
= 1 << (i
% 8);
1081 if ((i
!= offset
) && !(i
% 8))
1083 *s
++ = (c
& mask
) ? '1' : '0';
1089 #ifdef CMSIS_DAP_JTAG_DEBUG
1090 static void debug_parse_cmsis_buf(const uint8_t *cmd
, int cmdlen
)
1092 /* cmd is a usb packet to go to the cmsis-dap interface */
1093 printf("cmsis-dap buffer (%d b): ", cmdlen
);
1094 for (int i
= 0; i
< cmdlen
; ++i
)
1095 printf(" %02x", cmd
[i
]);
1098 case CMD_DAP_JTAG_SEQ
: {
1099 printf("cmsis-dap jtag sequence command %02x (n=%d)\n", cmd
[1], cmd
[2]);
1101 * #2 = number of sequences
1102 * #3 = sequence info 1
1103 * #4...4+n_bytes-1 = sequence 1
1104 * #4+n_bytes = sequence info 2
1105 * #5+n_bytes = sequence 2 (single bit)
1108 for (int seq
= 0; seq
< cmd
[2]; ++seq
) {
1109 uint8_t info
= cmd
[pos
++];
1110 int len
= info
& DAP_JTAG_SEQ_TCK
;
1113 printf(" sequence %d starting %d: info %02x (len=%d tms=%d read_tdo=%d): ",
1114 seq
, pos
, info
, len
, info
& DAP_JTAG_SEQ_TMS
, info
& DAP_JTAG_SEQ_TDO
);
1115 for (int i
= 0; i
< DIV_ROUND_UP(len
, 8); ++i
)
1116 printf(" %02x", cmd
[pos
+i
]);
1117 pos
+= DIV_ROUND_UP(len
, 8);
1120 if (pos
!= cmdlen
) {
1121 printf("BUFFER LENGTH MISMATCH looks like %d but %d specified", pos
, cmdlen
);
1128 LOG_DEBUG("unknown cmsis-dap command %02x", cmd
[1]);
1134 static void cmsis_dap_flush(void)
1136 if (!queued_seq_count
)
1139 DEBUG_JTAG_IO("Flushing %d queued sequences (%d bytes) with %d pending scan results to capture",
1140 queued_seq_count
, queued_seq_buf_end
, pending_scan_result_count
);
1142 /* prep CMSIS-DAP packet */
1143 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
1144 buffer
[0] = 0; /* report number */
1145 buffer
[1] = CMD_DAP_JTAG_SEQ
;
1146 buffer
[2] = queued_seq_count
;
1147 memcpy(buffer
+ 3, queued_seq_buf
, queued_seq_buf_end
);
1149 #ifdef CMSIS_DAP_JTAG_DEBUG
1150 debug_parse_cmsis_buf(buffer
, queued_seq_buf_end
+ 3);
1153 /* send command to USB device */
1154 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, queued_seq_buf_end
+ 3);
1155 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
1156 LOG_ERROR("CMSIS-DAP command CMD_DAP_JTAG_SEQ failed.");
1160 #ifdef CMSIS_DAP_JTAG_DEBUG
1161 DEBUG_JTAG_IO("USB response buf:");
1162 for (int c
= 0; c
< queued_seq_buf_end
+ 3; ++c
)
1163 printf("%02X ", buffer
[c
]);
1167 /* copy scan results into client buffers */
1168 for (int i
= 0; i
< pending_scan_result_count
; ++i
) {
1169 struct pending_scan_result
*scan
= &pending_scan_results
[i
];
1170 DEBUG_JTAG_IO("Copying pending_scan_result %d/%d: %d bits from byte %d -> buffer + %d bits",
1171 i
, pending_scan_result_count
, scan
->length
, scan
->first
+ 2, scan
->buffer_offset
);
1172 #ifdef CMSIS_DAP_JTAG_DEBUG
1173 for (uint32_t b
= 0; b
< DIV_ROUND_UP(scan
->length
, 8); ++b
)
1174 printf("%02X ", buffer
[2+scan
->first
+b
]);
1177 bit_copy(scan
->buffer
, scan
->buffer_offset
, buffer
+ 2 + scan
->first
, 0, scan
->length
);
1181 queued_seq_count
= 0;
1182 queued_seq_buf_end
= 0;
1183 queued_seq_tdo_ptr
= 0;
1184 pending_scan_result_count
= 0;
1187 /* queue a sequence of bits to clock out TDI / in TDO, executing if the buffer is full.
1189 * sequence=NULL means clock out zeros on TDI
1190 * tdo_buffer=NULL means don't capture TDO
1192 static void cmsis_dap_add_jtag_sequence(int s_len
, const uint8_t *sequence
, int s_offset
,
1193 bool tms
, uint8_t *tdo_buffer
, int tdo_buffer_offset
)
1195 DEBUG_JTAG_IO("[at %d] %d bits, tms %s, seq offset %d, tdo buf %p, tdo offset %d",
1197 s_len
, tms
? "HIGH" : "LOW", s_offset
, tdo_buffer
, tdo_buffer_offset
);
1203 DEBUG_JTAG_IO("START JTAG SEQ SPLIT");
1204 for (int offset
= 0; offset
< s_len
; offset
+= 64) {
1205 int len
= s_len
- offset
;
1208 DEBUG_JTAG_IO("Splitting long jtag sequence: %d-bit chunk starting at offset %d", len
, offset
);
1209 cmsis_dap_add_jtag_sequence(
1215 tdo_buffer
== NULL
? 0 : (tdo_buffer_offset
+ offset
)
1218 DEBUG_JTAG_IO("END JTAG SEQ SPLIT");
1222 int cmd_len
= 1 + DIV_ROUND_UP(s_len
, 8);
1223 if (queued_seq_count
>= 255 || queued_seq_buf_end
+ cmd_len
> QUEUED_SEQ_BUF_LEN
)
1224 /* empty out the buffer */
1230 queued_seq_buf
[queued_seq_buf_end
] =
1231 (tms
? DAP_JTAG_SEQ_TMS
: 0) |
1232 (tdo_buffer
!= NULL
? DAP_JTAG_SEQ_TDO
: 0) |
1233 (s_len
== 64 ? 0 : s_len
);
1235 if (sequence
!= NULL
)
1236 bit_copy(&queued_seq_buf
[queued_seq_buf_end
+ 1], 0, sequence
, s_offset
, s_len
);
1238 memset(&queued_seq_buf
[queued_seq_buf_end
+ 1], 0, DIV_ROUND_UP(s_len
, 8));
1240 queued_seq_buf_end
+= cmd_len
;
1242 if (tdo_buffer
!= NULL
) {
1243 struct pending_scan_result
*scan
= &pending_scan_results
[pending_scan_result_count
++];
1244 scan
->first
= queued_seq_tdo_ptr
;
1245 queued_seq_tdo_ptr
+= DIV_ROUND_UP(s_len
, 8);
1246 scan
->length
= s_len
;
1247 scan
->buffer
= tdo_buffer
;
1248 scan
->buffer_offset
= tdo_buffer_offset
;
1252 /* queue a sequence of bits to clock out TMS, executing if the buffer is full */
1253 static void cmsis_dap_add_tms_sequence(const uint8_t *sequence
, int s_len
)
1255 DEBUG_JTAG_IO("%d bits: %02X", s_len
, *sequence
);
1256 /* we use a series of CMD_DAP_JTAG_SEQ commands to toggle TMS,
1257 because even though it seems ridiculously inefficient, it
1258 allows us to combine TMS and scan sequences into the same
1260 /* TODO: combine runs of the same tms value */
1261 for (int i
= 0; i
< s_len
; ++i
) {
1262 bool bit
= (sequence
[i
/ 8] & (1 << (i
% 8))) != 0;
1263 cmsis_dap_add_jtag_sequence(1, NULL
, 0, bit
, NULL
, 0);
1267 /* Move to the end state by queuing a sequence to clock into TMS */
1268 static void cmsis_dap_state_move(void)
1271 uint8_t tms_scan_bits
;
1273 tms_scan
= tap_get_tms_path(tap_get_state(), tap_get_end_state());
1274 tms_scan_bits
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1276 DEBUG_JTAG_IO("state move from %s to %s: %d clocks, %02X on tms",
1277 tap_state_name(tap_get_state()), tap_state_name(tap_get_end_state()),
1278 tms_scan_bits
, tms_scan
);
1279 cmsis_dap_add_tms_sequence(&tms_scan
, tms_scan_bits
);
1281 tap_set_state(tap_get_end_state());
1285 /* Execute a JTAG scan operation by queueing TMS and TDI/TDO sequences */
1286 static void cmsis_dap_execute_scan(struct jtag_command
*cmd
)
1288 DEBUG_JTAG_IO("%s type:%d", cmd
->cmd
.scan
->ir_scan
? "IRSCAN" : "DRSCAN",
1289 jtag_scan_type(cmd
->cmd
.scan
));
1291 /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
1292 while (cmd
->cmd
.scan
->num_fields
> 0
1293 && cmd
->cmd
.scan
->fields
[cmd
->cmd
.scan
->num_fields
- 1].num_bits
== 0) {
1294 cmd
->cmd
.scan
->num_fields
--;
1295 LOG_DEBUG("discarding trailing empty field");
1298 if (cmd
->cmd
.scan
->num_fields
== 0) {
1299 LOG_DEBUG("empty scan, doing nothing");
1303 if (cmd
->cmd
.scan
->ir_scan
) {
1304 if (tap_get_state() != TAP_IRSHIFT
) {
1305 cmsis_dap_end_state(TAP_IRSHIFT
);
1306 cmsis_dap_state_move();
1309 if (tap_get_state() != TAP_DRSHIFT
) {
1310 cmsis_dap_end_state(TAP_DRSHIFT
);
1311 cmsis_dap_state_move();
1315 cmsis_dap_end_state(cmd
->cmd
.scan
->end_state
);
1317 struct scan_field
*field
= cmd
->cmd
.scan
->fields
;
1318 unsigned scan_size
= 0;
1320 for (int i
= 0; i
< cmd
->cmd
.scan
->num_fields
; i
++, field
++) {
1321 scan_size
+= field
->num_bits
;
1322 DEBUG_JTAG_IO("%s%s field %d/%d %d bits",
1323 field
->in_value
? "in" : "",
1324 field
->out_value
? "out" : "",
1326 cmd
->cmd
.scan
->num_fields
,
1329 if (i
== cmd
->cmd
.scan
->num_fields
- 1 && tap_get_state() != tap_get_end_state()) {
1330 DEBUG_JTAG_IO("Last field and have to move out of SHIFT state");
1331 /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
1332 * movement. This last field can't have length zero, it was checked above. */
1333 cmsis_dap_add_jtag_sequence(
1334 field
->num_bits
- 1, /* number of bits to clock */
1335 field
->out_value
, /* output sequence */
1336 0, /* output offset */
1337 false, /* TMS low */
1341 /* Clock the last bit out, with TMS high */
1342 uint8_t last_bit
= 0;
1343 if (field
->out_value
)
1344 bit_copy(&last_bit
, 0, field
->out_value
, field
->num_bits
- 1, 1);
1345 cmsis_dap_add_jtag_sequence(
1351 field
->num_bits
- 1);
1352 tap_set_state(tap_state_transition(tap_get_state(), 1));
1354 /* Now clock one more cycle, with TMS low, to get us into a PAUSE state */
1355 cmsis_dap_add_jtag_sequence(
1362 tap_set_state(tap_state_transition(tap_get_state(), 0));
1364 DEBUG_JTAG_IO("Internal field, staying in SHIFT state afterwards");
1365 /* Clocking part of a sequence into DR or IR with TMS=0,
1366 leaving TMS=0 at the end so we can continue later */
1367 cmsis_dap_add_jtag_sequence(
1377 if (tap_get_state() != tap_get_end_state()) {
1378 cmsis_dap_end_state(tap_get_end_state());
1379 cmsis_dap_state_move();
1382 DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
1383 (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", scan_size
,
1384 tap_state_name(tap_get_end_state()));
1387 static void cmsis_dap_pathmove(int num_states
, tap_state_t
*path
)
1390 uint8_t tms0
= 0x00;
1391 uint8_t tms1
= 0xff;
1393 for (i
= 0; i
< num_states
; i
++) {
1394 if (path
[i
] == tap_state_transition(tap_get_state(), false))
1395 cmsis_dap_add_tms_sequence(&tms0
, 1);
1396 else if (path
[i
] == tap_state_transition(tap_get_state(), true))
1397 cmsis_dap_add_tms_sequence(&tms1
, 1);
1399 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition.",
1400 tap_state_name(tap_get_state()), tap_state_name(path
[i
]));
1404 tap_set_state(path
[i
]);
1407 cmsis_dap_end_state(tap_get_state());
1410 static void cmsis_dap_execute_pathmove(struct jtag_command
*cmd
)
1412 DEBUG_JTAG_IO("pathmove: %i states, end in %i",
1413 cmd
->cmd
.pathmove
->num_states
,
1414 cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
1416 cmsis_dap_pathmove(cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
);
1419 static void cmsis_dap_stableclocks(int num_cycles
)
1423 uint8_t tms
= tap_get_state() == TAP_RESET
;
1424 /* TODO: Perform optimizations? */
1425 /* Execute num_cycles. */
1426 for (i
= 0; i
< num_cycles
; i
++)
1427 cmsis_dap_add_tms_sequence(&tms
, 1);
1430 static void cmsis_dap_runtest(int num_cycles
)
1432 tap_state_t saved_end_state
= tap_get_end_state();
1434 /* Only do a state_move when we're not already in IDLE. */
1435 if (tap_get_state() != TAP_IDLE
) {
1436 cmsis_dap_end_state(TAP_IDLE
);
1437 cmsis_dap_state_move();
1439 cmsis_dap_stableclocks(num_cycles
);
1441 /* Finish in end_state. */
1442 cmsis_dap_end_state(saved_end_state
);
1444 if (tap_get_state() != tap_get_end_state())
1445 cmsis_dap_state_move();
1448 static void cmsis_dap_execute_runtest(struct jtag_command
*cmd
)
1450 DEBUG_JTAG_IO("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
,
1451 cmd
->cmd
.runtest
->end_state
);
1453 cmsis_dap_end_state(cmd
->cmd
.runtest
->end_state
);
1454 cmsis_dap_runtest(cmd
->cmd
.runtest
->num_cycles
);
1457 static void cmsis_dap_execute_stableclocks(struct jtag_command
*cmd
)
1459 DEBUG_JTAG_IO("stableclocks %i cycles", cmd
->cmd
.runtest
->num_cycles
);
1460 cmsis_dap_stableclocks(cmd
->cmd
.runtest
->num_cycles
);
1463 static void cmsis_dap_execute_tms(struct jtag_command
*cmd
)
1465 DEBUG_JTAG_IO("TMS: %d bits", cmd
->cmd
.tms
->num_bits
);
1466 cmsis_dap_cmd_DAP_SWJ_Sequence(cmd
->cmd
.tms
->num_bits
, cmd
->cmd
.tms
->bits
);
1469 /* TODO: Is there need to call cmsis_dap_flush() for the JTAG_PATHMOVE,
1470 * JTAG_RUNTEST, JTAG_STABLECLOCKS? */
1471 static void cmsis_dap_execute_command(struct jtag_command
*cmd
)
1473 switch (cmd
->type
) {
1476 cmsis_dap_execute_reset(cmd
);
1480 cmsis_dap_execute_sleep(cmd
);
1482 case JTAG_TLR_RESET
:
1484 cmsis_dap_execute_tlr_reset(cmd
);
1487 cmsis_dap_execute_scan(cmd
);
1490 cmsis_dap_execute_pathmove(cmd
);
1493 cmsis_dap_execute_runtest(cmd
);
1495 case JTAG_STABLECLOCKS
:
1496 cmsis_dap_execute_stableclocks(cmd
);
1499 cmsis_dap_execute_tms(cmd
);
1502 LOG_ERROR("BUG: unknown JTAG command type 0x%X encountered", cmd
->type
);
1507 static int cmsis_dap_execute_queue(void)
1509 struct jtag_command
*cmd
= jtag_command_queue
;
1511 while (cmd
!= NULL
) {
1512 cmsis_dap_execute_command(cmd
);
1521 static int cmsis_dap_speed(int speed
)
1523 if (speed
> DAP_MAX_CLOCK
)
1524 LOG_INFO("High speed (adapter_khz %d) may be limited by adapter firmware.", speed
);
1527 LOG_ERROR("RTCK not supported. Set nonzero adapter_khz.");
1528 return ERROR_JTAG_NOT_IMPLEMENTED
;
1531 return cmsis_dap_cmd_DAP_SWJ_Clock(speed
);
1534 static int cmsis_dap_speed_div(int speed
, int *khz
)
1540 static int cmsis_dap_khz(int khz
, int *jtag_speed
)
1546 static int_least32_t cmsis_dap_swd_frequency(int_least32_t hz
)
1549 cmsis_dap_speed(hz
/ 1000);
1555 COMMAND_HANDLER(cmsis_dap_handle_info_command
)
1557 if (cmsis_dap_get_version_info() == ERROR_OK
)
1558 cmsis_dap_get_status();
1563 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command
)
1565 if (CMD_ARGC
> MAX_USB_IDS
* 2) {
1566 LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
1567 "(maximum is %d pairs)", MAX_USB_IDS
);
1568 CMD_ARGC
= MAX_USB_IDS
* 2;
1570 if (CMD_ARGC
< 2 || (CMD_ARGC
& 1)) {
1571 LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
1573 return ERROR_COMMAND_SYNTAX_ERROR
;
1574 /* remove the incomplete trailing id */
1579 for (i
= 0; i
< CMD_ARGC
; i
+= 2) {
1580 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
], cmsis_dap_vid
[i
>> 1]);
1581 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
+ 1], cmsis_dap_pid
[i
>> 1]);
1585 * Explicitly terminate, in case there are multiples instances of
1586 * cmsis_dap_vid_pid.
1588 cmsis_dap_vid
[i
>> 1] = cmsis_dap_pid
[i
>> 1] = 0;
1593 COMMAND_HANDLER(cmsis_dap_handle_serial_command
)
1595 if (CMD_ARGC
== 1) {
1596 size_t len
= mbstowcs(NULL
, CMD_ARGV
[0], 0);
1597 cmsis_dap_serial
= calloc(len
+ 1, sizeof(wchar_t));
1598 if (cmsis_dap_serial
== NULL
) {
1599 LOG_ERROR("unable to allocate memory");
1602 if (mbstowcs(cmsis_dap_serial
, CMD_ARGV
[0], len
+ 1) == (size_t)-1) {
1603 free(cmsis_dap_serial
);
1604 cmsis_dap_serial
= NULL
;
1605 LOG_ERROR("unable to convert serial");
1608 LOG_ERROR("expected exactly one argument to cmsis_dap_serial <serial-number>");
1614 static const struct command_registration cmsis_dap_subcommand_handlers
[] = {
1617 .handler
= &cmsis_dap_handle_info_command
,
1618 .mode
= COMMAND_EXEC
,
1620 .help
= "show cmsis-dap info",
1622 COMMAND_REGISTRATION_DONE
1625 static const struct command_registration cmsis_dap_command_handlers
[] = {
1627 .name
= "cmsis-dap",
1628 .mode
= COMMAND_ANY
,
1629 .help
= "perform CMSIS-DAP management",
1631 .chain
= cmsis_dap_subcommand_handlers
,
1634 .name
= "cmsis_dap_vid_pid",
1635 .handler
= &cmsis_dap_handle_vid_pid_command
,
1636 .mode
= COMMAND_CONFIG
,
1637 .help
= "the vendor ID and product ID of the CMSIS-DAP device",
1638 .usage
= "(vid pid)* ",
1641 .name
= "cmsis_dap_serial",
1642 .handler
= &cmsis_dap_handle_serial_command
,
1643 .mode
= COMMAND_CONFIG
,
1644 .help
= "set the serial number of the adapter",
1645 .usage
= "serial_string",
1647 COMMAND_REGISTRATION_DONE
1650 static const struct swd_driver cmsis_dap_swd_driver
= {
1651 .init
= cmsis_dap_swd_init
,
1652 .frequency
= cmsis_dap_swd_frequency
,
1653 .switch_seq
= cmsis_dap_swd_switch_seq
,
1654 .read_reg
= cmsis_dap_swd_read_reg
,
1655 .write_reg
= cmsis_dap_swd_write_reg
,
1656 .run
= cmsis_dap_swd_run_queue
,
1659 static const char * const cmsis_dap_transport
[] = { "swd", "jtag", NULL
};
1661 struct jtag_interface cmsis_dap_interface
= {
1662 .name
= "cmsis-dap",
1663 .supported
= DEBUG_CAP_TMS_SEQ
,
1664 .commands
= cmsis_dap_command_handlers
,
1665 .swd
= &cmsis_dap_swd_driver
,
1666 .transports
= cmsis_dap_transport
,
1668 .execute_queue
= cmsis_dap_execute_queue
,
1669 .speed
= cmsis_dap_speed
,
1670 .speed_div
= cmsis_dap_speed_div
,
1671 .khz
= cmsis_dap_khz
,
1672 .init
= cmsis_dap_init
,
1673 .quit
= cmsis_dap_quit
,