swd: Remove support for turnaround periods other than 1
[fw/openocd] / src / jtag / drivers / cmsis_dap_usb.c
1 /***************************************************************************
2  *   Copyright (C) 2013 by mike brown                                      *
3  *   mike@theshedworks.org.uk                                              *
4  *                                                                         *
5  *   Copyright (C) 2013 by Spencer Oliver                                  *
6  *   spen@spen-soft.co.uk                                                  *
7  *                                                                         *
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.                                   *
12  *                                                                         *
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.                          *
17  *                                                                         *
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  ***************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include <transport/transport.h>
29 #include <jtag/swd.h>
30 #include <jtag/interface.h>
31 #include <jtag/commands.h>
32 #include <jtag/tcl.h>
33
34 #include <hidapi.h>
35
36 #ifdef _DEBUG_JTAG_IO_
37  #define DEBUG_IO(expr...) LOG_DEBUG(expr)
38 #else
39  #define DEBUG_IO(expr...) do {} while (0)
40 #endif
41
42 /*
43  * See CMSIS-DAP documentation:
44  * Version 0.01 - Beta.
45  */
46
47 /* USB Config */
48
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
54  *
55  * VID 0x0d28: mbed Software
56  * PID 0x0204: MBED CMSIS-DAP
57  */
58
59 #define MAX_USB_IDS 8
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 };
63
64 #define PACKET_SIZE       (64 + 1)      /* 64 bytes plus report id */
65 #define USB_TIMEOUT       1000
66
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
75
76 /* CMD_INFO */
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 */
86
87 #define INFO_CAPS_SWD             0x01
88 #define INFO_CAPS_JTAG            0x02
89
90 /* CMD_LED */
91 #define LED_ID_CONNECT            0x00
92 #define LED_ID_RUN                0x01
93
94 #define LED_OFF                   0x00
95 #define LED_ON                    0x01
96
97 /* CMD_CONNECT */
98 #define CONNECT_DEFAULT           0x00
99 #define CONNECT_SWD               0x01
100 #define CONNECT_JTAG              0x02
101
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
107
108 /*
109  * PINS
110  * Bit 0: SWCLK/TCK
111  * Bit 1: SWDIO/TMS
112  * Bit 2: TDI
113  * Bit 3: TDO
114  * Bit 5: nTRST
115  * Bit 7: nRESET
116  */
117
118 /* CMSIS-DAP SWD Commands */
119 #define CMD_DAP_SWD_CONFIGURE     0x13
120
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
125
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
131
132 /* DAP Status Code */
133 #define DAP_OK                    0
134 #define DAP_ERROR                 0xFF
135
136 /* CMSIS-DAP Vendor Commands
137  * None as yet... */
138
139 static char *info_caps_str[] = {
140         "SWD  Supported",
141         "JTAG Supported"
142 };
143
144 /* max clock speed (kHz) */
145 #define DAP_MAX_CLOCK             5000
146
147 struct cmsis_dap {
148         hid_device *dev_handle;
149         uint16_t packet_size;
150         uint16_t packet_count;
151         uint8_t *packet_buffer;
152         uint8_t caps;
153         uint8_t mode;
154 };
155
156 static struct cmsis_dap *cmsis_dap_handle;
157
158 static int cmsis_dap_usb_open(void)
159 {
160         hid_device *dev = NULL;
161         int i;
162         struct hid_device_info *devs, *cur_dev;
163         unsigned short target_vid, target_pid;
164
165         target_vid = 0;
166         target_pid = 0;
167
168         /*
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."
172         */
173         devs = hid_enumerate(0x0, 0x0);
174         cur_dev = devs;
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);
180                         } else {
181                                 if (wcsstr(cur_dev->product_string, L"CMSIS-DAP"))
182                                         /*
183                                         if the user hasn't specified VID:PID *and*
184                                         product string contains "CMSIS-DAP", pick it
185                                         */
186                                         break;
187                         }
188                 } else {
189                         /*
190                         otherwise, exhaustively compare against all VID:PID in list
191                         */
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))
194                                         break;
195                         }
196                 }
197
198                 cur_dev = cur_dev->next;
199         }
200
201         if (NULL != cur_dev) {
202                 target_vid = cur_dev->vendor_id;
203                 target_pid = cur_dev->product_id;
204         }
205
206         hid_free_enumeration(devs);
207
208         if (hid_init() != 0) {
209                 LOG_ERROR("unable to open HIDAPI");
210                 return ERROR_FAIL;
211         }
212
213         dev = hid_open(target_vid, target_pid, NULL);
214
215         if (dev == NULL) {
216                 LOG_ERROR("unable to open CMSIS-DAP device");
217                 return ERROR_FAIL;
218         }
219
220         struct cmsis_dap *dap = malloc(sizeof(struct cmsis_dap));
221         if (dap == NULL) {
222                 LOG_ERROR("unable to allocate memory");
223                 return ERROR_FAIL;
224         }
225
226         dap->dev_handle = dev;
227         dap->caps = 0;
228         dap->mode = 0;
229
230         cmsis_dap_handle = dap;
231
232         /* allocate default packet buffer, may be changed later.
233          * currently with HIDAPI we have no way of getting the output report length
234          * without this info we cannot communicate with the adapter.
235          * For the moment we ahve to hard code the packet size */
236
237         int packet_size = PACKET_SIZE;
238
239         /* atmel cmsis-dap uses 512 byte reports */
240         if (target_vid == 0x03eb)
241                 packet_size = 512 + 1;
242
243         cmsis_dap_handle->packet_buffer = malloc(packet_size);
244         cmsis_dap_handle->packet_size = packet_size;
245
246         if (cmsis_dap_handle->packet_buffer == NULL) {
247                 LOG_ERROR("unable to allocate memory");
248                 return ERROR_FAIL;
249         }
250
251         return ERROR_OK;
252 }
253
254 static void cmsis_dap_usb_close(struct cmsis_dap *dap)
255 {
256         hid_close(dap->dev_handle);
257         hid_exit();
258
259         if (cmsis_dap_handle->packet_buffer)
260                 free(cmsis_dap_handle->packet_buffer);
261
262         if (cmsis_dap_handle) {
263                 free(cmsis_dap_handle);
264                 cmsis_dap_handle = NULL;
265         }
266
267         return;
268 }
269
270 /* Send a message and receive the reply */
271 static int cmsis_dap_usb_xfer(struct cmsis_dap *dap, int txlen)
272 {
273         /* Pad the rest of the TX buffer with 0's */
274         memset(dap->packet_buffer + txlen, 0, dap->packet_size - 1 - txlen);
275
276         /* write data to device */
277         int retval = hid_write(dap->dev_handle, dap->packet_buffer, dap->packet_size);
278         if (retval == -1) {
279                 LOG_ERROR("error writing data: %ls", hid_error(dap->dev_handle));
280                 return ERROR_FAIL;
281         }
282
283         /* get reply */
284         retval = hid_read_timeout(dap->dev_handle, dap->packet_buffer, dap->packet_size, USB_TIMEOUT);
285         if (retval == -1 || retval == 0) {
286                 LOG_DEBUG("error reading data: %ls", hid_error(dap->dev_handle));
287                 return ERROR_FAIL;
288         }
289
290         return ERROR_OK;
291 }
292
293 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins, uint8_t mask, uint32_t delay, uint8_t *input)
294 {
295         int retval;
296         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
297
298         buffer[0] = 0;  /* report number */
299         buffer[1] = CMD_DAP_SWJ_PINS;
300         buffer[2] = pins;
301         buffer[3] = mask;
302         buffer[4] = delay & 0xff;
303         buffer[5] = (delay >> 8) & 0xff;
304         buffer[6] = (delay >> 16) & 0xff;
305         buffer[7] = (delay >> 24) & 0xff;
306         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 8);
307
308         if (retval != ERROR_OK) {
309                 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
310                 return ERROR_JTAG_DEVICE_ERROR;
311         }
312
313         if (input)
314                 *input = buffer[1];
315
316         return ERROR_OK;
317 }
318
319 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock)
320 {
321         int retval;
322         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
323
324         /* set clock in Hz */
325         swj_clock *= 1000;
326         buffer[0] = 0;  /* report number */
327         buffer[1] = CMD_DAP_SWJ_CLOCK;
328         buffer[2] = swj_clock & 0xff;
329         buffer[3] = (swj_clock >> 8) & 0xff;
330         buffer[4] = (swj_clock >> 16) & 0xff;
331         buffer[5] = (swj_clock >> 24) & 0xff;
332         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 6);
333
334         if (retval != ERROR_OK || buffer[1] != DAP_OK) {
335                 LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
336                 return ERROR_JTAG_DEVICE_ERROR;
337         }
338
339         return ERROR_OK;
340 }
341
342 static int cmsis_dap_cmd_DAP_Info(uint8_t info, uint8_t **data)
343 {
344         int retval;
345         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
346
347         buffer[0] = 0;  /* report number */
348         buffer[1] = CMD_DAP_INFO;
349         buffer[2] = info;
350         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 3);
351
352         if (retval != ERROR_OK) {
353                 LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
354                 return ERROR_JTAG_DEVICE_ERROR;
355         }
356
357         *data = &(buffer[1]);
358
359         return ERROR_OK;
360 }
361
362 static int cmsis_dap_cmd_DAP_LED(uint8_t leds)
363 {
364         int retval;
365         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
366
367         buffer[0] = 0;  /* report number */
368         buffer[1] = CMD_DAP_LED;
369         buffer[2] = 0x00;
370         buffer[3] = leds;
371         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 4);
372
373         if (retval != ERROR_OK || buffer[1] != 0x00) {
374                 LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
375                 return ERROR_JTAG_DEVICE_ERROR;
376         }
377
378         return ERROR_OK;
379 }
380
381 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode)
382 {
383         int retval;
384         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
385
386         buffer[0] = 0;  /* report number */
387         buffer[1] = CMD_DAP_CONNECT;
388         buffer[2] = mode;
389         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 3);
390
391         if (retval != ERROR_OK) {
392                 LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
393                 return ERROR_JTAG_DEVICE_ERROR;
394         }
395
396         if (buffer[1] != mode) {
397                 LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode);
398                 return ERROR_JTAG_DEVICE_ERROR;
399         }
400
401         return ERROR_OK;
402 }
403
404 static int cmsis_dap_cmd_DAP_Disconnect(void)
405 {
406         int retval;
407         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
408
409         buffer[0] = 0;  /* report number */
410         buffer[1] = CMD_DAP_DISCONNECT;
411         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 2);
412
413         if (retval != ERROR_OK || buffer[1] != DAP_OK) {
414                 LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
415                 return ERROR_JTAG_DEVICE_ERROR;
416         }
417
418         return ERROR_OK;
419 }
420
421 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle, uint16_t delay, uint16_t retry)
422 {
423         int retval;
424         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
425
426         buffer[0] = 0;  /* report number */
427         buffer[1] = CMD_DAP_TFER_CONFIGURE;
428         buffer[2] = idle;
429         buffer[3] = delay & 0xff;
430         buffer[4] = (delay >> 8) & 0xff;
431         buffer[5] = retry & 0xff;
432         buffer[6] = (retry >> 8) & 0xff;
433         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 7);
434
435         if (retval != ERROR_OK || buffer[1] != DAP_OK) {
436                 LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
437                 return ERROR_JTAG_DEVICE_ERROR;
438         }
439
440         return ERROR_OK;
441 }
442
443 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg)
444 {
445         int retval;
446         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
447
448         buffer[0] = 0;  /* report number */
449         buffer[1] = CMD_DAP_SWD_CONFIGURE;
450         buffer[2] = cfg;
451         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 3);
452
453         if (retval != ERROR_OK || buffer[1] != DAP_OK) {
454                 LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
455                 return ERROR_JTAG_DEVICE_ERROR;
456         }
457
458         return ERROR_OK;
459 }
460
461 #if 0
462 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us)
463 {
464         int retval;
465         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
466
467         buffer[0] = 0;  /* report number */
468         buffer[1] = CMD_DAP_DELAY;
469         buffer[2] = delay_us & 0xff;
470         buffer[3] = (delay_us >> 8) & 0xff;
471         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 4);
472
473         if (retval != ERROR_OK || buffer[1] != DAP_OK) {
474                 LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
475                 return ERROR_JTAG_DEVICE_ERROR;
476         }
477
478         return ERROR_OK;
479 }
480 #endif
481
482 static int queued_retval;
483
484 static void cmsis_dap_swd_read_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t *value)
485 {
486         if (queued_retval != ERROR_OK)
487                 return;
488
489         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
490         int retval;
491         uint32_t val;
492
493         DEBUG_IO("CMSIS-DAP: Read  Reg 0x%02" PRIx8, cmd);
494
495         buffer[0] = 0;  /* report number */
496         buffer[1] = CMD_DAP_TFER;
497         buffer[2] = 0x00;
498         buffer[3] = 0x01;
499         buffer[4] = cmd;
500         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 5);
501
502         /* TODO - need better response checking */
503         if (retval != ERROR_OK || buffer[1] != 0x01) {
504                 LOG_ERROR("CMSIS-DAP: Read Error (0x%02" PRIx8 ")", buffer[2]);
505                 queued_retval = buffer[2];
506                 return;
507         }
508
509         val = le_to_h_u32(&buffer[3]);
510         DEBUG_IO("0x%08" PRIx32, val);
511
512         if (value)
513                 *value = val;
514
515         queued_retval = retval;
516 }
517
518 static void cmsis_dap_swd_write_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t value)
519 {
520         if (queued_retval != ERROR_OK)
521                 return;
522
523         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
524
525         DEBUG_IO("CMSIS-DAP: Write Reg 0x%02" PRIx8 " 0x%08" PRIx32, cmd, value);
526
527         buffer[0] = 0;  /* report number */
528         buffer[1] = CMD_DAP_TFER;
529         buffer[2] = 0x00;
530         buffer[3] = 0x01;
531         buffer[4] = cmd;
532         buffer[5] = (value) & 0xff;
533         buffer[6] = (value >> 8) & 0xff;
534         buffer[7] = (value >> 16) & 0xff;
535         buffer[8] = (value >> 24) & 0xff;
536         int retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 9);
537
538         if (buffer[1] != 0x01) {
539                 LOG_ERROR("CMSIS-DAP: Write Error (0x%02" PRIx8 ")", buffer[2]);
540                 retval = buffer[2];
541         }
542
543         queued_retval = retval;
544 }
545
546 static int cmsis_dap_swd_run(struct adiv5_dap *dap)
547 {
548         int retval = queued_retval;
549         queued_retval = ERROR_OK;
550         return retval;
551 }
552
553 static int cmsis_dap_get_version_info(void)
554 {
555         uint8_t *data;
556
557         /* INFO_ID_FW_VER - string */
558         int retval = cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER, &data);
559         if (retval != ERROR_OK)
560                 return retval;
561
562         if (data[0]) /* strlen */
563                 LOG_INFO("CMSIS-DAP: FW Version = %s", &data[1]);
564
565         return ERROR_OK;
566 }
567
568 static int cmsis_dap_get_caps_info(void)
569 {
570         uint8_t *data;
571
572         /* INFO_ID_CAPS - byte */
573         int retval = cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS, &data);
574         if (retval != ERROR_OK)
575                 return retval;
576
577         if (data[0] == 1) {
578                 uint8_t caps = data[1];
579
580                 cmsis_dap_handle->caps = caps;
581
582                 if (caps & INFO_CAPS_SWD)
583                         LOG_INFO("CMSIS-DAP: %s", info_caps_str[0]);
584                 if (caps & INFO_CAPS_JTAG)
585                         LOG_INFO("CMSIS-DAP: %s", info_caps_str[1]);
586         }
587
588         return ERROR_OK;
589 }
590
591 static int cmsis_dap_get_status(void)
592 {
593         uint8_t d;
594
595         int retval = cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d);
596
597         if (retval == ERROR_OK) {
598                 LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
599                         (d & (0x01 << 0)) ? 1 : 0,      /* Bit 0: SWCLK/TCK */
600                         (d & (0x01 << 1)) ? 1 : 0,      /* Bit 1: SWDIO/TMS */
601                         (d & (0x01 << 2)) ? 1 : 0,      /* Bit 2: TDI */
602                         (d & (0x01 << 3)) ? 1 : 0,      /* Bit 3: TDO */
603                         (d & (0x01 << 5)) ? 1 : 0,      /* Bit 5: nTRST */
604                         (d & (0x01 << 7)) ? 1 : 0);     /* Bit 7: nRESET */
605         }
606
607         return retval;
608 }
609
610 static int cmsis_dap_reset_link(void)
611 {
612         uint8_t *buffer = cmsis_dap_handle->packet_buffer;
613
614         LOG_DEBUG("CMSIS-DAP: cmsis_dap_reset_link");
615         LOG_INFO("DAP_SWJ Sequence (reset: 50+ '1' followed by 0)");
616
617         /* reset line with SWDIO high for >50 cycles */
618         buffer[0] = 0;  /* report number */
619         buffer[1] = CMD_DAP_SWJ_SEQ;
620         buffer[2] = 7 * 8;
621         buffer[3] = 0xff;
622         buffer[4] = 0xff;
623         buffer[5] = 0xff;
624         buffer[6] = 0xff;
625         buffer[7] = 0xff;
626         buffer[8] = 0xff;
627         buffer[9] = 0xff;
628         int retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 10);
629
630         if (retval != ERROR_OK || buffer[1] != DAP_OK)
631                 return ERROR_FAIL;
632
633         /* 16bit JTAG-SWD sequence */
634         buffer[0] = 0;  /* report number */
635         buffer[1] = CMD_DAP_SWJ_SEQ;
636         buffer[2] = 2 * 8;
637         buffer[3] = 0x9e;
638         buffer[4] = 0xe7;
639         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 5);
640
641         if (retval != ERROR_OK || buffer[1] != DAP_OK)
642                 return ERROR_FAIL;
643
644         /* another reset just incase */
645         buffer[0] = 0;  /* report number */
646         buffer[1] = CMD_DAP_SWJ_SEQ;
647         buffer[2] = 7 * 8;
648         buffer[3] = 0xff;
649         buffer[4] = 0xff;
650         buffer[5] = 0xff;
651         buffer[6] = 0xff;
652         buffer[7] = 0xff;
653         buffer[8] = 0xff;
654         buffer[9] = 0xff;
655         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 10);
656
657         if (retval != ERROR_OK || buffer[1] != DAP_OK)
658                 return ERROR_FAIL;
659
660         /* 16 cycle idle period */
661         buffer[0] = 0;  /* report number */
662         buffer[1] = CMD_DAP_SWJ_SEQ;
663         buffer[2] = 2 * 8;
664         buffer[3] = 0x00;
665         buffer[4] = 0x00;
666         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 5);
667
668         if (retval != ERROR_OK || buffer[1] != DAP_OK)
669                 return ERROR_FAIL;
670
671         DEBUG_IO("DAP Read IDCODE");
672
673         /* read the id code is always the next sequence */
674         buffer[0] = 0;  /* report number */
675         buffer[1] = CMD_DAP_TFER;
676         buffer[2] = 0x00;
677         buffer[3] = 0x01;
678         buffer[4] = 0x02;
679         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 5);
680
681         if (retval != ERROR_OK)
682                 return retval;
683
684         if (buffer[1] == 0) {
685                 LOG_DEBUG("Result 0x%02" PRIx8 " 0x%02" PRIx8, buffer[1], buffer[2]);
686
687                 LOG_DEBUG("DAP Reset Target");
688                 buffer[0] = 0;  /* report number */
689                 buffer[1] = CMD_DAP_RESET_TARGET;
690                 retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 2);
691                 LOG_DEBUG("Result 0x%02" PRIx8 " 0x%02" PRIx8, buffer[1], buffer[2]);
692
693                 LOG_DEBUG("DAP Write Abort");
694                 buffer[0] = 0;  /* report number */
695                 buffer[1] = CMD_DAP_WRITE_ABORT;
696                 buffer[2] = 0x00;
697                 buffer[3] = 0x1e/*0x1f*/;
698                 buffer[4] = 0x00;
699                 buffer[5] = 0x00;
700                 buffer[6] = 0x00;
701                 retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 7);
702                 LOG_DEBUG("Result 0x%02" PRIx8, buffer[1]);
703
704                 return 0x80 + buffer[1];
705         }
706
707         LOG_DEBUG("DAP Write Abort");
708         buffer[0] = 0;  /* report number */
709         buffer[1] = CMD_DAP_WRITE_ABORT;
710         buffer[2] = 0x00;
711         buffer[3] = 0x1e;
712         buffer[4] = 0x00;
713         buffer[5] = 0x00;
714         buffer[6] = 0x00;
715         retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 7);
716         LOG_DEBUG("Result 0x%02" PRIx8, buffer[1]);
717
718         return retval;
719 }
720
721 static int cmsis_dap_init(void)
722 {
723         int retval;
724         uint8_t *data;
725
726         if (cmsis_dap_handle == NULL) {
727
728                 /* JTAG init */
729                 retval = cmsis_dap_usb_open();
730                 if (retval != ERROR_OK)
731                         return retval;
732
733                 retval = cmsis_dap_get_caps_info();
734                 if (retval != ERROR_OK)
735                         return retval;
736
737                 /* Connect in JTAG mode */
738                 if (!(cmsis_dap_handle->caps & INFO_CAPS_JTAG)) {
739                         LOG_ERROR("CMSIS-DAP: JTAG not supported");
740                         return ERROR_JTAG_DEVICE_ERROR;
741                 }
742
743                 retval = cmsis_dap_cmd_DAP_Connect(CONNECT_JTAG);
744                 if (retval != ERROR_OK)
745                         return retval;
746
747                 LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
748         }
749
750         retval = cmsis_dap_get_version_info();
751         if (retval != ERROR_OK)
752                 return retval;
753
754         /* INFO_ID_PKT_SZ - short */
755         retval = cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ, &data);
756         if (retval != ERROR_OK)
757                 return retval;
758
759         if (data[0] == 2) {  /* short */
760                 uint16_t pkt_sz = data[1] + (data[2] << 8);
761
762                 if (cmsis_dap_handle->packet_size != pkt_sz + 1) {
763                         /* reallocate buffer */
764                         cmsis_dap_handle->packet_size = pkt_sz + 1;
765                         cmsis_dap_handle->packet_buffer = realloc(cmsis_dap_handle->packet_buffer,
766                                         cmsis_dap_handle->packet_size);
767                         if (cmsis_dap_handle->packet_buffer == NULL) {
768                                 LOG_ERROR("unable to reallocate memory");
769                                 return ERROR_FAIL;
770                         }
771                 }
772
773                 LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16, pkt_sz);
774         }
775
776         /* INFO_ID_PKT_CNT - byte */
777         retval = cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT, &data);
778         if (retval != ERROR_OK)
779                 return retval;
780
781         if (data[0] == 1) { /* byte */
782                 uint16_t pkt_cnt = data[1];
783                 cmsis_dap_handle->packet_count = pkt_cnt;
784                 LOG_DEBUG("CMSIS-DAP: Packet Count = %" PRId16, pkt_cnt);
785         }
786
787         retval = cmsis_dap_get_status();
788         if (retval != ERROR_OK)
789                 return ERROR_FAIL;
790
791         /* Now try to connect to the target
792          * TODO: This is all SWD only @ present */
793         retval = cmsis_dap_cmd_DAP_SWJ_Clock(100);              /* 100kHz */
794         if (retval != ERROR_OK)
795                 return ERROR_FAIL;
796
797         retval = cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
798         if (retval != ERROR_OK)
799                 return ERROR_FAIL;
800         retval = cmsis_dap_cmd_DAP_SWD_Configure(0x00);
801         if (retval != ERROR_OK)
802                 return ERROR_FAIL;
803
804         retval = cmsis_dap_cmd_DAP_LED(0x03);           /* Both LEDs on */
805         if (retval != ERROR_OK)
806                 return ERROR_FAIL;
807
808         /* support connecting with srst asserted */
809         enum reset_types jtag_reset_config = jtag_get_reset_config();
810
811         if (jtag_reset_config & RESET_CNCT_UNDER_SRST) {
812                 if (jtag_reset_config & RESET_SRST_NO_GATING) {
813                         retval = cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL);
814                         if (retval != ERROR_OK)
815                                 return ERROR_FAIL;
816                         LOG_INFO("Connecting under reset");
817                 }
818         }
819
820         retval = cmsis_dap_reset_link();
821         if (retval != ERROR_OK)
822                 return ERROR_FAIL;
823
824         cmsis_dap_cmd_DAP_LED(0x00);                            /* Both LEDs off */
825
826         LOG_INFO("CMSIS-DAP: Interface ready");
827
828         return ERROR_OK;
829 }
830
831 static int cmsis_dap_swd_init(void)
832 {
833         int retval;
834
835         DEBUG_IO("CMSIS-DAP: cmsis_dap_swd_init");
836
837         if (cmsis_dap_handle == NULL) {
838
839                 /* SWD init */
840                 retval = cmsis_dap_usb_open();
841                 if (retval != ERROR_OK)
842                         return retval;
843
844                 retval = cmsis_dap_get_caps_info();
845                 if (retval != ERROR_OK)
846                         return retval;
847         }
848
849         if (!(cmsis_dap_handle->caps & INFO_CAPS_SWD)) {
850                 LOG_ERROR("CMSIS-DAP: SWD not supported");
851                 return ERROR_JTAG_DEVICE_ERROR;
852         }
853
854         retval = cmsis_dap_cmd_DAP_Connect(CONNECT_SWD);
855         if (retval != ERROR_OK)
856                 return retval;
857
858         /* Add more setup here.??... */
859
860         LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
861         return ERROR_OK;
862 }
863
864 static int cmsis_dap_quit(void)
865 {
866         cmsis_dap_cmd_DAP_Disconnect();
867         cmsis_dap_cmd_DAP_LED(0x00);            /* Both LEDs off */
868
869         cmsis_dap_usb_close(cmsis_dap_handle);
870
871         return ERROR_OK;
872 }
873
874 static void cmsis_dap_execute_reset(struct jtag_command *cmd)
875 {
876         int retval = cmsis_dap_cmd_DAP_SWJ_Pins(cmd->cmd.reset->srst ? 0 : (1 << 7), \
877                         (1 << 7), 0, NULL);
878         if (retval != ERROR_OK)
879                 LOG_ERROR("CMSIS-DAP: Interface reset failed");
880 }
881
882 static void cmsis_dap_execute_sleep(struct jtag_command *cmd)
883 {
884 #if 0
885         int retval = cmsis_dap_cmd_DAP_Delay(cmd->cmd.sleep->us);
886         if (retval != ERROR_OK)
887 #endif
888                 jtag_sleep(cmd->cmd.sleep->us);
889 }
890
891 static void cmsis_dap_execute_command(struct jtag_command *cmd)
892 {
893         switch (cmd->type) {
894                 case JTAG_RESET:
895                         cmsis_dap_execute_reset(cmd);
896                         break;
897                 case JTAG_SLEEP:
898                         cmsis_dap_execute_sleep(cmd);
899                         break;
900                 default:
901                         LOG_ERROR("BUG: unknown JTAG command type encountered");
902                         exit(-1);
903         }
904 }
905
906 static int cmsis_dap_execute_queue(void)
907 {
908         struct jtag_command *cmd = jtag_command_queue;
909
910         while (cmd != NULL) {
911                 cmsis_dap_execute_command(cmd);
912                 cmd = cmd->next;
913         }
914
915         return ERROR_OK;
916 }
917
918 static int cmsis_dap_speed(int speed)
919 {
920         if (speed > DAP_MAX_CLOCK) {
921                 LOG_INFO("reduce speed request: %dkHz to %dkHz maximum", speed, DAP_MAX_CLOCK);
922                 speed = DAP_MAX_CLOCK;
923         }
924
925         if (speed == 0) {
926                 LOG_INFO("RTCK not supported");
927                 return ERROR_JTAG_NOT_IMPLEMENTED;
928         }
929
930         return cmsis_dap_cmd_DAP_SWJ_Clock(speed);
931 }
932
933 static int cmsis_dap_speed_div(int speed, int *khz)
934 {
935         *khz = speed;
936         return ERROR_OK;
937 }
938
939 static int cmsis_dap_khz(int khz, int *jtag_speed)
940 {
941         *jtag_speed = khz;
942         return ERROR_OK;
943 }
944
945 COMMAND_HANDLER(cmsis_dap_handle_info_command)
946 {
947         if (cmsis_dap_get_version_info() == ERROR_OK)
948                 cmsis_dap_get_status();
949
950         return ERROR_OK;
951 }
952
953 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command)
954 {
955         if (CMD_ARGC > MAX_USB_IDS * 2) {
956                 LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
957                         "(maximum is %d pairs)", MAX_USB_IDS);
958                 CMD_ARGC = MAX_USB_IDS * 2;
959         }
960         if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
961                 LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
962                 if (CMD_ARGC < 2)
963                         return ERROR_COMMAND_SYNTAX_ERROR;
964                 /* remove the incomplete trailing id */
965                 CMD_ARGC -= 1;
966         }
967
968         unsigned i;
969         for (i = 0; i < CMD_ARGC; i += 2) {
970                 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], cmsis_dap_vid[i >> 1]);
971                 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], cmsis_dap_pid[i >> 1]);
972         }
973
974         /*
975          * Explicitly terminate, in case there are multiples instances of
976          * cmsis_dap_vid_pid.
977          */
978         cmsis_dap_vid[i >> 1] = cmsis_dap_pid[i >> 1] = 0;
979
980         return ERROR_OK;
981 }
982
983 static const struct command_registration cmsis_dap_subcommand_handlers[] = {
984         {
985                 .name = "info",
986                 .handler = &cmsis_dap_handle_info_command,
987                 .mode = COMMAND_EXEC,
988                 .usage = "",
989                 .help = "show cmsis-dap info",
990         },
991         COMMAND_REGISTRATION_DONE
992 };
993
994 static const struct command_registration cmsis_dap_command_handlers[] = {
995         {
996                 .name = "cmsis-dap",
997                 .mode = COMMAND_ANY,
998                 .help = "perform CMSIS-DAP management",
999                 .usage = "<cmd>",
1000                 .chain = cmsis_dap_subcommand_handlers,
1001         },
1002         {
1003                 .name = "cmsis_dap_vid_pid",
1004                 .handler = &cmsis_dap_handle_vid_pid_command,
1005                 .mode = COMMAND_CONFIG,
1006                 .help = "the vendor ID and product ID of the CMSIS-DAP device",
1007                 .usage = "(vid pid)* ",
1008         },
1009         COMMAND_REGISTRATION_DONE
1010 };
1011
1012 static const struct swd_driver cmsis_dap_swd_driver = {
1013         .init = cmsis_dap_swd_init,
1014         .read_reg = cmsis_dap_swd_read_reg,
1015         .write_reg = cmsis_dap_swd_write_reg,
1016         .run = cmsis_dap_swd_run,
1017 };
1018
1019 const char *cmsis_dap_transport[] = {"cmsis-dap", NULL};
1020
1021 struct jtag_interface cmsis_dap_interface = {
1022         .name = "cmsis-dap",
1023         .commands = cmsis_dap_command_handlers,
1024         .swd = &cmsis_dap_swd_driver,
1025         .transports = cmsis_dap_transport,
1026
1027         .execute_queue = cmsis_dap_execute_queue,
1028         .speed = cmsis_dap_speed,
1029         .speed_div = cmsis_dap_speed_div,
1030         .khz = cmsis_dap_khz,
1031         .init = cmsis_dap_init,
1032         .quit = cmsis_dap_quit,
1033 };