1 /***************************************************************************
2 * Copyright (C) 2013 by mike brown *
3 * mike@theshedworks.org.uk *
5 * Copyright (C) 2013 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
22 ***************************************************************************/
28 #include <transport/transport.h>
30 #include <jtag/interface.h>
31 #include <jtag/commands.h>
36 #ifdef _DEBUG_JTAG_IO_
37 #define DEBUG_IO(expr...) LOG_DEBUG(expr)
39 #define DEBUG_IO(expr...) do {} while (0)
43 * See CMSIS-DAP documentation:
44 * Version 0.01 - Beta.
49 /* Known vid/pid pairs:
50 * VID 0xc251: Keil Software
51 * PID 0xf001: LPC-Link-II CMSIS_DAP
52 * PID 0xf002: OPEN-SDA CMSIS_DAP (Freedom Board)
53 * PID 0x2722: Keil ULINK2 CMSIS-DAP
55 * VID 0x0d28: mbed Software
56 * PID 0x0204: MBED CMSIS-DAP
60 /* vid = pid = 0 marks the end of the list */
61 static uint16_t cmsis_dap_vid
[MAX_USB_IDS
+ 1] = { 0 };
62 static uint16_t cmsis_dap_pid
[MAX_USB_IDS
+ 1] = { 0 };
65 #define PACKET_SIZE (64 + 1) /* 64 bytes plus report id */
66 #define USB_TIMEOUT 1000
68 /* CMSIS-DAP General Commands */
69 #define CMD_DAP_INFO 0x00
70 #define CMD_DAP_LED 0x01
71 #define CMD_DAP_CONNECT 0x02
72 #define CMD_DAP_DISCONNECT 0x03
73 #define CMD_DAP_WRITE_ABORT 0x08
74 #define CMD_DAP_DELAY 0x09
75 #define CMD_DAP_RESET_TARGET 0x0A
78 #define INFO_ID_VID 0x00 /* string */
79 #define INFO_ID_PID 0x02 /* string */
80 #define INFO_ID_SERNUM 0x03 /* string */
81 #define INFO_ID_FW_VER 0x04 /* string */
82 #define INFO_ID_TD_VEND 0x05 /* string */
83 #define INFO_ID_TD_NAME 0x06 /* string */
84 #define INFO_ID_CAPS 0xf0 /* byte */
85 #define INFO_ID_PKT_CNT 0xfe /* byte */
86 #define INFO_ID_PKT_SZ 0xff /* short */
88 #define INFO_CAPS_SWD 0x01
89 #define INFO_CAPS_JTAG 0x02
92 #define LED_ID_CONNECT 0x00
93 #define LED_ID_RUN 0x01
99 #define CONNECT_DEFAULT 0x00
100 #define CONNECT_SWD 0x01
101 #define CONNECT_JTAG 0x02
103 /* CMSIS-DAP Common SWD/JTAG Commands */
104 #define CMD_DAP_DELAY 0x09
105 #define CMD_DAP_SWJ_PINS 0x10
106 #define CMD_DAP_SWJ_CLOCK 0x11
107 #define CMD_DAP_SWJ_SEQ 0x12
119 /* CMSIS-DAP SWD Commands */
120 #define CMD_DAP_SWD_CONFIGURE 0x13
122 /* CMSIS-DAP JTAG Commands */
123 #define CMD_DAP_JTAG_SEQ 0x14
124 #define CMD_DAP_JTAG_CONFIGURE 0x15
125 #define CMD_DAP_JTAG_IDCODE 0x16
127 /* CMSIS-DAP Transfer Commands */
128 #define CMD_DAP_TFER_CONFIGURE 0x04
129 #define CMD_DAP_TFER 0x05
130 #define CMD_DAP_TFER_BLOCK 0x06
131 #define CMD_DAP_TFER_ABORT 0x07
133 /* DAP Status Code */
135 #define DAP_ERROR 0xFF
137 /* CMSIS-DAP Vendor Commands
140 static char *info_caps_str
[] = {
145 /* max clock speed (kHz) */
146 #define DAP_MAX_CLOCK 5000
149 hid_device
*dev_handle
;
150 uint16_t packet_size
;
151 uint16_t packet_count
;
152 uint8_t *packet_buffer
;
157 static struct cmsis_dap
*cmsis_dap_handle
;
159 static int cmsis_dap_usb_open(void)
161 hid_device
*dev
= NULL
;
163 struct hid_device_info
*devs
, *cur_dev
;
164 unsigned short target_vid
, target_pid
;
170 The CMSIS-DAP specification stipulates:
171 "The Product String must contain "CMSIS-DAP" somewhere in the string. This is used by the
172 debuggers to idenify a CMSIS-DAP compliant Debug Unit that is connected to a host computer."
174 devs
= hid_enumerate(0x0, 0x0);
176 while (NULL
!= cur_dev
) {
177 if (0 == cmsis_dap_vid
[0]) {
178 if (NULL
== cur_dev
->product_string
) {
179 LOG_DEBUG("Cannot read product string of device 0x%x:0x%x",
180 cur_dev
->vendor_id
, cur_dev
->product_id
);
182 if (wcsstr(cur_dev
->product_string
, L
"CMSIS-DAP"))
184 if the user hasn't specified VID:PID *and*
185 product string contains "CMSIS-DAP", pick it
191 otherwise, exhaustively compare against all VID:PID in list
193 for (i
= 0; cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
]; i
++) {
194 if ((cmsis_dap_vid
[i
] == cur_dev
->vendor_id
) && (cmsis_dap_pid
[i
] == cur_dev
->product_id
))
197 if (cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
])
201 cur_dev
= cur_dev
->next
;
204 if (NULL
!= cur_dev
) {
205 target_vid
= cur_dev
->vendor_id
;
206 target_pid
= cur_dev
->product_id
;
209 hid_free_enumeration(devs
);
211 if (hid_init() != 0) {
212 LOG_ERROR("unable to open HIDAPI");
216 dev
= hid_open(target_vid
, target_pid
, NULL
);
219 LOG_ERROR("unable to open CMSIS-DAP device");
223 struct cmsis_dap
*dap
= malloc(sizeof(struct cmsis_dap
));
225 LOG_ERROR("unable to allocate memory");
229 dap
->dev_handle
= dev
;
233 cmsis_dap_handle
= dap
;
235 /* allocate default packet buffer, may be changed later.
236 * currently with HIDAPI we have no way of getting the output report length
237 * without this info we cannot communicate with the adapter.
238 * For the moment we ahve to hard code the packet size */
240 int packet_size
= PACKET_SIZE
;
242 /* atmel cmsis-dap uses 512 byte reports */
243 if (target_vid
== 0x03eb)
244 packet_size
= 512 + 1;
246 cmsis_dap_handle
->packet_buffer
= malloc(packet_size
);
247 cmsis_dap_handle
->packet_size
= packet_size
;
249 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
250 LOG_ERROR("unable to allocate memory");
257 static void cmsis_dap_usb_close(struct cmsis_dap
*dap
)
259 hid_close(dap
->dev_handle
);
262 if (cmsis_dap_handle
->packet_buffer
)
263 free(cmsis_dap_handle
->packet_buffer
);
265 if (cmsis_dap_handle
) {
266 free(cmsis_dap_handle
);
267 cmsis_dap_handle
= NULL
;
273 /* Send a message and receive the reply */
274 static int cmsis_dap_usb_xfer(struct cmsis_dap
*dap
, int txlen
)
276 /* Pad the rest of the TX buffer with 0's */
277 memset(dap
->packet_buffer
+ txlen
, 0, dap
->packet_size
- 1 - txlen
);
279 /* write data to device */
280 int retval
= hid_write(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
);
282 LOG_ERROR("error writing data: %ls", hid_error(dap
->dev_handle
));
287 retval
= hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, USB_TIMEOUT
);
288 if (retval
== -1 || retval
== 0) {
289 LOG_DEBUG("error reading data: %ls", hid_error(dap
->dev_handle
));
296 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins
, uint8_t mask
, uint32_t delay
, uint8_t *input
)
299 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
301 buffer
[0] = 0; /* report number */
302 buffer
[1] = CMD_DAP_SWJ_PINS
;
305 buffer
[4] = delay
& 0xff;
306 buffer
[5] = (delay
>> 8) & 0xff;
307 buffer
[6] = (delay
>> 16) & 0xff;
308 buffer
[7] = (delay
>> 24) & 0xff;
309 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 8);
311 if (retval
!= ERROR_OK
) {
312 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
313 return ERROR_JTAG_DEVICE_ERROR
;
322 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock
)
325 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
327 /* set clock in Hz */
329 buffer
[0] = 0; /* report number */
330 buffer
[1] = CMD_DAP_SWJ_CLOCK
;
331 buffer
[2] = swj_clock
& 0xff;
332 buffer
[3] = (swj_clock
>> 8) & 0xff;
333 buffer
[4] = (swj_clock
>> 16) & 0xff;
334 buffer
[5] = (swj_clock
>> 24) & 0xff;
335 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 6);
337 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
338 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
339 return ERROR_JTAG_DEVICE_ERROR
;
345 static int cmsis_dap_cmd_DAP_Info(uint8_t info
, uint8_t **data
)
348 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
350 buffer
[0] = 0; /* report number */
351 buffer
[1] = CMD_DAP_INFO
;
353 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
355 if (retval
!= ERROR_OK
) {
356 LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
357 return ERROR_JTAG_DEVICE_ERROR
;
360 *data
= &(buffer
[1]);
365 static int cmsis_dap_cmd_DAP_LED(uint8_t leds
)
368 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
370 buffer
[0] = 0; /* report number */
371 buffer
[1] = CMD_DAP_LED
;
374 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
376 if (retval
!= ERROR_OK
|| buffer
[1] != 0x00) {
377 LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
378 return ERROR_JTAG_DEVICE_ERROR
;
384 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode
)
387 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
389 buffer
[0] = 0; /* report number */
390 buffer
[1] = CMD_DAP_CONNECT
;
392 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
394 if (retval
!= ERROR_OK
) {
395 LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
396 return ERROR_JTAG_DEVICE_ERROR
;
399 if (buffer
[1] != mode
) {
400 LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode
);
401 return ERROR_JTAG_DEVICE_ERROR
;
407 static int cmsis_dap_cmd_DAP_Disconnect(void)
410 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
412 buffer
[0] = 0; /* report number */
413 buffer
[1] = CMD_DAP_DISCONNECT
;
414 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
416 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
417 LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
418 return ERROR_JTAG_DEVICE_ERROR
;
424 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle
, uint16_t delay
, uint16_t retry
)
427 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
429 buffer
[0] = 0; /* report number */
430 buffer
[1] = CMD_DAP_TFER_CONFIGURE
;
432 buffer
[3] = delay
& 0xff;
433 buffer
[4] = (delay
>> 8) & 0xff;
434 buffer
[5] = retry
& 0xff;
435 buffer
[6] = (retry
>> 8) & 0xff;
436 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
438 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
439 LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
440 return ERROR_JTAG_DEVICE_ERROR
;
446 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg
)
449 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
451 buffer
[0] = 0; /* report number */
452 buffer
[1] = CMD_DAP_SWD_CONFIGURE
;
454 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
456 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
457 LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
458 return ERROR_JTAG_DEVICE_ERROR
;
465 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us
)
468 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
470 buffer
[0] = 0; /* report number */
471 buffer
[1] = CMD_DAP_DELAY
;
472 buffer
[2] = delay_us
& 0xff;
473 buffer
[3] = (delay_us
>> 8) & 0xff;
474 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
476 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
477 LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
478 return ERROR_JTAG_DEVICE_ERROR
;
485 static int queued_retval
;
487 static void cmsis_dap_swd_read_reg(struct adiv5_dap
*dap
, uint8_t cmd
, uint32_t *value
)
489 if (queued_retval
!= ERROR_OK
)
492 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
496 DEBUG_IO("CMSIS-DAP: Read Reg 0x%02" PRIx8
, cmd
);
498 buffer
[0] = 0; /* report number */
499 buffer
[1] = CMD_DAP_TFER
;
503 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
505 /* TODO - need better response checking */
506 if (retval
!= ERROR_OK
|| buffer
[1] != 0x01) {
507 LOG_ERROR("CMSIS-DAP: Read Error (0x%02" PRIx8
")", buffer
[2]);
508 queued_retval
= buffer
[2];
512 val
= le_to_h_u32(&buffer
[3]);
513 DEBUG_IO("0x%08" PRIx32
, val
);
518 queued_retval
= retval
;
521 static void cmsis_dap_swd_write_reg(struct adiv5_dap
*dap
, uint8_t cmd
, uint32_t value
)
523 if (queued_retval
!= ERROR_OK
)
526 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
528 DEBUG_IO("CMSIS-DAP: Write Reg 0x%02" PRIx8
" 0x%08" PRIx32
, cmd
, value
);
530 buffer
[0] = 0; /* report number */
531 buffer
[1] = CMD_DAP_TFER
;
535 buffer
[5] = (value
) & 0xff;
536 buffer
[6] = (value
>> 8) & 0xff;
537 buffer
[7] = (value
>> 16) & 0xff;
538 buffer
[8] = (value
>> 24) & 0xff;
539 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 9);
541 if (buffer
[1] != 0x01) {
542 LOG_ERROR("CMSIS-DAP: Write Error (0x%02" PRIx8
")", buffer
[2]);
546 queued_retval
= retval
;
549 static int cmsis_dap_swd_run(struct adiv5_dap
*dap
)
551 int retval
= queued_retval
;
552 queued_retval
= ERROR_OK
;
556 static int cmsis_dap_get_version_info(void)
560 /* INFO_ID_FW_VER - string */
561 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER
, &data
);
562 if (retval
!= ERROR_OK
)
565 if (data
[0]) /* strlen */
566 LOG_INFO("CMSIS-DAP: FW Version = %s", &data
[1]);
571 static int cmsis_dap_get_caps_info(void)
575 /* INFO_ID_CAPS - byte */
576 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS
, &data
);
577 if (retval
!= ERROR_OK
)
581 uint8_t caps
= data
[1];
583 cmsis_dap_handle
->caps
= caps
;
585 if (caps
& INFO_CAPS_SWD
)
586 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[0]);
587 if (caps
& INFO_CAPS_JTAG
)
588 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[1]);
594 static int cmsis_dap_get_status(void)
598 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d
);
600 if (retval
== ERROR_OK
) {
601 LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
602 (d
& (0x01 << 0)) ? 1 : 0, /* Bit 0: SWCLK/TCK */
603 (d
& (0x01 << 1)) ? 1 : 0, /* Bit 1: SWDIO/TMS */
604 (d
& (0x01 << 2)) ? 1 : 0, /* Bit 2: TDI */
605 (d
& (0x01 << 3)) ? 1 : 0, /* Bit 3: TDO */
606 (d
& (0x01 << 5)) ? 1 : 0, /* Bit 5: nTRST */
607 (d
& (0x01 << 7)) ? 1 : 0); /* Bit 7: nRESET */
613 static int cmsis_dap_reset_link(void)
615 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
617 LOG_DEBUG("CMSIS-DAP: cmsis_dap_reset_link");
618 LOG_INFO("DAP_SWJ Sequence (reset: 50+ '1' followed by 0)");
620 /* reset line with SWDIO high for >50 cycles */
621 buffer
[0] = 0; /* report number */
622 buffer
[1] = CMD_DAP_SWJ_SEQ
;
631 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 10);
633 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
636 /* 16bit JTAG-SWD sequence */
637 buffer
[0] = 0; /* report number */
638 buffer
[1] = CMD_DAP_SWJ_SEQ
;
642 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
644 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
647 /* another reset just incase */
648 buffer
[0] = 0; /* report number */
649 buffer
[1] = CMD_DAP_SWJ_SEQ
;
658 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 10);
660 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
663 /* 16 cycle idle period */
664 buffer
[0] = 0; /* report number */
665 buffer
[1] = CMD_DAP_SWJ_SEQ
;
669 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
671 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
674 DEBUG_IO("DAP Read IDCODE");
676 /* read the id code is always the next sequence */
677 buffer
[0] = 0; /* report number */
678 buffer
[1] = CMD_DAP_TFER
;
682 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
684 if (retval
!= ERROR_OK
)
687 if (buffer
[1] == 0) {
688 LOG_DEBUG("Result 0x%02" PRIx8
" 0x%02" PRIx8
, buffer
[1], buffer
[2]);
690 LOG_DEBUG("DAP Reset Target");
691 buffer
[0] = 0; /* report number */
692 buffer
[1] = CMD_DAP_RESET_TARGET
;
693 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
694 LOG_DEBUG("Result 0x%02" PRIx8
" 0x%02" PRIx8
, buffer
[1], buffer
[2]);
696 LOG_DEBUG("DAP Write Abort");
697 buffer
[0] = 0; /* report number */
698 buffer
[1] = CMD_DAP_WRITE_ABORT
;
700 buffer
[3] = 0x1e/*0x1f*/;
704 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
705 LOG_DEBUG("Result 0x%02" PRIx8
, buffer
[1]);
707 return 0x80 + buffer
[1];
710 LOG_DEBUG("DAP Write Abort");
711 buffer
[0] = 0; /* report number */
712 buffer
[1] = CMD_DAP_WRITE_ABORT
;
718 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
719 LOG_DEBUG("Result 0x%02" PRIx8
, buffer
[1]);
724 static int cmsis_dap_swd_open(void)
728 DEBUG_IO("CMSIS-DAP: cmsis_dap_swd_open");
730 if (cmsis_dap_handle
== NULL
) {
733 retval
= cmsis_dap_usb_open();
734 if (retval
!= ERROR_OK
)
737 retval
= cmsis_dap_get_caps_info();
738 if (retval
!= ERROR_OK
)
742 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_SWD
)) {
743 LOG_ERROR("CMSIS-DAP: SWD not supported");
744 return ERROR_JTAG_DEVICE_ERROR
;
747 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
748 if (retval
!= ERROR_OK
)
751 /* Add more setup here.??... */
753 LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
757 static int cmsis_dap_init(void)
763 retval
= cmsis_dap_swd_open();
764 if (retval
!= ERROR_OK
)
768 if (cmsis_dap_handle
== NULL
) {
771 retval
= cmsis_dap_usb_open();
772 if (retval
!= ERROR_OK
)
775 retval
= cmsis_dap_get_caps_info();
776 if (retval
!= ERROR_OK
)
779 /* Connect in JTAG mode */
780 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_JTAG
)) {
781 LOG_ERROR("CMSIS-DAP: JTAG not supported");
782 return ERROR_JTAG_DEVICE_ERROR
;
785 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_JTAG
);
786 if (retval
!= ERROR_OK
)
789 LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
792 retval
= cmsis_dap_get_version_info();
793 if (retval
!= ERROR_OK
)
796 /* INFO_ID_PKT_SZ - short */
797 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ
, &data
);
798 if (retval
!= ERROR_OK
)
801 if (data
[0] == 2) { /* short */
802 uint16_t pkt_sz
= data
[1] + (data
[2] << 8);
804 if (cmsis_dap_handle
->packet_size
!= pkt_sz
+ 1) {
805 /* reallocate buffer */
806 cmsis_dap_handle
->packet_size
= pkt_sz
+ 1;
807 cmsis_dap_handle
->packet_buffer
= realloc(cmsis_dap_handle
->packet_buffer
,
808 cmsis_dap_handle
->packet_size
);
809 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
810 LOG_ERROR("unable to reallocate memory");
815 LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16
, pkt_sz
);
818 /* INFO_ID_PKT_CNT - byte */
819 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT
, &data
);
820 if (retval
!= ERROR_OK
)
823 if (data
[0] == 1) { /* byte */
824 uint16_t pkt_cnt
= data
[1];
825 cmsis_dap_handle
->packet_count
= pkt_cnt
;
826 LOG_DEBUG("CMSIS-DAP: Packet Count = %" PRId16
, pkt_cnt
);
829 retval
= cmsis_dap_get_status();
830 if (retval
!= ERROR_OK
)
833 /* Now try to connect to the target
834 * TODO: This is all SWD only @ present */
835 retval
= cmsis_dap_cmd_DAP_SWJ_Clock(100); /* 100kHz */
836 if (retval
!= ERROR_OK
)
839 retval
= cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
840 if (retval
!= ERROR_OK
)
842 retval
= cmsis_dap_cmd_DAP_SWD_Configure(0x00);
843 if (retval
!= ERROR_OK
)
846 retval
= cmsis_dap_cmd_DAP_LED(0x03); /* Both LEDs on */
847 if (retval
!= ERROR_OK
)
850 /* support connecting with srst asserted */
851 enum reset_types jtag_reset_config
= jtag_get_reset_config();
853 if (jtag_reset_config
& RESET_CNCT_UNDER_SRST
) {
854 if (jtag_reset_config
& RESET_SRST_NO_GATING
) {
855 retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL
);
856 if (retval
!= ERROR_OK
)
858 LOG_INFO("Connecting under reset");
862 retval
= cmsis_dap_reset_link();
863 if (retval
!= ERROR_OK
)
866 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
868 LOG_INFO("CMSIS-DAP: Interface ready");
873 static int cmsis_dap_swd_init(void)
879 static int cmsis_dap_quit(void)
881 cmsis_dap_cmd_DAP_Disconnect();
882 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
884 cmsis_dap_usb_close(cmsis_dap_handle
);
889 static void cmsis_dap_execute_reset(struct jtag_command
*cmd
)
891 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(cmd
->cmd
.reset
->srst
? 0 : (1 << 7), \
893 if (retval
!= ERROR_OK
)
894 LOG_ERROR("CMSIS-DAP: Interface reset failed");
897 static void cmsis_dap_execute_sleep(struct jtag_command
*cmd
)
900 int retval
= cmsis_dap_cmd_DAP_Delay(cmd
->cmd
.sleep
->us
);
901 if (retval
!= ERROR_OK
)
903 jtag_sleep(cmd
->cmd
.sleep
->us
);
906 static void cmsis_dap_execute_command(struct jtag_command
*cmd
)
910 cmsis_dap_execute_reset(cmd
);
913 cmsis_dap_execute_sleep(cmd
);
916 LOG_ERROR("BUG: unknown JTAG command type encountered");
921 static int cmsis_dap_execute_queue(void)
923 struct jtag_command
*cmd
= jtag_command_queue
;
925 while (cmd
!= NULL
) {
926 cmsis_dap_execute_command(cmd
);
933 static int cmsis_dap_speed(int speed
)
935 if (speed
> DAP_MAX_CLOCK
) {
936 LOG_INFO("reduce speed request: %dkHz to %dkHz maximum", speed
, DAP_MAX_CLOCK
);
937 speed
= DAP_MAX_CLOCK
;
941 LOG_INFO("RTCK not supported");
942 return ERROR_JTAG_NOT_IMPLEMENTED
;
945 return cmsis_dap_cmd_DAP_SWJ_Clock(speed
);
948 static int cmsis_dap_speed_div(int speed
, int *khz
)
954 static int cmsis_dap_khz(int khz
, int *jtag_speed
)
960 COMMAND_HANDLER(cmsis_dap_handle_info_command
)
962 if (cmsis_dap_get_version_info() == ERROR_OK
)
963 cmsis_dap_get_status();
968 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command
)
970 if (CMD_ARGC
> MAX_USB_IDS
* 2) {
971 LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
972 "(maximum is %d pairs)", MAX_USB_IDS
);
973 CMD_ARGC
= MAX_USB_IDS
* 2;
975 if (CMD_ARGC
< 2 || (CMD_ARGC
& 1)) {
976 LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
978 return ERROR_COMMAND_SYNTAX_ERROR
;
979 /* remove the incomplete trailing id */
984 for (i
= 0; i
< CMD_ARGC
; i
+= 2) {
985 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
], cmsis_dap_vid
[i
>> 1]);
986 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
+ 1], cmsis_dap_pid
[i
>> 1]);
990 * Explicitly terminate, in case there are multiples instances of
993 cmsis_dap_vid
[i
>> 1] = cmsis_dap_pid
[i
>> 1] = 0;
998 static const struct command_registration cmsis_dap_subcommand_handlers
[] = {
1001 .handler
= &cmsis_dap_handle_info_command
,
1002 .mode
= COMMAND_EXEC
,
1004 .help
= "show cmsis-dap info",
1006 COMMAND_REGISTRATION_DONE
1009 static const struct command_registration cmsis_dap_command_handlers
[] = {
1011 .name
= "cmsis-dap",
1012 .mode
= COMMAND_ANY
,
1013 .help
= "perform CMSIS-DAP management",
1015 .chain
= cmsis_dap_subcommand_handlers
,
1018 .name
= "cmsis_dap_vid_pid",
1019 .handler
= &cmsis_dap_handle_vid_pid_command
,
1020 .mode
= COMMAND_CONFIG
,
1021 .help
= "the vendor ID and product ID of the CMSIS-DAP device",
1022 .usage
= "(vid pid)* ",
1024 COMMAND_REGISTRATION_DONE
1027 static const struct swd_driver cmsis_dap_swd_driver
= {
1028 .init
= cmsis_dap_swd_init
,
1029 .read_reg
= cmsis_dap_swd_read_reg
,
1030 .write_reg
= cmsis_dap_swd_write_reg
,
1031 .run
= cmsis_dap_swd_run
,
1034 const char *cmsis_dap_transport
[] = {"cmsis-dap", NULL
};
1036 struct jtag_interface cmsis_dap_interface
= {
1037 .name
= "cmsis-dap",
1038 .commands
= cmsis_dap_command_handlers
,
1039 .swd
= &cmsis_dap_swd_driver
,
1040 .transports
= cmsis_dap_transport
,
1042 .execute_queue
= cmsis_dap_execute_queue
,
1043 .speed
= cmsis_dap_speed
,
1044 .speed_div
= cmsis_dap_speed_div
,
1045 .khz
= cmsis_dap_khz
,
1046 .init
= cmsis_dap_init
,
1047 .quit
= cmsis_dap_quit
,
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)