1 /***************************************************************************
2 * Copyright (C) 2009-2010 by Simon Qian <SimonQian@SimonQian.com> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
16 ***************************************************************************/
18 /* Versaloon is a programming tool for multiple MCUs.
19 * It's distributed under GPLv3.
20 * You can find it at http://www.Versaloon.com/.
27 #include <jtag/adapter.h>
28 #include <jtag/interface.h>
29 #include <jtag/commands.h>
33 #include "versaloon/versaloon_include.h"
34 #include "versaloon/versaloon.h"
36 static int vsllink_tms_offset
;
38 struct pending_scan_result
{
41 int length
; /* Number of bits to read */
42 struct scan_command
*command
; /* Corresponding scan command */
45 bool last
; /* indicate the last scan pending */
48 #define MAX_PENDING_SCAN_RESULTS 256
50 static int pending_scan_results_length
;
51 static struct pending_scan_result
52 pending_scan_results_buffer
[MAX_PENDING_SCAN_RESULTS
];
54 /* Queue command functions */
55 static void vsllink_end_state(tap_state_t state
);
56 static void vsllink_state_move(void);
57 static void vsllink_path_move(int num_states
, tap_state_t
*path
);
58 static void vsllink_tms(int num_bits
, const uint8_t *bits
);
59 static void vsllink_runtest(int num_cycles
);
60 static void vsllink_stableclocks(int num_cycles
, int tms
);
61 static void vsllink_scan(bool ir_scan
, enum scan_type type
,
62 uint8_t *buffer
, int scan_size
, struct scan_command
*command
);
63 static int vsllink_reset(int trst
, int srst
);
65 /* VSLLink tap buffer functions */
66 static void vsllink_tap_append_step(int tms
, int tdi
);
67 static void vsllink_tap_init(void);
68 static int vsllink_tap_execute(void);
69 static void vsllink_tap_ensure_pending(int scans
);
70 static void vsllink_tap_append_scan(int length
, uint8_t *buffer
,
71 struct scan_command
*command
);
73 /* VSLLink SWD functions */
74 static int_least32_t vsllink_swd_frequency(int_least32_t hz
);
75 static int vsllink_swd_switch_seq(enum swd_special_seq seq
);
77 /* VSLLink lowlevel functions */
79 struct libusb_context
*libusb_ctx
;
80 struct libusb_device_handle
*usb_device_handle
;
83 static int vsllink_usb_open(struct vsllink
*vsllink
);
84 static void vsllink_usb_close(struct vsllink
*vsllink
);
86 static void vsllink_debug_buffer(uint8_t *buffer
, int length
);
88 static int tap_length
;
89 static int tap_buffer_size
;
90 static uint8_t *tms_buffer
;
91 static uint8_t *tdi_buffer
;
92 static uint8_t *tdo_buffer
;
96 static struct vsllink
*vsllink_handle
;
98 static int vsllink_execute_queue(void)
100 struct jtag_command
*cmd
= jtag_command_queue
;
105 LOG_DEBUG_IO("-------------------------------------"
107 "-------------------------------------");
112 LOG_DEBUG_IO("runtest %i cycles, end in %s",
113 cmd
->cmd
.runtest
->num_cycles
,
114 tap_state_name(cmd
->cmd
.runtest
->end_state
));
116 vsllink_end_state(cmd
->cmd
.runtest
->end_state
);
117 vsllink_runtest(cmd
->cmd
.runtest
->num_cycles
);
121 LOG_DEBUG_IO("statemove end in %s",
122 tap_state_name(cmd
->cmd
.statemove
->end_state
));
124 vsllink_end_state(cmd
->cmd
.statemove
->end_state
);
125 vsllink_state_move();
129 LOG_DEBUG_IO("pathmove: %i states, end in %s",
130 cmd
->cmd
.pathmove
->num_states
,
131 tap_state_name(cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]));
133 vsllink_path_move(cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
);
137 LOG_DEBUG_IO("JTAG Scan...");
139 vsllink_end_state(cmd
->cmd
.scan
->end_state
);
141 scan_size
= jtag_build_buffer(
142 cmd
->cmd
.scan
, &buffer
);
144 if (cmd
->cmd
.scan
->ir_scan
)
146 "JTAG Scan write IR(%d bits), "
149 tap_state_name(cmd
->cmd
.scan
->end_state
));
153 "JTAG Scan write DR(%d bits), "
156 tap_state_name(cmd
->cmd
.scan
->end_state
));
158 if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO
))
159 vsllink_debug_buffer(buffer
, DIV_ROUND_UP(scan_size
, 8));
161 type
= jtag_scan_type(cmd
->cmd
.scan
);
163 vsllink_scan(cmd
->cmd
.scan
->ir_scan
,
164 type
, buffer
, scan_size
,
169 LOG_DEBUG_IO("sleep %" PRIu32
, cmd
->cmd
.sleep
->us
);
170 vsllink_tap_execute();
171 jtag_sleep(cmd
->cmd
.sleep
->us
);
174 case JTAG_STABLECLOCKS
:
175 LOG_DEBUG_IO("add %d clocks",
176 cmd
->cmd
.stableclocks
->num_cycles
);
178 switch (tap_get_state()) {
180 /* tms must be '1' to stay
190 /* else, tms should be '0' */
193 /* above stable states are OK */
195 LOG_ERROR("jtag_add_clocks() "
196 "in non-stable state \"%s\"",
197 tap_state_name(tap_get_state())
201 vsllink_stableclocks(cmd
->cmd
.stableclocks
->num_cycles
, scan_size
);
205 LOG_DEBUG_IO("add %d jtag tms",
206 cmd
->cmd
.tms
->num_bits
);
208 vsllink_tms(cmd
->cmd
.tms
->num_bits
, cmd
->cmd
.tms
->bits
);
212 LOG_ERROR("BUG: unknown JTAG command type "
213 "encountered: %d", cmd
->type
);
219 return vsllink_tap_execute();
222 static int vsllink_speed(int speed
)
225 vsllink_swd_frequency(speed
* 1000);
229 versaloon_interface
.adaptors
.jtag_raw
.config(0, (uint16_t)speed
);
230 return versaloon_interface
.adaptors
.peripheral_commit();
233 static int vsllink_khz(int khz
, int *jtag_speed
)
240 static int vsllink_speed_div(int jtag_speed
, int *khz
)
247 static void vsllink_free_buffer(void)
259 static int vsllink_quit(void)
261 versaloon_interface
.adaptors
.gpio
.config(0, GPIO_SRST
| GPIO_TRST
,
262 0, 0, GPIO_SRST
| GPIO_TRST
);
263 versaloon_interface
.adaptors
.gpio
.fini(0);
266 versaloon_interface
.adaptors
.swd
.fini(0);
268 versaloon_interface
.adaptors
.jtag_raw
.fini(0);
270 versaloon_interface
.adaptors
.peripheral_commit();
271 versaloon_interface
.fini();
273 vsllink_free_buffer();
274 vsllink_usb_close(vsllink_handle
);
276 libusb_exit(vsllink_handle
->libusb_ctx
);
277 free(vsllink_handle
);
282 static int vsllink_interface_init(void)
284 vsllink_handle
= malloc(sizeof(struct vsllink
));
285 if (!vsllink_handle
) {
286 LOG_ERROR("unable to allocate memory");
290 libusb_init(&vsllink_handle
->libusb_ctx
);
292 if (vsllink_usb_open(vsllink_handle
) != ERROR_OK
) {
293 LOG_ERROR("Can't find USB JTAG Interface!"
294 "Please check connection and permissions.");
295 return ERROR_JTAG_INIT_FAILED
;
297 LOG_DEBUG("vsllink found on %04X:%04X",
298 versaloon_interface
.usb_setting
.vid
,
299 versaloon_interface
.usb_setting
.pid
);
300 versaloon_usb_device_handle
= vsllink_handle
->usb_device_handle
;
302 if (versaloon_interface
.init() != ERROR_OK
)
304 if (versaloon_interface
.usb_setting
.buf_size
< 32) {
305 versaloon_interface
.fini();
312 static int vsllink_init(void)
314 int retval
= vsllink_interface_init();
315 if (retval
!= ERROR_OK
)
318 versaloon_interface
.adaptors
.gpio
.init(0);
319 versaloon_interface
.adaptors
.gpio
.config(0, GPIO_SRST
, 0, GPIO_SRST
,
321 versaloon_interface
.adaptors
.delay
.delayms(100);
322 versaloon_interface
.adaptors
.peripheral_commit();
325 versaloon_interface
.adaptors
.gpio
.config(0, GPIO_TRST
, 0,
326 GPIO_TRST
, GPIO_TRST
);
327 versaloon_interface
.adaptors
.swd
.init(0);
328 vsllink_swd_frequency(adapter_get_speed_khz() * 1000);
329 vsllink_swd_switch_seq(JTAG_TO_SWD
);
332 /* malloc buffer size for tap */
333 tap_buffer_size
= versaloon_interface
.usb_setting
.buf_size
/ 2 - 32;
334 vsllink_free_buffer();
335 tdi_buffer
= malloc(tap_buffer_size
);
336 tdo_buffer
= malloc(tap_buffer_size
);
337 tms_buffer
= malloc(tap_buffer_size
);
338 if ((!tdi_buffer
) || (!tdo_buffer
) || (!tms_buffer
)) {
343 versaloon_interface
.adaptors
.jtag_raw
.init(0);
344 versaloon_interface
.adaptors
.jtag_raw
.config(0, adapter_get_speed_khz());
345 versaloon_interface
.adaptors
.gpio
.config(0, GPIO_SRST
| GPIO_TRST
,
346 GPIO_TRST
, GPIO_SRST
, GPIO_SRST
);
349 if (versaloon_interface
.adaptors
.peripheral_commit() != ERROR_OK
)
357 /**************************************************************************
358 * Queue command implementations */
360 static void vsllink_end_state(tap_state_t state
)
362 if (tap_is_state_stable(state
))
363 tap_set_end_state(state
);
365 LOG_ERROR("BUG: %i is not a valid end state", state
);
370 /* Goes to the end state. */
371 static void vsllink_state_move(void)
374 uint8_t tms_scan
= tap_get_tms_path(tap_get_state(),
375 tap_get_end_state());
376 uint8_t tms_scan_bits
= tap_get_tms_path_len(tap_get_state(),
377 tap_get_end_state());
379 for (i
= 0; i
< tms_scan_bits
; i
++)
380 vsllink_tap_append_step((tms_scan
>> i
) & 1, 0);
382 tap_set_state(tap_get_end_state());
385 static void vsllink_path_move(int num_states
, tap_state_t
*path
)
387 for (int i
= 0; i
< num_states
; i
++) {
388 if (path
[i
] == tap_state_transition(tap_get_state(), false))
389 vsllink_tap_append_step(0, 0);
390 else if (path
[i
] == tap_state_transition(tap_get_state(), true))
391 vsllink_tap_append_step(1, 0);
393 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
394 tap_state_name(tap_get_state()),
395 tap_state_name(path
[i
]));
399 tap_set_state(path
[i
]);
402 tap_set_end_state(tap_get_state());
405 static void vsllink_tms(int num_bits
, const uint8_t *bits
)
407 for (int i
= 0; i
< num_bits
; i
++)
408 vsllink_tap_append_step((bits
[i
/ 8] >> (i
% 8)) & 1, 0);
411 static void vsllink_stableclocks(int num_cycles
, int tms
)
413 while (num_cycles
> 0) {
414 vsllink_tap_append_step(tms
, 0);
419 static void vsllink_runtest(int num_cycles
)
421 tap_state_t saved_end_state
= tap_get_end_state();
423 if (tap_get_state() != TAP_IDLE
) {
424 /* enter IDLE state */
425 vsllink_end_state(TAP_IDLE
);
426 vsllink_state_move();
429 vsllink_stableclocks(num_cycles
, 0);
433 vsllink_end_state(saved_end_state
);
434 if (tap_get_end_state() != tap_get_end_state())
435 vsllink_state_move();
438 static void vsllink_scan(bool ir_scan
, enum scan_type type
, uint8_t *buffer
,
439 int scan_size
, struct scan_command
*command
)
441 tap_state_t saved_end_state
;
443 saved_end_state
= tap_get_end_state();
445 /* Move to appropriate scan state */
446 vsllink_end_state(ir_scan
? TAP_IRSHIFT
: TAP_DRSHIFT
);
448 if (tap_get_state() != tap_get_end_state())
449 vsllink_state_move();
450 vsllink_end_state(saved_end_state
);
453 vsllink_tap_append_scan(scan_size
, buffer
, command
);
455 /* Goto Pause and record position to insert tms:0 */
456 vsllink_tap_append_step(0, 0);
457 vsllink_tms_offset
= tap_length
;
459 tap_set_state(ir_scan
? TAP_IRPAUSE
: TAP_DRPAUSE
);
461 if (tap_get_state() != tap_get_end_state())
462 vsllink_state_move();
465 static int vsllink_reset(int trst
, int srst
)
467 LOG_DEBUG("trst: %i, srst: %i", trst
, srst
);
470 versaloon_interface
.adaptors
.gpio
.config(0, GPIO_SRST
, 0, GPIO_SRST
, GPIO_SRST
);
472 versaloon_interface
.adaptors
.gpio
.config(0, GPIO_SRST
, GPIO_SRST
, 0, 0);
476 versaloon_interface
.adaptors
.gpio
.out(0, GPIO_TRST
, GPIO_TRST
);
478 versaloon_interface
.adaptors
.gpio
.out(0, GPIO_TRST
, 0);
481 return versaloon_interface
.adaptors
.peripheral_commit();
484 COMMAND_HANDLER(vsllink_handle_usb_vid_command
)
487 return ERROR_COMMAND_SYNTAX_ERROR
;
489 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[0],
490 versaloon_interface
.usb_setting
.vid
);
494 COMMAND_HANDLER(vsllink_handle_usb_pid_command
)
497 return ERROR_COMMAND_SYNTAX_ERROR
;
498 COMMAND_PARSE_NUMBER(u16
, CMD_ARGV
[0],
499 versaloon_interface
.usb_setting
.pid
);
503 COMMAND_HANDLER(vsllink_handle_usb_bulkin_command
)
506 return ERROR_COMMAND_SYNTAX_ERROR
;
508 COMMAND_PARSE_NUMBER(u8
, CMD_ARGV
[0],
509 versaloon_interface
.usb_setting
.ep_in
);
511 versaloon_interface
.usb_setting
.ep_in
|= 0x80;
516 COMMAND_HANDLER(vsllink_handle_usb_bulkout_command
)
519 return ERROR_COMMAND_SYNTAX_ERROR
;
521 COMMAND_PARSE_NUMBER(u8
, CMD_ARGV
[0],
522 versaloon_interface
.usb_setting
.ep_out
);
524 versaloon_interface
.usb_setting
.ep_out
&= ~0x80;
529 COMMAND_HANDLER(vsllink_handle_usb_interface_command
)
532 return ERROR_COMMAND_SYNTAX_ERROR
;
534 COMMAND_PARSE_NUMBER(u8
, CMD_ARGV
[0],
535 versaloon_interface
.usb_setting
.interface
);
539 /**************************************************************************
540 * VSLLink tap functions */
542 static void vsllink_tap_init(void)
545 pending_scan_results_length
= 0;
546 vsllink_tms_offset
= 0;
549 static void vsllink_tap_ensure_pending(int scans
)
551 int available_scans
=
552 MAX_PENDING_SCAN_RESULTS
- pending_scan_results_length
;
554 if (scans
> available_scans
)
555 vsllink_tap_execute();
558 static void vsllink_tap_append_step(int tms
, int tdi
)
560 int index_var
= tap_length
/ 8;
562 int bit_index
= tap_length
% 8;
563 uint8_t bit
= 1 << bit_index
;
566 tms_buffer
[index_var
] |= bit
;
568 tms_buffer
[index_var
] &= ~bit
;
571 tdi_buffer
[index_var
] |= bit
;
573 tdi_buffer
[index_var
] &= ~bit
;
577 if (tap_buffer_size
* 8 <= tap_length
)
578 vsllink_tap_execute();
581 static void vsllink_tap_append_scan(int length
, uint8_t *buffer
,
582 struct scan_command
*command
)
584 struct pending_scan_result
*pending_scan_result
;
585 int len_tmp
, len_all
, i
;
588 while (len_all
< length
) {
589 vsllink_tap_ensure_pending(1);
590 pending_scan_result
=
591 &pending_scan_results_buffer
[
592 pending_scan_results_length
];
594 if ((length
- len_all
) > (tap_buffer_size
* 8 - tap_length
)) {
595 /* Use all memory available
596 vsllink_tap_append_step will commit automatically */
597 len_tmp
= tap_buffer_size
* 8 - tap_length
;
598 pending_scan_result
->last
= false;
600 len_tmp
= length
- len_all
;
601 pending_scan_result
->last
= true;
603 pending_scan_result
->src_offset
= tap_length
;
604 pending_scan_result
->dest_offset
= len_all
;
605 pending_scan_result
->length
= len_tmp
;
606 pending_scan_result
->command
= command
;
607 pending_scan_result
->buffer
= buffer
;
608 pending_scan_results_length
++;
610 for (i
= 0; i
< len_tmp
; i
++) {
611 vsllink_tap_append_step(((len_all
+ i
) < length
-1
613 (buffer
[(len_all
+ i
)/8]
614 >> ((len_all
+ i
)%8)) & 1);
621 static int vsllink_jtag_execute(void)
629 versaloon_interface
.adaptors
.jtag_raw
.execute(0, tdi_buffer
, tms_buffer
,
630 tdo_buffer
, tap_length
);
632 result
= versaloon_interface
.adaptors
.peripheral_commit();
634 if (result
== ERROR_OK
) {
635 for (i
= 0; i
< pending_scan_results_length
; i
++) {
636 struct pending_scan_result
*pending_scan_result
=
637 &pending_scan_results_buffer
[i
];
638 uint8_t *buffer
= pending_scan_result
->buffer
;
639 int length
= pending_scan_result
->length
;
640 int src_first
= pending_scan_result
->src_offset
;
641 int dest_first
= pending_scan_result
->dest_offset
;
642 bool last
= pending_scan_result
->last
;
644 struct scan_command
*command
;
646 command
= pending_scan_result
->command
;
647 buf_set_buf(tdo_buffer
, src_first
, buffer
, dest_first
, length
);
650 "JTAG scan read(%d bits, from src %d bits to dest %d bits):",
651 length
, src_first
, dest_first
);
652 if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO
))
653 vsllink_debug_buffer(buffer
+ dest_first
/ 8, DIV_ROUND_UP(length
, 7));
656 if (jtag_read_buffer(buffer
, command
)
659 return ERROR_JTAG_QUEUE_FAILED
;
662 free(pending_scan_result
->buffer
);
666 LOG_ERROR("vsllink_jtag_execute failure");
667 return ERROR_JTAG_QUEUE_FAILED
;
675 static int vsllink_tap_execute(void)
680 return vsllink_jtag_execute();
683 static int vsllink_swd_init(void)
685 LOG_INFO("VSLLink SWD mode enabled");
691 static int_least32_t vsllink_swd_frequency(int_least32_t hz
)
693 const int_least32_t delay2hz
[] = {
694 1850000, 235000, 130000, 102000, 85000, 72000
698 uint16_t delay
= UINT16_MAX
;
700 for (uint16_t i
= 0; i
< ARRAY_SIZE(delay2hz
); i
++) {
701 if (hz
>= delay2hz
[i
]) {
708 if (delay
== UINT16_MAX
)
709 delay
= (500000 / hz
) - 1;
711 /* Calculate retry count after a WAIT response. This will give
712 * a retry timeout at about ~250 ms. 54 is the number of bits
713 * found in a transaction. */
714 uint16_t retry_count
= 250 * hz
/ 1000 / 54;
716 LOG_DEBUG("SWD delay: %d, retry count: %d", delay
, retry_count
);
718 versaloon_interface
.adaptors
.swd
.config(0, 2, retry_count
, delay
);
724 static int vsllink_swd_switch_seq(enum swd_special_seq seq
)
728 LOG_DEBUG("SWD line reset");
729 versaloon_interface
.adaptors
.swd
.seqout(0, swd_seq_line_reset
,
730 swd_seq_line_reset_len
);
733 LOG_DEBUG("JTAG-to-SWD");
734 versaloon_interface
.adaptors
.swd
.seqout(0, swd_seq_jtag_to_swd
,
735 swd_seq_jtag_to_swd_len
);
738 LOG_DEBUG("SWD-to-JTAG");
739 versaloon_interface
.adaptors
.swd
.seqout(0, swd_seq_swd_to_jtag
,
740 swd_seq_swd_to_jtag_len
);
743 LOG_ERROR("Sequence %d not supported", seq
);
750 static void vsllink_swd_read_reg(uint8_t cmd
, uint32_t *value
, uint32_t ap_delay_clk
)
752 versaloon_interface
.adaptors
.swd
.transact(0, cmd
, value
, NULL
);
755 static void vsllink_swd_write_reg(uint8_t cmd
, uint32_t value
, uint32_t ap_delay_clk
)
757 versaloon_interface
.adaptors
.swd
.transact(0, cmd
, &value
, NULL
);
760 static int vsllink_swd_run_queue(void)
762 return versaloon_interface
.adaptors
.peripheral_commit();
765 /****************************************************************************
766 * VSLLink USB low-level functions */
768 static int vsllink_check_usb_strings(
769 struct libusb_device_handle
*usb_device_handle
,
770 struct libusb_device_descriptor
*usb_desc
)
772 char desc_string
[256];
775 if (adapter_get_required_serial()) {
776 retval
= libusb_get_string_descriptor_ascii(usb_device_handle
,
777 usb_desc
->iSerialNumber
, (unsigned char *)desc_string
,
778 sizeof(desc_string
));
782 if (strncmp(desc_string
, adapter_get_required_serial(),
783 sizeof(desc_string
)))
787 retval
= libusb_get_string_descriptor_ascii(usb_device_handle
,
788 usb_desc
->iProduct
, (unsigned char *)desc_string
,
789 sizeof(desc_string
));
793 if (!strstr(desc_string
, "Versaloon"))
799 static int vsllink_usb_open(struct vsllink
*vsllink
)
801 ssize_t num_devices
, i
;
802 struct libusb_device
**usb_devices
;
803 struct libusb_device_descriptor usb_desc
;
804 struct libusb_device_handle
*usb_device_handle
;
807 num_devices
= libusb_get_device_list(vsllink
->libusb_ctx
, &usb_devices
);
809 if (num_devices
<= 0)
812 for (i
= 0; i
< num_devices
; i
++) {
813 struct libusb_device
*device
= usb_devices
[i
];
815 retval
= libusb_get_device_descriptor(device
, &usb_desc
);
819 if (usb_desc
.idVendor
!= versaloon_interface
.usb_setting
.vid
||
820 usb_desc
.idProduct
!= versaloon_interface
.usb_setting
.pid
)
823 retval
= libusb_open(device
, &usb_device_handle
);
827 retval
= vsllink_check_usb_strings(usb_device_handle
, &usb_desc
);
828 if (retval
== ERROR_OK
)
831 libusb_close(usb_device_handle
);
834 libusb_free_device_list(usb_devices
, 1);
836 if (i
== num_devices
)
839 retval
= libusb_claim_interface(usb_device_handle
,
840 versaloon_interface
.usb_setting
.interface
);
842 LOG_ERROR("unable to claim interface");
843 libusb_close(usb_device_handle
);
847 vsllink
->usb_device_handle
= usb_device_handle
;
851 static void vsllink_usb_close(struct vsllink
*vsllink
)
853 libusb_release_interface(vsllink
->usb_device_handle
,
854 versaloon_interface
.usb_setting
.interface
);
855 libusb_close(vsllink
->usb_device_handle
);
858 #define BYTES_PER_LINE 16
860 static void vsllink_debug_buffer(uint8_t *buffer
, int length
)
867 for (i
= 0; i
< length
; i
+= BYTES_PER_LINE
) {
868 snprintf(line
, 5, "%04x", i
& 0xffff);
869 for (j
= i
; j
< i
+ BYTES_PER_LINE
&& j
< length
; j
++) {
870 snprintf(s
, 4, " %02x", buffer
[j
]);
873 LOG_DEBUG_IO("%s", line
);
877 static const struct command_registration vsllink_subcommand_handlers
[] = {
880 .handler
= &vsllink_handle_usb_vid_command
,
881 .mode
= COMMAND_CONFIG
,
882 .help
= "Set USB VID",
887 .handler
= &vsllink_handle_usb_pid_command
,
888 .mode
= COMMAND_CONFIG
,
889 .help
= "Set USB PID",
893 .name
= "usb_bulkin",
894 .handler
= &vsllink_handle_usb_bulkin_command
,
895 .mode
= COMMAND_CONFIG
,
896 .help
= "Set USB input endpoint",
900 .name
= "usb_bulkout",
901 .handler
= &vsllink_handle_usb_bulkout_command
,
902 .mode
= COMMAND_CONFIG
,
903 .help
= "Set USB output endpoint",
907 .name
= "usb_interface",
908 .handler
= &vsllink_handle_usb_interface_command
,
909 .mode
= COMMAND_CONFIG
,
910 .help
= "Set USB output interface",
911 .usage
= "<interface>",
913 COMMAND_REGISTRATION_DONE
916 static const struct command_registration vsllink_command_handlers
[] = {
920 .help
= "perform vsllink management",
921 .chain
= vsllink_subcommand_handlers
,
924 COMMAND_REGISTRATION_DONE
927 static const char * const vsllink_transports
[] = {"jtag", "swd", NULL
};
929 static const struct swd_driver vsllink_swd_driver
= {
930 .init
= vsllink_swd_init
,
931 .switch_seq
= vsllink_swd_switch_seq
,
932 .read_reg
= vsllink_swd_read_reg
,
933 .write_reg
= vsllink_swd_write_reg
,
934 .run
= vsllink_swd_run_queue
,
937 static struct jtag_interface vsllink_interface
= {
938 .supported
= DEBUG_CAP_TMS_SEQ
,
939 .execute_queue
= vsllink_execute_queue
,
942 struct adapter_driver vsllink_adapter_driver
= {
944 .transports
= vsllink_transports
,
945 .commands
= vsllink_command_handlers
,
947 .init
= vsllink_init
,
948 .quit
= vsllink_quit
,
949 .reset
= vsllink_reset
,
950 .speed
= vsllink_speed
,
952 .speed_div
= vsllink_speed_div
,
954 .jtag_ops
= &vsllink_interface
,
955 .swd_ops
= &vsllink_swd_driver
,
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)