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 const char * const 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 (target_vid
== 0 && target_pid
== 0) {
212 LOG_ERROR("unable to find CMSIS-DAP device");
216 if (hid_init() != 0) {
217 LOG_ERROR("unable to open HIDAPI");
221 dev
= hid_open(target_vid
, target_pid
, NULL
);
224 LOG_ERROR("unable to open CMSIS-DAP device");
228 struct cmsis_dap
*dap
= malloc(sizeof(struct cmsis_dap
));
230 LOG_ERROR("unable to allocate memory");
234 dap
->dev_handle
= dev
;
238 cmsis_dap_handle
= dap
;
240 /* allocate default packet buffer, may be changed later.
241 * currently with HIDAPI we have no way of getting the output report length
242 * without this info we cannot communicate with the adapter.
243 * For the moment we ahve to hard code the packet size */
245 int packet_size
= PACKET_SIZE
;
247 /* atmel cmsis-dap uses 512 byte reports */
248 if (target_vid
== 0x03eb)
249 packet_size
= 512 + 1;
251 cmsis_dap_handle
->packet_buffer
= malloc(packet_size
);
252 cmsis_dap_handle
->packet_size
= packet_size
;
254 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
255 LOG_ERROR("unable to allocate memory");
262 static void cmsis_dap_usb_close(struct cmsis_dap
*dap
)
264 hid_close(dap
->dev_handle
);
267 if (cmsis_dap_handle
->packet_buffer
)
268 free(cmsis_dap_handle
->packet_buffer
);
270 if (cmsis_dap_handle
) {
271 free(cmsis_dap_handle
);
272 cmsis_dap_handle
= NULL
;
278 /* Send a message and receive the reply */
279 static int cmsis_dap_usb_xfer(struct cmsis_dap
*dap
, int txlen
)
281 /* Pad the rest of the TX buffer with 0's */
282 memset(dap
->packet_buffer
+ txlen
, 0, dap
->packet_size
- 1 - txlen
);
284 /* write data to device */
285 int retval
= hid_write(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
);
287 LOG_ERROR("error writing data: %ls", hid_error(dap
->dev_handle
));
292 retval
= hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, USB_TIMEOUT
);
293 if (retval
== -1 || retval
== 0) {
294 LOG_DEBUG("error reading data: %ls", hid_error(dap
->dev_handle
));
301 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins
, uint8_t mask
, uint32_t delay
, uint8_t *input
)
304 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
306 buffer
[0] = 0; /* report number */
307 buffer
[1] = CMD_DAP_SWJ_PINS
;
310 buffer
[4] = delay
& 0xff;
311 buffer
[5] = (delay
>> 8) & 0xff;
312 buffer
[6] = (delay
>> 16) & 0xff;
313 buffer
[7] = (delay
>> 24) & 0xff;
314 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 8);
316 if (retval
!= ERROR_OK
) {
317 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
318 return ERROR_JTAG_DEVICE_ERROR
;
327 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock
)
330 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
332 /* set clock in Hz */
334 buffer
[0] = 0; /* report number */
335 buffer
[1] = CMD_DAP_SWJ_CLOCK
;
336 buffer
[2] = swj_clock
& 0xff;
337 buffer
[3] = (swj_clock
>> 8) & 0xff;
338 buffer
[4] = (swj_clock
>> 16) & 0xff;
339 buffer
[5] = (swj_clock
>> 24) & 0xff;
340 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 6);
342 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
343 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
344 return ERROR_JTAG_DEVICE_ERROR
;
350 static int cmsis_dap_cmd_DAP_Info(uint8_t info
, uint8_t **data
)
353 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
355 buffer
[0] = 0; /* report number */
356 buffer
[1] = CMD_DAP_INFO
;
358 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
360 if (retval
!= ERROR_OK
) {
361 LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
362 return ERROR_JTAG_DEVICE_ERROR
;
365 *data
= &(buffer
[1]);
370 static int cmsis_dap_cmd_DAP_LED(uint8_t leds
)
373 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
375 buffer
[0] = 0; /* report number */
376 buffer
[1] = CMD_DAP_LED
;
379 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
381 if (retval
!= ERROR_OK
|| buffer
[1] != 0x00) {
382 LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
383 return ERROR_JTAG_DEVICE_ERROR
;
389 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode
)
392 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
394 buffer
[0] = 0; /* report number */
395 buffer
[1] = CMD_DAP_CONNECT
;
397 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
399 if (retval
!= ERROR_OK
) {
400 LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
401 return ERROR_JTAG_DEVICE_ERROR
;
404 if (buffer
[1] != mode
) {
405 LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode
);
406 return ERROR_JTAG_DEVICE_ERROR
;
412 static int cmsis_dap_cmd_DAP_Disconnect(void)
415 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
417 buffer
[0] = 0; /* report number */
418 buffer
[1] = CMD_DAP_DISCONNECT
;
419 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
421 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
422 LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
423 return ERROR_JTAG_DEVICE_ERROR
;
429 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle
, uint16_t delay
, uint16_t retry
)
432 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
434 buffer
[0] = 0; /* report number */
435 buffer
[1] = CMD_DAP_TFER_CONFIGURE
;
437 buffer
[3] = delay
& 0xff;
438 buffer
[4] = (delay
>> 8) & 0xff;
439 buffer
[5] = retry
& 0xff;
440 buffer
[6] = (retry
>> 8) & 0xff;
441 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
443 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
444 LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
445 return ERROR_JTAG_DEVICE_ERROR
;
451 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg
)
454 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
456 buffer
[0] = 0; /* report number */
457 buffer
[1] = CMD_DAP_SWD_CONFIGURE
;
459 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
461 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
462 LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
463 return ERROR_JTAG_DEVICE_ERROR
;
470 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us
)
473 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
475 buffer
[0] = 0; /* report number */
476 buffer
[1] = CMD_DAP_DELAY
;
477 buffer
[2] = delay_us
& 0xff;
478 buffer
[3] = (delay_us
>> 8) & 0xff;
479 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
481 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
482 LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
483 return ERROR_JTAG_DEVICE_ERROR
;
490 static int queued_retval
;
492 static void cmsis_dap_swd_read_reg(struct adiv5_dap
*dap
, uint8_t cmd
, uint32_t *value
)
494 if (queued_retval
!= ERROR_OK
)
497 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
501 DEBUG_IO("CMSIS-DAP: Read Reg 0x%02" PRIx8
, cmd
);
503 buffer
[0] = 0; /* report number */
504 buffer
[1] = CMD_DAP_TFER
;
508 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
510 /* TODO - need better response checking */
511 if (retval
!= ERROR_OK
|| buffer
[1] != 0x01) {
512 LOG_ERROR("CMSIS-DAP: Read Error (0x%02" PRIx8
")", buffer
[2]);
513 queued_retval
= buffer
[2];
517 val
= le_to_h_u32(&buffer
[3]);
518 DEBUG_IO("0x%08" PRIx32
, val
);
523 queued_retval
= retval
;
526 static void cmsis_dap_swd_write_reg(struct adiv5_dap
*dap
, uint8_t cmd
, uint32_t value
)
528 if (queued_retval
!= ERROR_OK
)
531 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
533 DEBUG_IO("CMSIS-DAP: Write Reg 0x%02" PRIx8
" 0x%08" PRIx32
, cmd
, value
);
535 buffer
[0] = 0; /* report number */
536 buffer
[1] = CMD_DAP_TFER
;
540 buffer
[5] = (value
) & 0xff;
541 buffer
[6] = (value
>> 8) & 0xff;
542 buffer
[7] = (value
>> 16) & 0xff;
543 buffer
[8] = (value
>> 24) & 0xff;
544 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 9);
546 if (buffer
[1] != 0x01) {
547 LOG_ERROR("CMSIS-DAP: Write Error (0x%02" PRIx8
")", buffer
[2]);
551 queued_retval
= retval
;
554 static int cmsis_dap_swd_run(struct adiv5_dap
*dap
)
556 int retval
= queued_retval
;
557 queued_retval
= ERROR_OK
;
561 static int cmsis_dap_get_version_info(void)
565 /* INFO_ID_FW_VER - string */
566 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER
, &data
);
567 if (retval
!= ERROR_OK
)
570 if (data
[0]) /* strlen */
571 LOG_INFO("CMSIS-DAP: FW Version = %s", &data
[1]);
576 static int cmsis_dap_get_caps_info(void)
580 /* INFO_ID_CAPS - byte */
581 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS
, &data
);
582 if (retval
!= ERROR_OK
)
586 uint8_t caps
= data
[1];
588 cmsis_dap_handle
->caps
= caps
;
590 if (caps
& INFO_CAPS_SWD
)
591 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[0]);
592 if (caps
& INFO_CAPS_JTAG
)
593 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[1]);
599 static int cmsis_dap_get_status(void)
603 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d
);
605 if (retval
== ERROR_OK
) {
606 LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
607 (d
& (0x01 << 0)) ? 1 : 0, /* Bit 0: SWCLK/TCK */
608 (d
& (0x01 << 1)) ? 1 : 0, /* Bit 1: SWDIO/TMS */
609 (d
& (0x01 << 2)) ? 1 : 0, /* Bit 2: TDI */
610 (d
& (0x01 << 3)) ? 1 : 0, /* Bit 3: TDO */
611 (d
& (0x01 << 5)) ? 1 : 0, /* Bit 5: nTRST */
612 (d
& (0x01 << 7)) ? 1 : 0); /* Bit 7: nRESET */
618 static int cmsis_dap_reset_link(void)
620 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
622 LOG_DEBUG("CMSIS-DAP: cmsis_dap_reset_link");
623 LOG_INFO("DAP_SWJ Sequence (reset: 50+ '1' followed by 0)");
625 /* reset line with SWDIO high for >50 cycles */
626 buffer
[0] = 0; /* report number */
627 buffer
[1] = CMD_DAP_SWJ_SEQ
;
636 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 10);
638 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
641 /* 16bit JTAG-SWD sequence */
642 buffer
[0] = 0; /* report number */
643 buffer
[1] = CMD_DAP_SWJ_SEQ
;
647 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
649 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
652 /* another reset just incase */
653 buffer
[0] = 0; /* report number */
654 buffer
[1] = CMD_DAP_SWJ_SEQ
;
663 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 10);
665 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
668 /* 16 cycle idle period */
669 buffer
[0] = 0; /* report number */
670 buffer
[1] = CMD_DAP_SWJ_SEQ
;
674 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
676 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
679 DEBUG_IO("DAP Read IDCODE");
681 /* read the id code is always the next sequence */
682 buffer
[0] = 0; /* report number */
683 buffer
[1] = CMD_DAP_TFER
;
687 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
689 if (retval
!= ERROR_OK
)
692 if (buffer
[1] == 0) {
693 LOG_DEBUG("Result 0x%02" PRIx8
" 0x%02" PRIx8
, buffer
[1], buffer
[2]);
695 LOG_DEBUG("DAP Reset Target");
696 buffer
[0] = 0; /* report number */
697 buffer
[1] = CMD_DAP_RESET_TARGET
;
698 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
699 LOG_DEBUG("Result 0x%02" PRIx8
" 0x%02" PRIx8
, buffer
[1], buffer
[2]);
701 LOG_DEBUG("DAP Write Abort");
702 buffer
[0] = 0; /* report number */
703 buffer
[1] = CMD_DAP_WRITE_ABORT
;
705 buffer
[3] = 0x1e/*0x1f*/;
709 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
710 LOG_DEBUG("Result 0x%02" PRIx8
, buffer
[1]);
712 return 0x80 + buffer
[1];
715 LOG_DEBUG("DAP Write Abort");
716 buffer
[0] = 0; /* report number */
717 buffer
[1] = CMD_DAP_WRITE_ABORT
;
723 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
724 LOG_DEBUG("Result 0x%02" PRIx8
, buffer
[1]);
729 static int cmsis_dap_swd_open(void)
733 DEBUG_IO("CMSIS-DAP: cmsis_dap_swd_open");
735 if (cmsis_dap_handle
== NULL
) {
738 retval
= cmsis_dap_usb_open();
739 if (retval
!= ERROR_OK
)
742 retval
= cmsis_dap_get_caps_info();
743 if (retval
!= ERROR_OK
)
747 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_SWD
)) {
748 LOG_ERROR("CMSIS-DAP: SWD not supported");
749 return ERROR_JTAG_DEVICE_ERROR
;
752 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
753 if (retval
!= ERROR_OK
)
756 /* Add more setup here.??... */
758 LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
762 static int cmsis_dap_init(void)
768 retval
= cmsis_dap_swd_open();
769 if (retval
!= ERROR_OK
)
773 if (cmsis_dap_handle
== NULL
) {
776 retval
= cmsis_dap_usb_open();
777 if (retval
!= ERROR_OK
)
780 retval
= cmsis_dap_get_caps_info();
781 if (retval
!= ERROR_OK
)
784 /* Connect in JTAG mode */
785 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_JTAG
)) {
786 LOG_ERROR("CMSIS-DAP: JTAG not supported");
787 return ERROR_JTAG_DEVICE_ERROR
;
790 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_JTAG
);
791 if (retval
!= ERROR_OK
)
794 LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
797 retval
= cmsis_dap_get_version_info();
798 if (retval
!= ERROR_OK
)
801 /* INFO_ID_PKT_SZ - short */
802 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ
, &data
);
803 if (retval
!= ERROR_OK
)
806 if (data
[0] == 2) { /* short */
807 uint16_t pkt_sz
= data
[1] + (data
[2] << 8);
809 if (cmsis_dap_handle
->packet_size
!= pkt_sz
+ 1) {
810 /* reallocate buffer */
811 cmsis_dap_handle
->packet_size
= pkt_sz
+ 1;
812 cmsis_dap_handle
->packet_buffer
= realloc(cmsis_dap_handle
->packet_buffer
,
813 cmsis_dap_handle
->packet_size
);
814 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
815 LOG_ERROR("unable to reallocate memory");
820 LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16
, pkt_sz
);
823 /* INFO_ID_PKT_CNT - byte */
824 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT
, &data
);
825 if (retval
!= ERROR_OK
)
828 if (data
[0] == 1) { /* byte */
829 uint16_t pkt_cnt
= data
[1];
830 cmsis_dap_handle
->packet_count
= pkt_cnt
;
831 LOG_DEBUG("CMSIS-DAP: Packet Count = %" PRId16
, pkt_cnt
);
834 retval
= cmsis_dap_get_status();
835 if (retval
!= ERROR_OK
)
838 /* Now try to connect to the target
839 * TODO: This is all SWD only @ present */
840 retval
= cmsis_dap_cmd_DAP_SWJ_Clock(100); /* 100kHz */
841 if (retval
!= ERROR_OK
)
844 retval
= cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
845 if (retval
!= ERROR_OK
)
847 retval
= cmsis_dap_cmd_DAP_SWD_Configure(0x00);
848 if (retval
!= ERROR_OK
)
851 retval
= cmsis_dap_cmd_DAP_LED(0x03); /* Both LEDs on */
852 if (retval
!= ERROR_OK
)
855 /* support connecting with srst asserted */
856 enum reset_types jtag_reset_config
= jtag_get_reset_config();
858 if (jtag_reset_config
& RESET_CNCT_UNDER_SRST
) {
859 if (jtag_reset_config
& RESET_SRST_NO_GATING
) {
860 retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL
);
861 if (retval
!= ERROR_OK
)
863 LOG_INFO("Connecting under reset");
867 retval
= cmsis_dap_reset_link();
868 if (retval
!= ERROR_OK
)
871 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
873 LOG_INFO("CMSIS-DAP: Interface ready");
878 static int cmsis_dap_swd_init(void)
884 static int cmsis_dap_quit(void)
886 cmsis_dap_cmd_DAP_Disconnect();
887 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
889 cmsis_dap_usb_close(cmsis_dap_handle
);
894 static void cmsis_dap_execute_reset(struct jtag_command
*cmd
)
896 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(cmd
->cmd
.reset
->srst
? 0 : (1 << 7), \
898 if (retval
!= ERROR_OK
)
899 LOG_ERROR("CMSIS-DAP: Interface reset failed");
902 static void cmsis_dap_execute_sleep(struct jtag_command
*cmd
)
905 int retval
= cmsis_dap_cmd_DAP_Delay(cmd
->cmd
.sleep
->us
);
906 if (retval
!= ERROR_OK
)
908 jtag_sleep(cmd
->cmd
.sleep
->us
);
911 static void cmsis_dap_execute_command(struct jtag_command
*cmd
)
915 cmsis_dap_execute_reset(cmd
);
918 cmsis_dap_execute_sleep(cmd
);
921 LOG_ERROR("BUG: unknown JTAG command type encountered");
926 static int cmsis_dap_execute_queue(void)
928 struct jtag_command
*cmd
= jtag_command_queue
;
930 while (cmd
!= NULL
) {
931 cmsis_dap_execute_command(cmd
);
938 static int cmsis_dap_speed(int speed
)
940 if (speed
> DAP_MAX_CLOCK
) {
941 LOG_INFO("reduce speed request: %dkHz to %dkHz maximum", speed
, DAP_MAX_CLOCK
);
942 speed
= DAP_MAX_CLOCK
;
946 LOG_INFO("RTCK not supported");
947 return ERROR_JTAG_NOT_IMPLEMENTED
;
950 return cmsis_dap_cmd_DAP_SWJ_Clock(speed
);
953 static int cmsis_dap_speed_div(int speed
, int *khz
)
959 static int cmsis_dap_khz(int khz
, int *jtag_speed
)
965 COMMAND_HANDLER(cmsis_dap_handle_info_command
)
967 if (cmsis_dap_get_version_info() == ERROR_OK
)
968 cmsis_dap_get_status();
973 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command
)
975 if (CMD_ARGC
> MAX_USB_IDS
* 2) {
976 LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
977 "(maximum is %d pairs)", MAX_USB_IDS
);
978 CMD_ARGC
= MAX_USB_IDS
* 2;
980 if (CMD_ARGC
< 2 || (CMD_ARGC
& 1)) {
981 LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
983 return ERROR_COMMAND_SYNTAX_ERROR
;
984 /* remove the incomplete trailing id */
989 for (i
= 0; i
< CMD_ARGC
; i
+= 2) {
990 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
], cmsis_dap_vid
[i
>> 1]);
991 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
+ 1], cmsis_dap_pid
[i
>> 1]);
995 * Explicitly terminate, in case there are multiples instances of
998 cmsis_dap_vid
[i
>> 1] = cmsis_dap_pid
[i
>> 1] = 0;
1003 static const struct command_registration cmsis_dap_subcommand_handlers
[] = {
1006 .handler
= &cmsis_dap_handle_info_command
,
1007 .mode
= COMMAND_EXEC
,
1009 .help
= "show cmsis-dap info",
1011 COMMAND_REGISTRATION_DONE
1014 static const struct command_registration cmsis_dap_command_handlers
[] = {
1016 .name
= "cmsis-dap",
1017 .mode
= COMMAND_ANY
,
1018 .help
= "perform CMSIS-DAP management",
1020 .chain
= cmsis_dap_subcommand_handlers
,
1023 .name
= "cmsis_dap_vid_pid",
1024 .handler
= &cmsis_dap_handle_vid_pid_command
,
1025 .mode
= COMMAND_CONFIG
,
1026 .help
= "the vendor ID and product ID of the CMSIS-DAP device",
1027 .usage
= "(vid pid)* ",
1029 COMMAND_REGISTRATION_DONE
1032 static const struct swd_driver cmsis_dap_swd_driver
= {
1033 .init
= cmsis_dap_swd_init
,
1034 .read_reg
= cmsis_dap_swd_read_reg
,
1035 .write_reg
= cmsis_dap_swd_write_reg
,
1036 .run
= cmsis_dap_swd_run
,
1039 const char *cmsis_dap_transport
[] = {"cmsis-dap", NULL
};
1041 struct jtag_interface cmsis_dap_interface
= {
1042 .name
= "cmsis-dap",
1043 .commands
= cmsis_dap_command_handlers
,
1044 .swd
= &cmsis_dap_swd_driver
,
1045 .transports
= cmsis_dap_transport
,
1047 .execute_queue
= cmsis_dap_execute_queue
,
1048 .speed
= cmsis_dap_speed
,
1049 .speed_div
= cmsis_dap_speed_div
,
1050 .khz
= cmsis_dap_khz
,
1051 .init
= cmsis_dap_init
,
1052 .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)