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 };
64 #define PACKET_SIZE (64 + 1) /* 64 bytes plus report id */
65 #define USB_TIMEOUT 1000
67 /* CMSIS-DAP General Commands */
68 #define CMD_DAP_INFO 0x00
69 #define CMD_DAP_LED 0x01
70 #define CMD_DAP_CONNECT 0x02
71 #define CMD_DAP_DISCONNECT 0x03
72 #define CMD_DAP_WRITE_ABORT 0x08
73 #define CMD_DAP_DELAY 0x09
74 #define CMD_DAP_RESET_TARGET 0x0A
77 #define INFO_ID_VID 0x00 /* string */
78 #define INFO_ID_PID 0x02 /* string */
79 #define INFO_ID_SERNUM 0x03 /* string */
80 #define INFO_ID_FW_VER 0x04 /* string */
81 #define INFO_ID_TD_VEND 0x05 /* string */
82 #define INFO_ID_TD_NAME 0x06 /* string */
83 #define INFO_ID_CAPS 0xf0 /* byte */
84 #define INFO_ID_PKT_CNT 0xfe /* byte */
85 #define INFO_ID_PKT_SZ 0xff /* short */
87 #define INFO_CAPS_SWD 0x01
88 #define INFO_CAPS_JTAG 0x02
91 #define LED_ID_CONNECT 0x00
92 #define LED_ID_RUN 0x01
98 #define CONNECT_DEFAULT 0x00
99 #define CONNECT_SWD 0x01
100 #define CONNECT_JTAG 0x02
102 /* CMSIS-DAP Common SWD/JTAG Commands */
103 #define CMD_DAP_DELAY 0x09
104 #define CMD_DAP_SWJ_PINS 0x10
105 #define CMD_DAP_SWJ_CLOCK 0x11
106 #define CMD_DAP_SWJ_SEQ 0x12
118 /* CMSIS-DAP SWD Commands */
119 #define CMD_DAP_SWD_CONFIGURE 0x13
121 /* CMSIS-DAP JTAG Commands */
122 #define CMD_DAP_JTAG_SEQ 0x14
123 #define CMD_DAP_JTAG_CONFIGURE 0x15
124 #define CMD_DAP_JTAG_IDCODE 0x16
126 /* CMSIS-DAP Transfer Commands */
127 #define CMD_DAP_TFER_CONFIGURE 0x04
128 #define CMD_DAP_TFER 0x05
129 #define CMD_DAP_TFER_BLOCK 0x06
130 #define CMD_DAP_TFER_ABORT 0x07
132 /* DAP Status Code */
134 #define DAP_ERROR 0xFF
136 /* CMSIS-DAP Vendor Commands
139 static char *info_caps_str
[] = {
144 /* max clock speed (kHz) */
145 #define DAP_MAX_CLOCK 5000
148 hid_device
*dev_handle
;
149 uint16_t packet_size
;
150 uint16_t packet_count
;
151 uint8_t *packet_buffer
;
156 static struct cmsis_dap
*cmsis_dap_handle
;
158 static int cmsis_dap_usb_open(void)
160 hid_device
*dev
= NULL
;
162 struct hid_device_info
*devs
, *cur_dev
;
163 unsigned short target_vid
, target_pid
;
169 The CMSIS-DAP specification stipulates:
170 "The Product String must contain "CMSIS-DAP" somewhere in the string. This is used by the
171 debuggers to idenify a CMSIS-DAP compliant Debug Unit that is connected to a host computer."
173 devs
= hid_enumerate(0x0, 0x0);
175 while (NULL
!= cur_dev
) {
176 if (0 == cmsis_dap_vid
[0]) {
177 if (NULL
== cur_dev
->product_string
) {
178 LOG_DEBUG("Cannot read product string of device 0x%x:0x%x",
179 cur_dev
->vendor_id
, cur_dev
->product_id
);
181 if (wcsstr(cur_dev
->product_string
, L
"CMSIS-DAP"))
183 if the user hasn't specified VID:PID *and*
184 product string contains "CMSIS-DAP", pick it
190 otherwise, exhaustively compare against all VID:PID in list
192 for (i
= 0; cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
]; i
++) {
193 if ((cmsis_dap_vid
[i
] == cur_dev
->vendor_id
) && (cmsis_dap_pid
[i
] == cur_dev
->product_id
))
196 if (cmsis_dap_vid
[i
] || cmsis_dap_pid
[i
])
200 cur_dev
= cur_dev
->next
;
203 if (NULL
!= cur_dev
) {
204 target_vid
= cur_dev
->vendor_id
;
205 target_pid
= cur_dev
->product_id
;
208 hid_free_enumeration(devs
);
210 if (hid_init() != 0) {
211 LOG_ERROR("unable to open HIDAPI");
215 dev
= hid_open(target_vid
, target_pid
, NULL
);
218 LOG_ERROR("unable to open CMSIS-DAP device");
222 struct cmsis_dap
*dap
= malloc(sizeof(struct cmsis_dap
));
224 LOG_ERROR("unable to allocate memory");
228 dap
->dev_handle
= dev
;
232 cmsis_dap_handle
= dap
;
234 /* allocate default packet buffer, may be changed later.
235 * currently with HIDAPI we have no way of getting the output report length
236 * without this info we cannot communicate with the adapter.
237 * For the moment we ahve to hard code the packet size */
239 int packet_size
= PACKET_SIZE
;
241 /* atmel cmsis-dap uses 512 byte reports */
242 if (target_vid
== 0x03eb)
243 packet_size
= 512 + 1;
245 cmsis_dap_handle
->packet_buffer
= malloc(packet_size
);
246 cmsis_dap_handle
->packet_size
= packet_size
;
248 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
249 LOG_ERROR("unable to allocate memory");
256 static void cmsis_dap_usb_close(struct cmsis_dap
*dap
)
258 hid_close(dap
->dev_handle
);
261 if (cmsis_dap_handle
->packet_buffer
)
262 free(cmsis_dap_handle
->packet_buffer
);
264 if (cmsis_dap_handle
) {
265 free(cmsis_dap_handle
);
266 cmsis_dap_handle
= NULL
;
272 /* Send a message and receive the reply */
273 static int cmsis_dap_usb_xfer(struct cmsis_dap
*dap
, int txlen
)
275 /* Pad the rest of the TX buffer with 0's */
276 memset(dap
->packet_buffer
+ txlen
, 0, dap
->packet_size
- 1 - txlen
);
278 /* write data to device */
279 int retval
= hid_write(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
);
281 LOG_ERROR("error writing data: %ls", hid_error(dap
->dev_handle
));
286 retval
= hid_read_timeout(dap
->dev_handle
, dap
->packet_buffer
, dap
->packet_size
, USB_TIMEOUT
);
287 if (retval
== -1 || retval
== 0) {
288 LOG_DEBUG("error reading data: %ls", hid_error(dap
->dev_handle
));
295 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins
, uint8_t mask
, uint32_t delay
, uint8_t *input
)
298 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
300 buffer
[0] = 0; /* report number */
301 buffer
[1] = CMD_DAP_SWJ_PINS
;
304 buffer
[4] = delay
& 0xff;
305 buffer
[5] = (delay
>> 8) & 0xff;
306 buffer
[6] = (delay
>> 16) & 0xff;
307 buffer
[7] = (delay
>> 24) & 0xff;
308 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 8);
310 if (retval
!= ERROR_OK
) {
311 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
312 return ERROR_JTAG_DEVICE_ERROR
;
321 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock
)
324 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
326 /* set clock in Hz */
328 buffer
[0] = 0; /* report number */
329 buffer
[1] = CMD_DAP_SWJ_CLOCK
;
330 buffer
[2] = swj_clock
& 0xff;
331 buffer
[3] = (swj_clock
>> 8) & 0xff;
332 buffer
[4] = (swj_clock
>> 16) & 0xff;
333 buffer
[5] = (swj_clock
>> 24) & 0xff;
334 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 6);
336 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
337 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
338 return ERROR_JTAG_DEVICE_ERROR
;
344 static int cmsis_dap_cmd_DAP_Info(uint8_t info
, uint8_t **data
)
347 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
349 buffer
[0] = 0; /* report number */
350 buffer
[1] = CMD_DAP_INFO
;
352 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
354 if (retval
!= ERROR_OK
) {
355 LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
356 return ERROR_JTAG_DEVICE_ERROR
;
359 *data
= &(buffer
[1]);
364 static int cmsis_dap_cmd_DAP_LED(uint8_t leds
)
367 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
369 buffer
[0] = 0; /* report number */
370 buffer
[1] = CMD_DAP_LED
;
373 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
375 if (retval
!= ERROR_OK
|| buffer
[1] != 0x00) {
376 LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
377 return ERROR_JTAG_DEVICE_ERROR
;
383 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode
)
386 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
388 buffer
[0] = 0; /* report number */
389 buffer
[1] = CMD_DAP_CONNECT
;
391 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
393 if (retval
!= ERROR_OK
) {
394 LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
395 return ERROR_JTAG_DEVICE_ERROR
;
398 if (buffer
[1] != mode
) {
399 LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode
);
400 return ERROR_JTAG_DEVICE_ERROR
;
406 static int cmsis_dap_cmd_DAP_Disconnect(void)
409 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
411 buffer
[0] = 0; /* report number */
412 buffer
[1] = CMD_DAP_DISCONNECT
;
413 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
415 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
416 LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
417 return ERROR_JTAG_DEVICE_ERROR
;
423 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle
, uint16_t delay
, uint16_t retry
)
426 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
428 buffer
[0] = 0; /* report number */
429 buffer
[1] = CMD_DAP_TFER_CONFIGURE
;
431 buffer
[3] = delay
& 0xff;
432 buffer
[4] = (delay
>> 8) & 0xff;
433 buffer
[5] = retry
& 0xff;
434 buffer
[6] = (retry
>> 8) & 0xff;
435 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
437 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
438 LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
439 return ERROR_JTAG_DEVICE_ERROR
;
445 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg
)
448 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
450 buffer
[0] = 0; /* report number */
451 buffer
[1] = CMD_DAP_SWD_CONFIGURE
;
453 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 3);
455 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
456 LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
457 return ERROR_JTAG_DEVICE_ERROR
;
464 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us
)
467 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
469 buffer
[0] = 0; /* report number */
470 buffer
[1] = CMD_DAP_DELAY
;
471 buffer
[2] = delay_us
& 0xff;
472 buffer
[3] = (delay_us
>> 8) & 0xff;
473 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 4);
475 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
) {
476 LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
477 return ERROR_JTAG_DEVICE_ERROR
;
484 static int queued_retval
;
486 static void cmsis_dap_swd_read_reg(struct adiv5_dap
*dap
, uint8_t cmd
, uint32_t *value
)
488 if (queued_retval
!= ERROR_OK
)
491 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
495 DEBUG_IO("CMSIS-DAP: Read Reg 0x%02" PRIx8
, cmd
);
497 buffer
[0] = 0; /* report number */
498 buffer
[1] = CMD_DAP_TFER
;
502 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
504 /* TODO - need better response checking */
505 if (retval
!= ERROR_OK
|| buffer
[1] != 0x01) {
506 LOG_ERROR("CMSIS-DAP: Read Error (0x%02" PRIx8
")", buffer
[2]);
507 queued_retval
= buffer
[2];
511 val
= le_to_h_u32(&buffer
[3]);
512 DEBUG_IO("0x%08" PRIx32
, val
);
517 queued_retval
= retval
;
520 static void cmsis_dap_swd_write_reg(struct adiv5_dap
*dap
, uint8_t cmd
, uint32_t value
)
522 if (queued_retval
!= ERROR_OK
)
525 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
527 DEBUG_IO("CMSIS-DAP: Write Reg 0x%02" PRIx8
" 0x%08" PRIx32
, cmd
, value
);
529 buffer
[0] = 0; /* report number */
530 buffer
[1] = CMD_DAP_TFER
;
534 buffer
[5] = (value
) & 0xff;
535 buffer
[6] = (value
>> 8) & 0xff;
536 buffer
[7] = (value
>> 16) & 0xff;
537 buffer
[8] = (value
>> 24) & 0xff;
538 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 9);
540 if (buffer
[1] != 0x01) {
541 LOG_ERROR("CMSIS-DAP: Write Error (0x%02" PRIx8
")", buffer
[2]);
545 queued_retval
= retval
;
548 static int cmsis_dap_swd_run(struct adiv5_dap
*dap
)
550 int retval
= queued_retval
;
551 queued_retval
= ERROR_OK
;
555 static int cmsis_dap_get_version_info(void)
559 /* INFO_ID_FW_VER - string */
560 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER
, &data
);
561 if (retval
!= ERROR_OK
)
564 if (data
[0]) /* strlen */
565 LOG_INFO("CMSIS-DAP: FW Version = %s", &data
[1]);
570 static int cmsis_dap_get_caps_info(void)
574 /* INFO_ID_CAPS - byte */
575 int retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS
, &data
);
576 if (retval
!= ERROR_OK
)
580 uint8_t caps
= data
[1];
582 cmsis_dap_handle
->caps
= caps
;
584 if (caps
& INFO_CAPS_SWD
)
585 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[0]);
586 if (caps
& INFO_CAPS_JTAG
)
587 LOG_INFO("CMSIS-DAP: %s", info_caps_str
[1]);
593 static int cmsis_dap_get_status(void)
597 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d
);
599 if (retval
== ERROR_OK
) {
600 LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
601 (d
& (0x01 << 0)) ? 1 : 0, /* Bit 0: SWCLK/TCK */
602 (d
& (0x01 << 1)) ? 1 : 0, /* Bit 1: SWDIO/TMS */
603 (d
& (0x01 << 2)) ? 1 : 0, /* Bit 2: TDI */
604 (d
& (0x01 << 3)) ? 1 : 0, /* Bit 3: TDO */
605 (d
& (0x01 << 5)) ? 1 : 0, /* Bit 5: nTRST */
606 (d
& (0x01 << 7)) ? 1 : 0); /* Bit 7: nRESET */
612 static int cmsis_dap_reset_link(void)
614 uint8_t *buffer
= cmsis_dap_handle
->packet_buffer
;
616 LOG_DEBUG("CMSIS-DAP: cmsis_dap_reset_link");
617 LOG_INFO("DAP_SWJ Sequence (reset: 50+ '1' followed by 0)");
619 /* reset line with SWDIO high for >50 cycles */
620 buffer
[0] = 0; /* report number */
621 buffer
[1] = CMD_DAP_SWJ_SEQ
;
630 int retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 10);
632 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
635 /* 16bit JTAG-SWD sequence */
636 buffer
[0] = 0; /* report number */
637 buffer
[1] = CMD_DAP_SWJ_SEQ
;
641 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
643 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
646 /* another reset just incase */
647 buffer
[0] = 0; /* report number */
648 buffer
[1] = CMD_DAP_SWJ_SEQ
;
657 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 10);
659 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
662 /* 16 cycle idle period */
663 buffer
[0] = 0; /* report number */
664 buffer
[1] = CMD_DAP_SWJ_SEQ
;
668 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
670 if (retval
!= ERROR_OK
|| buffer
[1] != DAP_OK
)
673 DEBUG_IO("DAP Read IDCODE");
675 /* read the id code is always the next sequence */
676 buffer
[0] = 0; /* report number */
677 buffer
[1] = CMD_DAP_TFER
;
681 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 5);
683 if (retval
!= ERROR_OK
)
686 if (buffer
[1] == 0) {
687 LOG_DEBUG("Result 0x%02" PRIx8
" 0x%02" PRIx8
, buffer
[1], buffer
[2]);
689 LOG_DEBUG("DAP Reset Target");
690 buffer
[0] = 0; /* report number */
691 buffer
[1] = CMD_DAP_RESET_TARGET
;
692 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 2);
693 LOG_DEBUG("Result 0x%02" PRIx8
" 0x%02" PRIx8
, buffer
[1], buffer
[2]);
695 LOG_DEBUG("DAP Write Abort");
696 buffer
[0] = 0; /* report number */
697 buffer
[1] = CMD_DAP_WRITE_ABORT
;
699 buffer
[3] = 0x1e/*0x1f*/;
703 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
704 LOG_DEBUG("Result 0x%02" PRIx8
, buffer
[1]);
706 return 0x80 + buffer
[1];
709 LOG_DEBUG("DAP Write Abort");
710 buffer
[0] = 0; /* report number */
711 buffer
[1] = CMD_DAP_WRITE_ABORT
;
717 retval
= cmsis_dap_usb_xfer(cmsis_dap_handle
, 7);
718 LOG_DEBUG("Result 0x%02" PRIx8
, buffer
[1]);
723 static int cmsis_dap_init(void)
728 if (cmsis_dap_handle
== NULL
) {
731 retval
= cmsis_dap_usb_open();
732 if (retval
!= ERROR_OK
)
735 retval
= cmsis_dap_get_caps_info();
736 if (retval
!= ERROR_OK
)
739 /* Connect in JTAG mode */
740 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_JTAG
)) {
741 LOG_ERROR("CMSIS-DAP: JTAG not supported");
742 return ERROR_JTAG_DEVICE_ERROR
;
745 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_JTAG
);
746 if (retval
!= ERROR_OK
)
749 LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
752 retval
= cmsis_dap_get_version_info();
753 if (retval
!= ERROR_OK
)
756 /* INFO_ID_PKT_SZ - short */
757 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ
, &data
);
758 if (retval
!= ERROR_OK
)
761 if (data
[0] == 2) { /* short */
762 uint16_t pkt_sz
= data
[1] + (data
[2] << 8);
764 if (cmsis_dap_handle
->packet_size
!= pkt_sz
+ 1) {
765 /* reallocate buffer */
766 cmsis_dap_handle
->packet_size
= pkt_sz
+ 1;
767 cmsis_dap_handle
->packet_buffer
= realloc(cmsis_dap_handle
->packet_buffer
,
768 cmsis_dap_handle
->packet_size
);
769 if (cmsis_dap_handle
->packet_buffer
== NULL
) {
770 LOG_ERROR("unable to reallocate memory");
775 LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16
, pkt_sz
);
778 /* INFO_ID_PKT_CNT - byte */
779 retval
= cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT
, &data
);
780 if (retval
!= ERROR_OK
)
783 if (data
[0] == 1) { /* byte */
784 uint16_t pkt_cnt
= data
[1];
785 cmsis_dap_handle
->packet_count
= pkt_cnt
;
786 LOG_DEBUG("CMSIS-DAP: Packet Count = %" PRId16
, pkt_cnt
);
789 retval
= cmsis_dap_get_status();
790 if (retval
!= ERROR_OK
)
793 /* Now try to connect to the target
794 * TODO: This is all SWD only @ present */
795 retval
= cmsis_dap_cmd_DAP_SWJ_Clock(100); /* 100kHz */
796 if (retval
!= ERROR_OK
)
799 retval
= cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
800 if (retval
!= ERROR_OK
)
802 retval
= cmsis_dap_cmd_DAP_SWD_Configure(0x00);
803 if (retval
!= ERROR_OK
)
806 retval
= cmsis_dap_cmd_DAP_LED(0x03); /* Both LEDs on */
807 if (retval
!= ERROR_OK
)
810 /* support connecting with srst asserted */
811 enum reset_types jtag_reset_config
= jtag_get_reset_config();
813 if (jtag_reset_config
& RESET_CNCT_UNDER_SRST
) {
814 if (jtag_reset_config
& RESET_SRST_NO_GATING
) {
815 retval
= cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL
);
816 if (retval
!= ERROR_OK
)
818 LOG_INFO("Connecting under reset");
822 retval
= cmsis_dap_reset_link();
823 if (retval
!= ERROR_OK
)
826 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
828 LOG_INFO("CMSIS-DAP: Interface ready");
833 static int cmsis_dap_swd_init(void)
837 DEBUG_IO("CMSIS-DAP: cmsis_dap_swd_init");
839 if (cmsis_dap_handle
== NULL
) {
842 retval
= cmsis_dap_usb_open();
843 if (retval
!= ERROR_OK
)
846 retval
= cmsis_dap_get_caps_info();
847 if (retval
!= ERROR_OK
)
851 if (!(cmsis_dap_handle
->caps
& INFO_CAPS_SWD
)) {
852 LOG_ERROR("CMSIS-DAP: SWD not supported");
853 return ERROR_JTAG_DEVICE_ERROR
;
856 retval
= cmsis_dap_cmd_DAP_Connect(CONNECT_SWD
);
857 if (retval
!= ERROR_OK
)
860 /* Add more setup here.??... */
862 LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
866 static int cmsis_dap_quit(void)
868 cmsis_dap_cmd_DAP_Disconnect();
869 cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
871 cmsis_dap_usb_close(cmsis_dap_handle
);
876 static void cmsis_dap_execute_reset(struct jtag_command
*cmd
)
878 int retval
= cmsis_dap_cmd_DAP_SWJ_Pins(cmd
->cmd
.reset
->srst
? 0 : (1 << 7), \
880 if (retval
!= ERROR_OK
)
881 LOG_ERROR("CMSIS-DAP: Interface reset failed");
884 static void cmsis_dap_execute_sleep(struct jtag_command
*cmd
)
887 int retval
= cmsis_dap_cmd_DAP_Delay(cmd
->cmd
.sleep
->us
);
888 if (retval
!= ERROR_OK
)
890 jtag_sleep(cmd
->cmd
.sleep
->us
);
893 static void cmsis_dap_execute_command(struct jtag_command
*cmd
)
897 cmsis_dap_execute_reset(cmd
);
900 cmsis_dap_execute_sleep(cmd
);
903 LOG_ERROR("BUG: unknown JTAG command type encountered");
908 static int cmsis_dap_execute_queue(void)
910 struct jtag_command
*cmd
= jtag_command_queue
;
912 while (cmd
!= NULL
) {
913 cmsis_dap_execute_command(cmd
);
920 static int cmsis_dap_speed(int speed
)
922 if (speed
> DAP_MAX_CLOCK
) {
923 LOG_INFO("reduce speed request: %dkHz to %dkHz maximum", speed
, DAP_MAX_CLOCK
);
924 speed
= DAP_MAX_CLOCK
;
928 LOG_INFO("RTCK not supported");
929 return ERROR_JTAG_NOT_IMPLEMENTED
;
932 return cmsis_dap_cmd_DAP_SWJ_Clock(speed
);
935 static int cmsis_dap_speed_div(int speed
, int *khz
)
941 static int cmsis_dap_khz(int khz
, int *jtag_speed
)
947 COMMAND_HANDLER(cmsis_dap_handle_info_command
)
949 if (cmsis_dap_get_version_info() == ERROR_OK
)
950 cmsis_dap_get_status();
955 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command
)
957 if (CMD_ARGC
> MAX_USB_IDS
* 2) {
958 LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
959 "(maximum is %d pairs)", MAX_USB_IDS
);
960 CMD_ARGC
= MAX_USB_IDS
* 2;
962 if (CMD_ARGC
< 2 || (CMD_ARGC
& 1)) {
963 LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
965 return ERROR_COMMAND_SYNTAX_ERROR
;
966 /* remove the incomplete trailing id */
971 for (i
= 0; i
< CMD_ARGC
; i
+= 2) {
972 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
], cmsis_dap_vid
[i
>> 1]);
973 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[i
+ 1], cmsis_dap_pid
[i
>> 1]);
977 * Explicitly terminate, in case there are multiples instances of
980 cmsis_dap_vid
[i
>> 1] = cmsis_dap_pid
[i
>> 1] = 0;
985 static const struct command_registration cmsis_dap_subcommand_handlers
[] = {
988 .handler
= &cmsis_dap_handle_info_command
,
989 .mode
= COMMAND_EXEC
,
991 .help
= "show cmsis-dap info",
993 COMMAND_REGISTRATION_DONE
996 static const struct command_registration cmsis_dap_command_handlers
[] = {
1000 .help
= "perform CMSIS-DAP management",
1002 .chain
= cmsis_dap_subcommand_handlers
,
1005 .name
= "cmsis_dap_vid_pid",
1006 .handler
= &cmsis_dap_handle_vid_pid_command
,
1007 .mode
= COMMAND_CONFIG
,
1008 .help
= "the vendor ID and product ID of the CMSIS-DAP device",
1009 .usage
= "(vid pid)* ",
1011 COMMAND_REGISTRATION_DONE
1014 static const struct swd_driver cmsis_dap_swd_driver
= {
1015 .init
= cmsis_dap_swd_init
,
1016 .read_reg
= cmsis_dap_swd_read_reg
,
1017 .write_reg
= cmsis_dap_swd_write_reg
,
1018 .run
= cmsis_dap_swd_run
,
1021 const char *cmsis_dap_transport
[] = {"cmsis-dap", NULL
};
1023 struct jtag_interface cmsis_dap_interface
= {
1024 .name
= "cmsis-dap",
1025 .commands
= cmsis_dap_command_handlers
,
1026 .swd
= &cmsis_dap_swd_driver
,
1027 .transports
= cmsis_dap_transport
,
1029 .execute_queue
= cmsis_dap_execute_queue
,
1030 .speed
= cmsis_dap_speed
,
1031 .speed_div
= cmsis_dap_speed_div
,
1032 .khz
= cmsis_dap_khz
,
1033 .init
= cmsis_dap_init
,
1034 .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)