ULINK driver: Remove typedefs in ulink.c
[openocd.git] / src / jtag / drivers / rlink.c
blobf524b5c9c3fd088e1bb59f1e2bac3b33417041ce
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
7 * *
8 * Copyright (C) 2008 Rob Brown, Lou Deluxe *
9 * rob@cobbleware.com, lou.openocd012@fixit.nospammail.net *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 ***************************************************************************/
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
30 /* project specific includes */
31 #include <jtag/interface.h>
32 #include <jtag/commands.h>
33 #include "rlink.h"
34 #include "rlink_st7.h"
35 #include "rlink_ep1_cmd.h"
36 #include "rlink_dtc_cmd.h"
37 #include "usb_common.h"
40 /* This feature is made useless by running the DTC all the time. When automatic, the LED is on whenever the DTC is running. Otherwise, USB messages are sent to turn it on and off. */
41 #undef AUTOMATIC_BUSY_LED
43 /* This feature may require derating the speed due to reduced hold time. */
44 #undef USE_HARDWARE_SHIFTER_FOR_TMS
47 #define INTERFACE_NAME "RLink"
49 #define USB_IDVENDOR (0x138e)
50 #define USB_IDPRODUCT (0x9000)
52 #define USB_EP1OUT_ADDR (0x01)
53 #define USB_EP1OUT_SIZE (16)
54 #define USB_EP1IN_ADDR (USB_EP1OUT_ADDR | 0x80)
55 #define USB_EP1IN_SIZE (USB_EP1OUT_SIZE)
57 #define USB_EP2OUT_ADDR (0x02)
58 #define USB_EP2OUT_SIZE (64)
59 #define USB_EP2IN_ADDR (USB_EP2OUT_ADDR | 0x80)
60 #define USB_EP2IN_SIZE (USB_EP2OUT_SIZE)
61 #define USB_EP2BANK_SIZE (512)
63 #define USB_TIMEOUT_MS (3 * 1000)
65 #define DTC_STATUS_POLL_BYTE (ST7_USB_BUF_EP0OUT + 0xff)
68 #define ST7_PD_NBUSY_LED ST7_PD0
69 #define ST7_PD_NRUN_LED ST7_PD1
70 /* low enables VPP at adapter header, high connects it to GND instead */
71 #define ST7_PD_VPP_SEL ST7_PD6
72 /* low: VPP = 12v, high: VPP <= 5v */
73 #define ST7_PD_VPP_SHDN ST7_PD7
75 /* These pins are connected together */
76 #define ST7_PE_ADAPTER_SENSE_IN ST7_PE3
77 #define ST7_PE_ADAPTER_SENSE_OUT ST7_PE4
79 /* Symbolic mapping between port pins and numbered IO lines */
80 #define ST7_PA_IO1 ST7_PA1
81 #define ST7_PA_IO2 ST7_PA2
82 #define ST7_PA_IO4 ST7_PA4
83 #define ST7_PA_IO8 ST7_PA6
84 #define ST7_PA_IO10 ST7_PA7
85 #define ST7_PB_IO5 ST7_PB5
86 #define ST7_PC_IO9 ST7_PC1
87 #define ST7_PC_IO3 ST7_PC2
88 #define ST7_PC_IO7 ST7_PC3
89 #define ST7_PE_IO6 ST7_PE5
91 /* Symbolic mapping between numbered IO lines and adapter signals */
92 #define ST7_PA_RTCK ST7_PA_IO0
93 #define ST7_PA_NTRST ST7_PA_IO1
94 #define ST7_PC_TDI ST7_PC_IO3
95 #define ST7_PA_DBGRQ ST7_PA_IO4
96 #define ST7_PB_NSRST ST7_PB_IO5
97 #define ST7_PE_TMS ST7_PE_IO6
98 #define ST7_PC_TCK ST7_PC_IO7
99 #define ST7_PC_TDO ST7_PC_IO9
100 #define ST7_PA_DBGACK ST7_PA_IO10
102 static usb_dev_handle *pHDev;
106 * ep1 commands are up to USB_EP1OUT_SIZE bytes in length.
107 * This function takes care of zeroing the unused bytes before sending the packet.
108 * Any reply packet is not handled by this function.
110 static
112 ep1_generic_commandl(
113 usb_dev_handle *pHDev_param,
114 size_t length,
117 uint8_t usb_buffer[USB_EP1OUT_SIZE];
118 uint8_t *usb_buffer_p;
119 va_list ap;
120 int usb_ret;
122 if (length > sizeof(usb_buffer)) {
123 length = sizeof(usb_buffer);
126 usb_buffer_p = usb_buffer;
128 va_start(ap, length);
129 while (length > 0) {
130 *usb_buffer_p++ = va_arg(ap, int);
131 length--;
134 memset(
135 usb_buffer_p,
137 sizeof(usb_buffer) - (usb_buffer_p - usb_buffer)
140 usb_ret = usb_bulk_write(
141 pHDev_param,
142 USB_EP1OUT_ADDR,
143 (char *)usb_buffer, sizeof(usb_buffer),
144 USB_TIMEOUT_MS
147 return(usb_ret);
152 #if 0
153 static
154 ssize_t
155 ep1_memory_read(
156 usb_dev_handle *pHDev,
157 uint16_t addr,
158 size_t length,
159 uint8_t *buffer
161 uint8_t usb_buffer[USB_EP1OUT_SIZE];
162 int usb_ret;
163 size_t remain;
164 ssize_t count;
166 usb_buffer[0] = EP1_CMD_MEMORY_READ;
167 memset(
168 usb_buffer + 4,
170 sizeof(usb_buffer) - 4
173 remain = length;
174 count = 0;
176 while (remain) {
177 if (remain > sizeof(usb_buffer)) {
178 length = sizeof(usb_buffer);
179 } else {
180 length = remain;
183 usb_buffer[1] = addr >> 8;
184 usb_buffer[2] = addr;
185 usb_buffer[3] = length;
187 usb_ret = usb_bulk_write(
188 pHDev, USB_EP1OUT_ADDR,
189 usb_buffer, sizeof(usb_buffer),
190 USB_TIMEOUT_MS
193 if (usb_ret < sizeof(usb_buffer)) {
194 break;
197 usb_ret = usb_bulk_read(
198 pHDev, USB_EP1IN_ADDR,
199 buffer, length,
200 USB_TIMEOUT_MS
203 if (usb_ret < length) {
204 break;
207 addr += length;
208 buffer += length;
209 count += length;
210 remain -= length;
213 return(count);
215 #endif
219 static
220 ssize_t
221 ep1_memory_write(
222 usb_dev_handle *pHDev_param,
223 uint16_t addr,
224 size_t length,
225 uint8_t const *buffer
227 uint8_t usb_buffer[USB_EP1OUT_SIZE];
228 int usb_ret;
229 size_t remain;
230 ssize_t count;
232 usb_buffer[0] = EP1_CMD_MEMORY_WRITE;
234 remain = length;
235 count = 0;
237 while (remain) {
238 if (remain > (sizeof(usb_buffer) - 4)) {
239 length = (sizeof(usb_buffer) - 4);
240 } else {
241 length = remain;
244 usb_buffer[1] = addr >> 8;
245 usb_buffer[2] = addr;
246 usb_buffer[3] = length;
247 memcpy(
248 usb_buffer + 4,
249 buffer,
250 length
252 memset(
253 usb_buffer + 4 + length,
255 sizeof(usb_buffer) - 4 - length
258 usb_ret = usb_bulk_write(
259 pHDev_param, USB_EP1OUT_ADDR,
260 (char *)usb_buffer, sizeof(usb_buffer),
261 USB_TIMEOUT_MS
264 if ((size_t)usb_ret < sizeof(usb_buffer)) {
265 break;
268 addr += length;
269 buffer += length;
270 count += length;
271 remain -= length;
274 return(count);
278 #if 0
279 static
280 ssize_t
281 ep1_memory_writel(
282 usb_dev_handle *pHDev,
283 uint16_t addr,
284 size_t length,
287 uint8_t buffer[USB_EP1OUT_SIZE - 4];
288 uint8_t *buffer_p;
289 va_list ap;
290 size_t remain;
292 if (length > sizeof(buffer)) {
293 length = sizeof(buffer);
296 remain = length;
297 buffer_p = buffer;
299 va_start(ap, length);
300 while (remain > 0) {
301 *buffer_p++ = va_arg(ap, int);
302 remain--;
305 return(ep1_memory_write(pHDev, addr, length, buffer));
307 #endif
310 #define DTCLOAD_COMMENT (0)
311 #define DTCLOAD_ENTRY (1)
312 #define DTCLOAD_LOAD (2)
313 #define DTCLOAD_RUN (3)
314 #define DTCLOAD_LUT_START (4)
315 #define DTCLOAD_LUT (5)
317 #define DTC_LOAD_BUFFER ST7_USB_BUF_EP2UIDO
319 /* This gets set by the DTC loader */
320 static uint8_t dtc_entry_download;
323 /* The buffer is specially formatted to represent a valid image to load into the DTC. */
324 static
326 dtc_load_from_buffer(
327 usb_dev_handle *pHDev_param,
328 const uint8_t *buffer,
329 size_t length
331 struct header_s {
332 uint8_t type;
333 uint8_t length;
336 int usb_err;
337 struct header_s *header;
338 uint8_t lut_start = 0xc0;
340 dtc_entry_download = 0;
342 /* Stop the DTC before loading anything. */
343 usb_err = ep1_generic_commandl(
344 pHDev_param, 1,
345 EP1_CMD_DTC_STOP
347 if (usb_err < 0) return(usb_err);
349 while (length) {
350 if (length < sizeof(*header)) {
351 LOG_ERROR("Malformed DTC image");
352 exit(1);
355 header = (struct header_s *)buffer;
356 buffer += sizeof(*header);
357 length -= sizeof(*header);
359 if (length < (size_t)header->length + 1) {
360 LOG_ERROR("Malformed DTC image");
361 exit(1);
364 switch (header->type) {
365 case DTCLOAD_COMMENT:
366 break;
368 case DTCLOAD_ENTRY:
369 /* store entry addresses somewhere */
370 if (!strncmp("download", (char *)buffer + 1, 8)) {
371 dtc_entry_download = buffer[0];
373 break;
375 case DTCLOAD_LOAD:
376 /* Send the DTC program to ST7 RAM. */
377 usb_err = ep1_memory_write(
378 pHDev_param,
379 DTC_LOAD_BUFFER,
380 header->length + 1, buffer
382 if (usb_err < 0) return(usb_err);
384 /* Load it into the DTC. */
385 usb_err = ep1_generic_commandl(
386 pHDev_param, 3,
387 EP1_CMD_DTC_LOAD,
388 (DTC_LOAD_BUFFER >> 8),
389 DTC_LOAD_BUFFER
391 if (usb_err < 0) return(usb_err);
393 break;
395 case DTCLOAD_RUN:
396 usb_err = ep1_generic_commandl(
397 pHDev_param, 3,
398 EP1_CMD_DTC_CALL,
399 buffer[0],
400 EP1_CMD_DTC_WAIT
402 if (usb_err < 0) return(usb_err);
404 break;
406 case DTCLOAD_LUT_START:
407 lut_start = buffer[0];
408 break;
410 case DTCLOAD_LUT:
411 usb_err = ep1_memory_write(
412 pHDev_param,
413 ST7_USB_BUF_EP0OUT + lut_start,
414 header->length + 1, buffer
416 if (usb_err < 0) return(usb_err);
417 break;
419 default:
420 LOG_ERROR("Invalid DTC image record type: 0x%02x", header->type);
421 exit(1);
422 break;
425 buffer += (header->length + 1);
426 length -= (header->length + 1);
429 return(0);
434 * Start the DTC running in download mode (waiting for 512 byte command packets on ep2).
436 static
438 dtc_start_download(void) {
439 int usb_err;
440 uint8_t ep2txr;
442 /* set up for download mode and make sure EP2 is set up to transmit */
443 usb_err = ep1_generic_commandl(
444 pHDev, 7,
446 EP1_CMD_DTC_STOP,
447 EP1_CMD_SET_UPLOAD,
448 EP1_CMD_SET_DOWNLOAD,
449 EP1_CMD_MEMORY_READ, /* read EP2TXR for its data toggle */
450 ST7_EP2TXR >> 8,
451 ST7_EP2TXR,
454 if (usb_err < 0) return(usb_err);
456 /* read back ep2txr */
457 usb_err = usb_bulk_read(
458 pHDev, USB_EP1IN_ADDR,
459 (char *)&ep2txr, 1,
460 USB_TIMEOUT_MS
462 if (usb_err < 0) return(usb_err);
464 usb_err = ep1_generic_commandl(
465 pHDev, 13,
467 EP1_CMD_MEMORY_WRITE, /* preinitialize poll byte */
468 DTC_STATUS_POLL_BYTE >> 8,
469 DTC_STATUS_POLL_BYTE,
471 0x00,
472 EP1_CMD_MEMORY_WRITE, /* set EP2IN to return data */
473 ST7_EP2TXR >> 8,
474 ST7_EP2TXR,
476 (ep2txr & ST7_EP2TXR_DTOG_TX) | ST7_EP2TXR_STAT_VALID,
477 EP1_CMD_DTC_CALL, /* start running the DTC */
478 dtc_entry_download,
479 EP1_CMD_DTC_GET_CACHED_STATUS
481 if (usb_err < 0) return(usb_err);
483 /* wait for completion */
484 usb_err = usb_bulk_read(
485 pHDev, USB_EP1IN_ADDR,
486 (char *)&ep2txr, 1,
487 USB_TIMEOUT_MS
490 return(usb_err);
494 static
496 dtc_run_download(
497 usb_dev_handle *pHDev_param,
498 uint8_t *command_buffer,
499 int command_buffer_size,
500 uint8_t *reply_buffer,
501 int reply_buffer_size
503 char dtc_status;
504 int usb_err;
505 int i;
507 LOG_DEBUG("%d/%d", command_buffer_size, reply_buffer_size);
509 usb_err = usb_bulk_write(
510 pHDev_param,
511 USB_EP2OUT_ADDR,
512 (char *)command_buffer, USB_EP2BANK_SIZE,
513 USB_TIMEOUT_MS
515 if (usb_err < 0) return(usb_err);
518 /* Wait for DTC to finish running command buffer */
519 for (i = 10;;) {
520 usb_err = ep1_generic_commandl(
521 pHDev_param, 4,
523 EP1_CMD_MEMORY_READ,
524 DTC_STATUS_POLL_BYTE >> 8,
525 DTC_STATUS_POLL_BYTE,
528 if (usb_err < 0) return(usb_err);
530 usb_err = usb_bulk_read(
531 pHDev_param,
532 USB_EP1IN_ADDR,
533 &dtc_status, 1,
534 USB_TIMEOUT_MS
536 if (usb_err < 0) return(usb_err);
538 if (dtc_status & 0x01) break;
540 if (!--i) {
541 LOG_ERROR("too many retries waiting for DTC status");
542 return(-ETIMEDOUT);
547 if (reply_buffer && reply_buffer_size) {
548 usb_err = usb_bulk_read(
549 pHDev_param,
550 USB_EP2IN_ADDR,
551 (char *)reply_buffer, reply_buffer_size,
552 USB_TIMEOUT_MS
555 if (usb_err < reply_buffer_size) {
556 LOG_ERROR("Read of endpoint 2 returned %d, expected %d",
557 usb_err, reply_buffer_size
559 return(usb_err);
563 return(usb_err);
568 * The dtc reply queue is a singly linked list that describes what to do with the reply packet that comes from the DTC. Only SCAN_IN and SCAN_IO generate these entries.
571 struct dtc_reply_queue_entry {
572 struct dtc_reply_queue_entry *next;
573 struct jtag_command *cmd; /* the command that resulted in this entry */
575 struct {
576 uint8_t *buffer; /* the scan buffer */
577 int size; /* size of the scan buffer in bits */
578 int offset; /* how many bits were already done before this? */
579 int length; /* how many bits are processed in this operation? */
580 enum scan_type type; /* SCAN_IN/SCAN_OUT/SCAN_IO */
581 } scan;
586 * The dtc_queue consists of a buffer of pending commands and a reply queue.
587 * rlink_scan and tap_state_run add to the command buffer and maybe to the reply queue.
590 static
591 struct {
592 struct dtc_reply_queue_entry *rq_head;
593 struct dtc_reply_queue_entry *rq_tail;
594 uint32_t cmd_index;
595 uint32_t reply_index;
596 uint8_t cmd_buffer[USB_EP2BANK_SIZE];
597 } dtc_queue;
601 * The tap state queue is for accumulating TAP state changes wiithout needlessly flushing the dtc_queue. When it fills or is run, it adds the accumulated bytes to the dtc_queue.
604 static
605 struct {
606 uint32_t length;
607 uint32_t buffer;
608 } tap_state_queue;
612 static
614 dtc_queue_init(void) {
615 dtc_queue.rq_head = NULL;
616 dtc_queue.rq_tail = NULL;
617 dtc_queue.cmd_index = 0;
618 dtc_queue.reply_index = 0;
619 return(0);
623 static
624 inline
625 struct dtc_reply_queue_entry *
626 dtc_queue_enqueue_reply(
627 enum scan_type type,
628 uint8_t *buffer,
629 int size,
630 int offset,
631 int length,
632 struct jtag_command *cmd
634 struct dtc_reply_queue_entry *rq_entry;
636 rq_entry = malloc(sizeof(struct dtc_reply_queue_entry));
637 if (rq_entry != NULL) {
638 rq_entry->scan.type = type;
639 rq_entry->scan.buffer = buffer;
640 rq_entry->scan.size = size;
641 rq_entry->scan.offset = offset;
642 rq_entry->scan.length = length;
643 rq_entry->cmd = cmd;
644 rq_entry->next = NULL;
646 if (dtc_queue.rq_head == NULL)
647 dtc_queue.rq_head = rq_entry;
648 else
649 dtc_queue.rq_tail->next = rq_entry;
651 dtc_queue.rq_tail = rq_entry;
654 return(rq_entry);
659 * Running the queue means that any pending command buffer is run and any reply data dealt with. The command buffer is then cleared for subsequent processing.
660 * The queue is automatically run by append when it is necessary to get space for the append.
663 static
665 dtc_queue_run(void) {
666 struct dtc_reply_queue_entry *rq_p, *rq_next;
667 int retval;
668 int usb_err;
669 int bit_cnt;
670 int x;
671 uint8_t *dtc_p, *tdo_p;
672 uint8_t dtc_mask, tdo_mask;
673 uint8_t reply_buffer[USB_EP2IN_SIZE];
675 assert((dtc_queue.rq_head != 0) == (dtc_queue.reply_index > 0));
676 assert(dtc_queue.cmd_index < USB_EP2BANK_SIZE);
677 assert(dtc_queue.reply_index <= USB_EP2IN_SIZE);
679 retval = ERROR_OK;
681 if (dtc_queue.cmd_index < 1) return(retval);
683 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = DTC_CMD_STOP;
685 usb_err = dtc_run_download(pHDev,
686 dtc_queue.cmd_buffer, dtc_queue.cmd_index,
687 reply_buffer, dtc_queue.reply_index
689 if (usb_err < 0) {
690 LOG_ERROR("dtc_run_download: %s", usb_strerror());
691 exit(1);
694 if (dtc_queue.rq_head != NULL) {
695 /* process the reply, which empties the reply queue and frees its entries */
696 dtc_p = reply_buffer;
698 /* The rigamarole with the masks and doing it bit-by-bit is due to the fact that the scan buffer is LSb-first and the DTC code is MSb-first for hardware reasons. It was that or craft a function to do the reversal, and that wouldn't work with bit-stuffing (supplying extra bits to use mostly byte operations), or any other scheme which would throw the byte alignment off. */
700 for (
701 rq_p = dtc_queue.rq_head;
702 rq_p != NULL;
703 rq_p = rq_next
705 tdo_p = rq_p->scan.buffer + (rq_p->scan.offset / 8);
706 tdo_mask = 1 << (rq_p->scan.offset % 8);
709 bit_cnt = rq_p->scan.length;
710 if (bit_cnt >= 8) {
711 /* bytes */
713 dtc_mask = 1 << (8 - 1);
715 for (
717 bit_cnt;
718 bit_cnt--
720 if (*dtc_p & dtc_mask) {
721 *tdo_p |= tdo_mask;
722 } else {
723 *tdo_p &=~ tdo_mask;
726 dtc_mask >>= 1;
727 if (dtc_mask == 0) {
728 dtc_p++;
729 dtc_mask = 1 << (8 - 1);
732 tdo_mask <<= 1;
733 if (tdo_mask == 0) {
734 tdo_p++;
735 tdo_mask = 1;
738 } else {
739 /* extra bits or last bit */
741 x = *dtc_p++;
742 if ((
743 rq_p->scan.type == SCAN_IN
744 ) && (
745 rq_p->scan.offset != rq_p->scan.size - 1
746 )) {
747 /* extra bits were sent as a full byte with padding on the end */
748 dtc_mask = 1 << (8 - 1);
749 } else {
750 dtc_mask = 1 << (bit_cnt - 1);
753 for (
755 bit_cnt;
756 bit_cnt--
758 if (x & dtc_mask) {
759 *tdo_p |= tdo_mask;
760 } else {
761 *tdo_p &=~ tdo_mask;
764 dtc_mask >>= 1;
766 tdo_mask <<= 1;
767 if (tdo_mask == 0) {
768 tdo_p++;
769 tdo_mask = 1;
775 if ((rq_p->scan.offset + rq_p->scan.length) >= rq_p->scan.size) {
776 /* feed scan buffer back into openocd and free it */
777 if (jtag_read_buffer(rq_p->scan.buffer, rq_p->cmd->cmd.scan) != ERROR_OK) {
778 retval = ERROR_JTAG_QUEUE_FAILED;
780 free(rq_p->scan.buffer);
783 rq_next = rq_p->next;
784 free(rq_p);
786 dtc_queue.rq_head = NULL;
787 dtc_queue.rq_tail = NULL;
791 /* reset state for new appends */
792 dtc_queue.cmd_index = 0;
793 dtc_queue.reply_index = 0;
795 return(retval);
798 /* runs the queue if it cannot take reserved_cmd bytes of command data
799 * or reserved_reply bytes of reply data */
800 static
802 dtc_queue_run_if_full(
803 int reserved_cmd,
804 int reserved_reply
806 /* reserve one additional byte for the STOP cmd appended during run */
807 if (dtc_queue.cmd_index + reserved_cmd + 1 > USB_EP2BANK_SIZE)
808 return dtc_queue_run();
810 if (dtc_queue.reply_index + reserved_reply > USB_EP2IN_SIZE)
811 return dtc_queue_run();
813 return ERROR_OK;
816 static
818 tap_state_queue_init(void) {
819 tap_state_queue.length = 0;
820 tap_state_queue.buffer = 0;
821 return(0);
825 static
827 tap_state_queue_run(void) {
828 int i;
829 int bits;
830 uint8_t byte_param;
831 int retval;
833 retval = 0;
834 if (!tap_state_queue.length) return(retval);
835 bits = 1;
836 byte_param = 0;
837 for (i = tap_state_queue.length; i--;) {
839 byte_param <<= 1;
840 if (tap_state_queue.buffer & 1) {
841 byte_param |= 1;
843 if ((bits >= 8) || !i) {
844 byte_param <<= (8 - bits);
846 /* make sure there's room for two cmd bytes */
847 dtc_queue_run_if_full(2, 0);
849 #ifdef USE_HARDWARE_SHIFTER_FOR_TMS
850 if (bits == 8) {
851 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
852 DTC_CMD_SHIFT_TMS_BYTES(1);
853 } else {
854 #endif
855 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
856 DTC_CMD_SHIFT_TMS_BITS(bits);
857 #ifdef USE_HARDWARE_SHIFTER_FOR_TMS
859 #endif
861 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
862 byte_param;
864 byte_param = 0;
865 bits = 1;
866 } else {
867 bits++;
870 tap_state_queue.buffer >>= 1;
872 retval = tap_state_queue_init();
873 return(retval);
877 static
879 tap_state_queue_append(
880 uint8_t tms
882 int retval;
884 if (tap_state_queue.length >= sizeof(tap_state_queue.buffer) * 8) {
885 retval = tap_state_queue_run();
886 if (retval != 0) return(retval);
889 if (tms) {
890 tap_state_queue.buffer |= (1 << tap_state_queue.length);
892 tap_state_queue.length++;
894 return(0);
898 static
899 void rlink_end_state(tap_state_t state)
901 if (tap_is_state_stable(state))
902 tap_set_end_state(state);
903 else
905 LOG_ERROR("BUG: %i is not a valid end state", state);
906 exit(-1);
911 static
912 void rlink_state_move(void) {
914 int i = 0, tms = 0;
915 uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
916 int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
918 for (i = 0; i < tms_count; i++)
920 tms = (tms_scan >> i) & 1;
921 tap_state_queue_append(tms);
924 tap_set_state(tap_get_end_state());
927 static
928 void rlink_path_move(struct pathmove_command *cmd)
930 int num_states = cmd->num_states;
931 int state_count;
932 int tms = 0;
934 state_count = 0;
935 while (num_states)
937 if (tap_state_transition(tap_get_state(), false) == cmd->path[state_count])
939 tms = 0;
941 else if (tap_state_transition(tap_get_state(), true) == cmd->path[state_count])
943 tms = 1;
945 else
947 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
948 exit(-1);
951 tap_state_queue_append(tms);
953 tap_set_state(cmd->path[state_count]);
954 state_count++;
955 num_states--;
958 tap_set_end_state(tap_get_state());
962 static
963 void rlink_runtest(int num_cycles)
965 int i;
967 tap_state_t saved_end_state = tap_get_end_state();
969 /* only do a state_move when we're not already in RTI */
970 if (tap_get_state() != TAP_IDLE)
972 rlink_end_state(TAP_IDLE);
973 rlink_state_move();
976 /* execute num_cycles */
977 for (i = 0; i < num_cycles; i++)
979 tap_state_queue_append(0);
982 /* finish in end_state */
983 rlink_end_state(saved_end_state);
984 if (tap_get_state() != tap_get_end_state())
985 rlink_state_move();
989 /* (1) assert or (0) deassert reset lines */
990 static
991 void rlink_reset(int trst, int srst)
993 uint8_t bitmap;
994 int usb_err;
996 /* Read port A for bit op */
997 usb_err = ep1_generic_commandl(
998 pHDev, 4,
999 EP1_CMD_MEMORY_READ,
1000 ST7_PADR >> 8,
1001 ST7_PADR,
1004 if (usb_err < 0) {
1005 LOG_ERROR("%s", usb_strerror());
1006 exit(1);
1009 usb_err = usb_bulk_read(
1010 pHDev, USB_EP1IN_ADDR,
1011 (char *)&bitmap, 1,
1012 USB_TIMEOUT_MS
1014 if (usb_err < 1) {
1015 LOG_ERROR("%s", usb_strerror());
1016 exit(1);
1019 if (trst) {
1020 bitmap &= ~ST7_PA_NTRST;
1021 } else {
1022 bitmap |= ST7_PA_NTRST;
1025 /* Write port A and read port B for bit op */
1026 /* port B has no OR, and we want to emulate open drain on NSRST, so we initialize DR to 0 and assert NSRST by setting DDR to 1. */
1027 usb_err = ep1_generic_commandl(
1028 pHDev, 9,
1029 EP1_CMD_MEMORY_WRITE,
1030 ST7_PADR >> 8,
1031 ST7_PADR,
1033 bitmap,
1034 EP1_CMD_MEMORY_READ,
1035 ST7_PBDDR >> 8,
1036 ST7_PBDDR,
1039 if (usb_err < 0) {
1040 LOG_ERROR("%s", usb_strerror());
1041 exit(1);
1044 usb_err = usb_bulk_read(
1045 pHDev, USB_EP1IN_ADDR,
1046 (char *)&bitmap, 1,
1047 USB_TIMEOUT_MS
1049 if (usb_err < 1) {
1050 LOG_ERROR("%s", usb_strerror());
1051 exit(1);
1054 if (srst) {
1055 bitmap |= ST7_PB_NSRST;
1056 } else {
1057 bitmap &= ~ST7_PB_NSRST;
1060 /* write port B and read dummy to ensure completion before returning */
1061 usb_err = ep1_generic_commandl(
1062 pHDev, 6,
1063 EP1_CMD_MEMORY_WRITE,
1064 ST7_PBDDR >> 8,
1065 ST7_PBDDR,
1067 bitmap,
1068 EP1_CMD_DTC_GET_CACHED_STATUS
1070 if (usb_err < 0) {
1071 LOG_ERROR("%s", usb_strerror());
1072 exit(1);
1075 usb_err = usb_bulk_read(
1076 pHDev, USB_EP1IN_ADDR,
1077 (char *)&bitmap, 1,
1078 USB_TIMEOUT_MS
1080 if (usb_err < 1) {
1081 LOG_ERROR("%s", usb_strerror());
1082 exit(1);
1087 static
1089 rlink_scan(
1090 struct jtag_command *cmd,
1091 enum scan_type type,
1092 uint8_t *buffer,
1093 int scan_size
1095 bool ir_scan;
1096 tap_state_t saved_end_state;
1097 int byte_bits;
1098 int extra_bits;
1099 int chunk_bits;
1100 int chunk_bytes;
1101 int x;
1103 int tdi_bit_offset;
1104 uint8_t tdi_mask, *tdi_p;
1105 uint8_t dtc_mask;
1107 if (scan_size < 1) {
1108 LOG_ERROR("scan_size cannot be less than 1 bit");
1109 exit(1);
1112 ir_scan = cmd->cmd.scan->ir_scan;
1114 /* Move to the proper state before starting to shift TDI/TDO. */
1115 if (!(
1116 (!ir_scan && (tap_get_state() == TAP_DRSHIFT))
1118 (ir_scan && (tap_get_state() == TAP_IRSHIFT))
1119 )) {
1120 saved_end_state = tap_get_end_state();
1121 rlink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
1122 rlink_state_move();
1123 rlink_end_state(saved_end_state);
1126 tap_state_queue_run();
1129 #if 0
1130 printf("scan_size = %d, type = 0x%x\n", scan_size, type);
1132 int i;
1134 /* clear unused bits in scan buffer for ease of debugging */
1135 /* (it makes diffing output easier) */
1136 buffer[scan_size / 8] &= ((1 << ((scan_size - 1) % 8) + 1) - 1);
1138 printf("before scan:");
1139 for (i = 0; i < (scan_size + 7) / 8; i++) {
1140 printf(" %02x", buffer[i]);
1142 printf("\n");
1144 #endif
1146 /* The number of bits that can be shifted as complete bytes */
1147 byte_bits = (int)(scan_size - 1) / 8 * 8;
1148 /* The number of bits left over, not counting the last bit */
1149 extra_bits = (scan_size - 1) - byte_bits;
1151 tdi_bit_offset = 0;
1152 tdi_p = buffer;
1153 tdi_mask = 1;
1155 if (extra_bits && (type == SCAN_OUT)) {
1156 /* Schedule any extra bits into the DTC command buffer, padding as needed */
1157 /* For SCAN_OUT, this comes before the full bytes so the (leading) padding bits will fall off the end */
1159 /* make sure there's room for two cmd bytes */
1160 dtc_queue_run_if_full(2, 0);
1162 x = 0;
1163 dtc_mask = 1 << (extra_bits - 1);
1165 while (extra_bits--) {
1166 if (*tdi_p & tdi_mask) {
1167 x |= dtc_mask;
1170 dtc_mask >>= 1;
1172 tdi_mask <<= 1;
1173 if (tdi_mask == 0) {
1174 tdi_p++;
1175 tdi_mask = 1;
1179 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
1180 DTC_CMD_SHIFT_TDI_BYTES(1);
1182 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = x;
1185 /* Loop scheduling full bytes into the DTC command buffer */
1186 while (byte_bits) {
1187 /* make sure there's room for one (for in scans) or two cmd bytes and
1188 * at least one reply byte for in or inout scans*/
1189 dtc_queue_run_if_full(type == SCAN_IN ? 1 : 2, type != SCAN_OUT ? 1 : 0);
1191 chunk_bits = byte_bits;
1192 /* we can only use up to 16 bytes at a time */
1193 if (chunk_bits > (16 * 8)) chunk_bits = (16 * 8);
1195 if (type != SCAN_IN) {
1196 /* how much is there room for, considering stop and byte op? */
1197 x = (sizeof(dtc_queue.cmd_buffer) - (dtc_queue.cmd_index + 1 + 1)) * 8;
1198 if (chunk_bits > x) chunk_bits = x;
1201 if (type != SCAN_OUT) {
1202 /* how much is there room for in the reply buffer? */
1203 x = (USB_EP2IN_SIZE - dtc_queue.reply_index) * 8;
1204 if (chunk_bits > x) chunk_bits = x;
1207 /* so the loop will end */
1208 byte_bits -= chunk_bits;
1210 if (type != SCAN_OUT) {
1211 if (dtc_queue_enqueue_reply(
1212 type, buffer, scan_size, tdi_bit_offset,
1213 chunk_bits,
1215 ) == NULL) {
1216 LOG_ERROR("enqueuing DTC reply entry: %s", strerror(errno));
1217 exit(1);
1219 dtc_queue.reply_index += (chunk_bits + 7) / 8;
1221 tdi_bit_offset += chunk_bits;
1224 /* chunk_bits is a multiple of 8, so there are no rounding issues. */
1225 chunk_bytes = chunk_bits / 8;
1227 switch (type) {
1228 case SCAN_IN:
1229 x = DTC_CMD_SHIFT_TDO_BYTES(chunk_bytes);
1230 break;
1231 case SCAN_OUT:
1232 x = DTC_CMD_SHIFT_TDI_BYTES(chunk_bytes);
1233 break;
1234 default:
1235 x = DTC_CMD_SHIFT_TDIO_BYTES(chunk_bytes);
1236 break;
1238 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = x;
1240 if (type != SCAN_IN) {
1241 x = 0;
1242 dtc_mask = 1 << (8 - 1);
1244 while (chunk_bits--) {
1245 if (*tdi_p & tdi_mask) {
1246 x |= dtc_mask;
1249 dtc_mask >>= 1;
1250 if (dtc_mask == 0) {
1251 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = x;
1252 x = 0;
1253 dtc_mask = 1 << (8 - 1);
1256 tdi_mask <<= 1;
1257 if (tdi_mask == 0) {
1258 tdi_p++;
1259 tdi_mask = 1;
1265 if (extra_bits && (type != SCAN_OUT)) {
1266 /* Schedule any extra bits into the DTC command buffer */
1268 /* make sure there's room for one (for in scans) or two cmd bytes
1269 * and one reply byte */
1270 dtc_queue_run_if_full(type == SCAN_IN ? 1 : 2, 1);
1272 if (dtc_queue_enqueue_reply(
1273 type, buffer, scan_size, tdi_bit_offset,
1274 extra_bits,
1276 ) == NULL) {
1277 LOG_ERROR("enqueuing DTC reply entry: %s", strerror(errno));
1278 exit(1);
1281 dtc_queue.reply_index++;
1283 tdi_bit_offset += extra_bits;
1285 if (type == SCAN_IN) {
1286 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
1287 DTC_CMD_SHIFT_TDO_BYTES(1);
1289 } else {
1290 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
1291 DTC_CMD_SHIFT_TDIO_BITS(extra_bits);
1293 x = 0;
1294 dtc_mask = 1 << (8 - 1);
1296 while (extra_bits--) {
1297 if (*tdi_p & tdi_mask) {
1298 x |= dtc_mask;
1301 dtc_mask >>= 1;
1303 tdi_mask <<= 1;
1304 if (tdi_mask == 0) {
1305 tdi_p++;
1306 tdi_mask = 1;
1310 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = x;
1314 /* Schedule the last bit into the DTC command buffer */
1316 /* make sure there's room for one cmd byte and one reply byte
1317 * for in or inout scans*/
1318 dtc_queue_run_if_full(1, type == SCAN_OUT ? 0 : 1);
1320 if (type == SCAN_OUT) {
1321 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
1322 DTC_CMD_SHIFT_TMS_TDI_BIT_PAIR(1, (*tdi_p & tdi_mask), 0);
1324 } else {
1325 if (dtc_queue_enqueue_reply(
1326 type, buffer, scan_size, tdi_bit_offset,
1329 ) == NULL) {
1330 LOG_ERROR("enqueuing DTC reply entry: %s", strerror(errno));
1331 exit(1);
1334 dtc_queue.reply_index++;
1336 dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
1337 DTC_CMD_SHIFT_TMS_TDI_BIT_PAIR(1, (*tdi_p & tdi_mask), 1);
1340 /* Move to pause state */
1341 tap_state_queue_append(0);
1342 tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
1343 if (tap_get_state() != tap_get_end_state()) rlink_state_move();
1345 return(0);
1349 static
1350 int rlink_execute_queue(void)
1352 struct jtag_command *cmd = jtag_command_queue; /* currently processed command */
1353 int scan_size;
1354 enum scan_type type;
1355 uint8_t *buffer;
1356 int retval, tmp_retval;
1358 /* return ERROR_OK, unless something goes wrong */
1359 retval = ERROR_OK;
1361 #ifndef AUTOMATIC_BUSY_LED
1362 /* turn LED on */
1363 ep1_generic_commandl(pHDev, 2,
1364 EP1_CMD_SET_PORTD_LEDS,
1365 ~(ST7_PD_NBUSY_LED)
1367 #endif
1369 while (cmd)
1371 switch (cmd->type)
1373 case JTAG_RUNTEST:
1374 case JTAG_TLR_RESET:
1375 case JTAG_PATHMOVE:
1376 case JTAG_SCAN:
1377 break;
1379 default:
1380 /* some events, such as resets, need a queue flush to ensure consistency */
1381 tap_state_queue_run();
1382 dtc_queue_run();
1383 break;
1386 switch (cmd->type)
1388 case JTAG_RESET:
1389 #ifdef _DEBUG_JTAG_IO_
1390 LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1391 #endif
1392 if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
1394 tap_set_state(TAP_RESET);
1396 rlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
1397 break;
1398 case JTAG_RUNTEST:
1399 #ifdef _DEBUG_JTAG_IO_
1400 LOG_DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
1401 #endif
1402 if (cmd->cmd.runtest->end_state != -1)
1403 rlink_end_state(cmd->cmd.runtest->end_state);
1404 rlink_runtest(cmd->cmd.runtest->num_cycles);
1405 break;
1406 case JTAG_TLR_RESET:
1407 #ifdef _DEBUG_JTAG_IO_
1408 LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
1409 #endif
1410 if (cmd->cmd.statemove->end_state != -1)
1411 rlink_end_state(cmd->cmd.statemove->end_state);
1412 rlink_state_move();
1413 break;
1414 case JTAG_PATHMOVE:
1415 #ifdef _DEBUG_JTAG_IO_
1416 LOG_DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
1417 #endif
1418 rlink_path_move(cmd->cmd.pathmove);
1419 break;
1420 case JTAG_SCAN:
1421 #ifdef _DEBUG_JTAG_IO_
1422 LOG_DEBUG("%s scan end in %i", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", cmd->cmd.scan->end_state);
1423 #endif
1424 if (cmd->cmd.scan->end_state != -1)
1425 rlink_end_state(cmd->cmd.scan->end_state);
1426 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
1427 type = jtag_scan_type(cmd->cmd.scan);
1428 if (rlink_scan(cmd, type, buffer, scan_size) != ERROR_OK) {
1429 retval = ERROR_FAIL;
1431 break;
1432 case JTAG_SLEEP:
1433 #ifdef _DEBUG_JTAG_IO_
1434 LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
1435 #endif
1436 jtag_sleep(cmd->cmd.sleep->us);
1437 break;
1438 default:
1439 LOG_ERROR("BUG: unknown JTAG command type encountered");
1440 exit(-1);
1442 cmd = cmd->next;
1445 /* Flush the DTC queue to make sure any pending reads have been done before exiting this function */
1446 tap_state_queue_run();
1447 tmp_retval = dtc_queue_run();
1448 if (tmp_retval != ERROR_OK) {
1449 retval = tmp_retval;
1452 #ifndef AUTOMATIC_BUSY_LED
1453 /* turn LED onff */
1454 ep1_generic_commandl(pHDev, 2,
1455 EP1_CMD_SET_PORTD_LEDS,
1458 #endif
1460 return retval;
1464 /* Using an unindexed table because it is infrequently accessed and it is short. The table must be in order of ascending speed (and descending prescaler), as it is scanned in reverse. */
1466 static
1467 int rlink_speed(int speed)
1469 int i;
1471 if (speed == 0) {
1472 /* fastest speed */
1473 speed = rlink_speed_table[rlink_speed_table_size - 1].prescaler;
1476 for (i = rlink_speed_table_size; i--;) {
1477 if (rlink_speed_table[i].prescaler == speed) {
1478 if (dtc_load_from_buffer(pHDev, rlink_speed_table[i].dtc, rlink_speed_table[i].dtc_size) != 0) {
1479 LOG_ERROR("An error occurred while trying to load DTC code for speed \"%d\".", speed);
1480 exit(1);
1483 if (dtc_start_download() < 0) {
1484 LOG_ERROR("starting DTC: %s", usb_strerror());
1485 exit(1);
1488 return ERROR_OK;
1492 LOG_ERROR("%d is not a supported speed", speed);
1493 return(ERROR_FAIL);
1497 static
1498 int rlink_speed_div(
1499 int speed,
1500 int *khz
1502 int i;
1504 for (i = rlink_speed_table_size; i--;) {
1505 if (rlink_speed_table[i].prescaler == speed) {
1506 *khz = rlink_speed_table[i].khz;
1507 return(ERROR_OK);
1511 LOG_ERROR("%d is not a supported speed", speed);
1512 return(ERROR_FAIL);
1516 static
1517 int rlink_khz(
1518 int khz,
1519 int *speed
1521 int i;
1523 if (khz == 0) {
1524 LOG_ERROR("RCLK not supported");
1525 return ERROR_FAIL;
1528 for (i = rlink_speed_table_size; i--;) {
1529 if (rlink_speed_table[i].khz <= khz) {
1530 *speed = rlink_speed_table[i].prescaler;
1531 return(ERROR_OK);
1535 LOG_WARNING("The lowest supported JTAG speed is %d KHz", rlink_speed_table[0].khz);
1536 *speed = rlink_speed_table[0].prescaler;
1537 return(ERROR_OK);
1541 static
1542 int rlink_init(void)
1544 int i, j, retries;
1545 uint8_t reply_buffer[USB_EP1IN_SIZE];
1547 usb_init();
1548 const uint16_t vids[] = { USB_IDVENDOR, 0 };
1549 const uint16_t pids[] = { USB_IDPRODUCT, 0 };
1550 if (jtag_usb_open(vids, pids, &pHDev) != ERROR_OK)
1551 return ERROR_FAIL;
1553 struct usb_device *dev = usb_device(pHDev);
1554 if (dev->descriptor.bNumConfigurations > 1)
1556 LOG_ERROR("Whoops! NumConfigurations is not 1, don't know what to do...");
1557 return ERROR_FAIL;
1559 if (dev->config->bNumInterfaces > 1)
1561 LOG_ERROR("Whoops! NumInterfaces is not 1, don't know what to do...");
1562 return ERROR_FAIL;
1565 LOG_DEBUG("Opened device, pHDev = %p", pHDev);
1567 /* usb_set_configuration required under win32 */
1568 usb_set_configuration(pHDev, dev->config[0].bConfigurationValue);
1570 retries = 3;
1573 i = usb_claim_interface(pHDev,0);
1574 if (i)
1576 LOG_ERROR("usb_claim_interface: %s", usb_strerror());
1577 #ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
1578 j = usb_detach_kernel_driver_np(pHDev, 0);
1579 if (j)
1580 LOG_ERROR("detach kernel driver: %s", usb_strerror());
1581 #endif
1583 else
1585 LOG_DEBUG("interface claimed!");
1586 break;
1588 } while (--retries);
1590 if (i)
1592 LOG_ERROR("Initialisation failed.");
1593 return ERROR_FAIL;
1595 if (usb_set_altinterface(pHDev,0) != 0)
1597 LOG_ERROR("Failed to set interface.");
1598 return ERROR_FAIL;
1601 /* The device starts out in an unknown state on open. As such,
1602 * result reads time out, and it's not even known whether the
1603 * command was accepted. So, for this first command, we issue
1604 * it repeatedly until its response doesn't time out. Also, if
1605 * sending a command is going to time out, we find that out here.
1607 * It must be possible to open the device in such a way that
1608 * this special magic isn't needed, but, so far, it escapes us.
1610 for (i = 0; i < 5; i++) {
1611 j = ep1_generic_commandl(
1612 pHDev, 1,
1613 EP1_CMD_GET_FWREV
1615 if (j < USB_EP1OUT_SIZE) {
1616 LOG_ERROR("USB write error: %s", usb_strerror());
1617 return(ERROR_FAIL);
1619 j = usb_bulk_read(
1620 pHDev, USB_EP1IN_ADDR,
1621 (char *)reply_buffer, sizeof(reply_buffer),
1624 if (j != -ETIMEDOUT) break;
1627 if (j < (int)sizeof(reply_buffer)) {
1628 LOG_ERROR("USB read error: %s", usb_strerror());
1629 return(ERROR_FAIL);
1631 LOG_DEBUG(INTERFACE_NAME" firmware version: %d.%d.%d", reply_buffer[0], reply_buffer[1], reply_buffer[2]);
1633 if ((reply_buffer[0] != 0) || (reply_buffer[1] != 0) || (reply_buffer[2] != 3)) {
1634 LOG_WARNING("The rlink device is not of the version that the developers have played with. It may or may not work.");
1637 /* Probe port E for adapter presence */
1638 ep1_generic_commandl(
1639 pHDev, 16,
1640 EP1_CMD_MEMORY_WRITE, /* Drive sense pin with 0 */
1641 ST7_PEDR >> 8,
1642 ST7_PEDR,
1644 0x00, /* DR */
1645 ST7_PE_ADAPTER_SENSE_OUT, /* DDR */
1646 ST7_PE_ADAPTER_SENSE_OUT, /* OR */
1647 EP1_CMD_MEMORY_READ, /* Read back */
1648 ST7_PEDR >> 8,
1649 ST7_PEDR,
1651 EP1_CMD_MEMORY_WRITE, /* Drive sense pin with 1 */
1652 ST7_PEDR >> 8,
1653 ST7_PEDR,
1655 ST7_PE_ADAPTER_SENSE_OUT
1658 usb_bulk_read(
1659 pHDev, USB_EP1IN_ADDR,
1660 (char *)reply_buffer, 1,
1661 USB_TIMEOUT_MS
1664 if ((reply_buffer[0] & ST7_PE_ADAPTER_SENSE_IN) != 0) {
1665 LOG_WARNING("target detection problem");
1668 ep1_generic_commandl(
1669 pHDev, 11,
1670 EP1_CMD_MEMORY_READ, /* Read back */
1671 ST7_PEDR >> 8,
1672 ST7_PEDR,
1674 EP1_CMD_MEMORY_WRITE, /* float port E */
1675 ST7_PEDR >> 8,
1676 ST7_PEDR,
1678 0x00, /* DR */
1679 0x00, /* DDR */
1680 0x00 /* OR */
1683 usb_bulk_read(
1684 pHDev, USB_EP1IN_ADDR,
1685 (char *)reply_buffer, 1,
1686 USB_TIMEOUT_MS
1690 if ((reply_buffer[0] & ST7_PE_ADAPTER_SENSE_IN) == 0) {
1691 LOG_WARNING("target not plugged in");
1694 /* float ports A and B */
1695 ep1_generic_commandl(
1696 pHDev, 11,
1697 EP1_CMD_MEMORY_WRITE,
1698 ST7_PADDR >> 8,
1699 ST7_PADDR,
1701 0x00,
1702 0x00,
1703 EP1_CMD_MEMORY_WRITE,
1704 ST7_PBDDR >> 8,
1705 ST7_PBDDR,
1707 0x00
1710 /* make sure DTC is stopped, set VPP control, set up ports A and B */
1711 ep1_generic_commandl(
1712 pHDev, 14,
1713 EP1_CMD_DTC_STOP,
1714 EP1_CMD_SET_PORTD_VPP,
1715 ~(ST7_PD_VPP_SHDN),
1716 EP1_CMD_MEMORY_WRITE,
1717 ST7_PADR >> 8,
1718 ST7_PADR,
1720 ((~(0)) & (ST7_PA_NTRST)),
1721 (ST7_PA_NTRST),
1722 /* port B has no OR, and we want to emulate open drain on NSRST, so we set DR to 0 here and later assert NSRST by setting DDR bit to 1. */
1723 EP1_CMD_MEMORY_WRITE,
1724 ST7_PBDR >> 8,
1725 ST7_PBDR,
1727 0x00
1730 /* set LED updating mode and make sure they're unlit */
1731 ep1_generic_commandl(
1732 pHDev, 3,
1733 #ifdef AUTOMATIC_BUSY_LED
1734 EP1_CMD_LEDUE_BUSY,
1735 #else
1736 EP1_CMD_LEDUE_NONE,
1737 #endif
1738 EP1_CMD_SET_PORTD_LEDS,
1742 tap_state_queue_init();
1743 dtc_queue_init();
1744 rlink_reset(0, 0);
1746 return ERROR_OK;
1750 static
1751 int rlink_quit(void)
1753 /* stop DTC and make sure LEDs are off */
1754 ep1_generic_commandl(
1755 pHDev, 6,
1756 EP1_CMD_DTC_STOP,
1757 EP1_CMD_LEDUE_NONE,
1758 EP1_CMD_SET_PORTD_LEDS,
1760 EP1_CMD_SET_PORTD_VPP,
1764 usb_release_interface(pHDev,0);
1765 usb_close(pHDev);
1768 return ERROR_OK;
1772 struct jtag_interface rlink_interface =
1774 .name = "rlink",
1775 .init = rlink_init,
1776 .quit = rlink_quit,
1777 .speed = rlink_speed,
1778 .speed_div = rlink_speed_div,
1779 .khz = rlink_khz,
1780 .execute_queue = rlink_execute_queue,