1 /***************************************************************************
2 * Copyright (C) 2007 by Benedikt Sauter *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
22 * This file is based on Dominic Rath's amt_jtagaccel.c.
24 * usbprog is a free programming adapter. You can easily install
25 * different firmware versions from an "online pool" over USB.
26 * The adapter can be used for programming and debugging AVR and ARM
27 * processors, as USB to RS232 converter, as JTAG interface or as
28 * simple I/O interface (5 lines).
30 * http://www.embedded-projects.net/usbprog
37 #include "interface.h"
52 static void usbprog_end_state(tap_state_t state
);
53 static void usbprog_state_move(void);
54 static void usbprog_path_move(struct pathmove_command
*cmd
);
55 static void usbprog_runtest(int num_cycles
);
56 static void usbprog_scan(bool ir_scan
, enum scan_type type
, uint8_t *buffer
, int scan_size
);
58 #define UNKOWN_COMMAND 0x00
59 #define PORT_DIRECTION 0x01
62 #define PORT_SETBIT 0x04
63 #define PORT_GETBIT 0x05
64 #define WRITE_TDI 0x06
66 #define WRITE_AND_READ 0x08
67 #define WRITE_TMS 0x09
68 #define WRITE_TMS_CHAIN 0x0A
72 struct usb_dev_handle
* usb_handle
;
75 static struct usbprog_jtag
* usbprog_jtag_handle
;
77 static struct usbprog_jtag
* usbprog_jtag_open(void);
78 //static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag);
79 static void usbprog_jtag_init(struct usbprog_jtag
*usbprog_jtag
);
80 static unsigned char usbprog_jtag_message(struct usbprog_jtag
*usbprog_jtag
, char *msg
, int msglen
);
82 static void usbprog_jtag_read_tdo(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
83 static void usbprog_jtag_write_tdi(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
84 static void usbprog_jtag_write_and_read(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
85 static void usbprog_jtag_write_tms(struct usbprog_jtag
*usbprog_jtag
, char tms_scan
);
87 static char tms_chain
[64];
88 static int tms_chain_index
;
90 static void usbprog_jtag_tms_collect(char tms_scan
);
91 static void usbprog_jtag_tms_send(struct usbprog_jtag
*usbprog_jtag
);
93 static void usbprog_write(int tck
, int tms
, int tdi
);
94 static void usbprog_reset(int trst
, int srst
);
96 static void usbprog_jtag_set_direction(struct usbprog_jtag
*usbprog_jtag
, unsigned char direction
);
97 static void usbprog_jtag_write_slice(struct usbprog_jtag
*usbprog_jtag
,unsigned char value
);
98 //static unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag);
99 static void usbprog_jtag_set_bit(struct usbprog_jtag
*usbprog_jtag
,int bit
, int value
);
100 //static int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit);
102 static int usbprog_speed(int speed
)
107 static int usbprog_execute_queue(void)
109 struct jtag_command
*cmd
= jtag_command_queue
; /* currently processed command */
119 #ifdef _DEBUG_JTAG_IO_
120 LOG_DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
122 if (cmd
->cmd
.reset
->trst
== 1)
124 tap_set_state(TAP_RESET
);
126 usbprog_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
129 #ifdef _DEBUG_JTAG_IO_
130 LOG_DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
132 usbprog_end_state(cmd
->cmd
.runtest
->end_state
);
133 usbprog_runtest(cmd
->cmd
.runtest
->num_cycles
);
136 #ifdef _DEBUG_JTAG_IO_
137 LOG_DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
139 usbprog_end_state(cmd
->cmd
.statemove
->end_state
);
140 usbprog_state_move();
143 #ifdef _DEBUG_JTAG_IO_
144 LOG_DEBUG("pathmove: %i states, end in %i", cmd
->cmd
.pathmove
->num_states
,
145 cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
147 usbprog_path_move(cmd
->cmd
.pathmove
);
150 #ifdef _DEBUG_JTAG_IO_
151 LOG_DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
153 usbprog_end_state(cmd
->cmd
.scan
->end_state
);
154 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
155 type
= jtag_scan_type(cmd
->cmd
.scan
);
156 usbprog_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
157 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
158 return ERROR_JTAG_QUEUE_FAILED
;
163 #ifdef _DEBUG_JTAG_IO_
164 LOG_DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
166 jtag_sleep(cmd
->cmd
.sleep
->us
);
169 LOG_ERROR("BUG: unknown JTAG command type encountered");
179 static int usbprog_init(void)
181 usbprog_jtag_handle
= usbprog_jtag_open();
184 if (usbprog_jtag_handle
== 0)
186 LOG_ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
187 return ERROR_JTAG_INIT_FAILED
;
190 LOG_INFO("USB JTAG Interface ready!");
192 usbprog_jtag_init(usbprog_jtag_handle
);
194 usbprog_write(0, 0, 0);
199 static int usbprog_quit(void)
204 /*************** jtag execute commands **********************/
205 static void usbprog_end_state(tap_state_t state
)
207 if (tap_is_state_stable(state
))
208 tap_set_end_state(state
);
211 LOG_ERROR("BUG: %i is not a valid end state", state
);
216 static void usbprog_state_move(void)
219 uint8_t tms_scan
= tap_get_tms_path(tap_get_state(), tap_get_end_state());
220 int tms_count
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
222 usbprog_jtag_write_tms(usbprog_jtag_handle
, (char)tms_scan
);
223 for (i
= 0; i
< tms_count
; i
++)
225 tms
= (tms_scan
>> i
) & 1;
228 tap_set_state(tap_get_end_state());
231 static void usbprog_path_move(struct pathmove_command
*cmd
)
233 int num_states
= cmd
->num_states
;
236 /* There may be queued transitions, and before following a specified
237 path, we must flush those queued transitions */
238 usbprog_jtag_tms_send(usbprog_jtag_handle
);
243 if (tap_state_transition(tap_get_state(), false) == cmd
->path
[state_count
])
246 usbprog_write(0, 0, 0);
247 usbprog_write(1, 0, 0);
249 else if (tap_state_transition(tap_get_state(), true) == cmd
->path
[state_count
])
252 usbprog_write(0, 1, 0);
253 usbprog_write(1, 1, 0);
257 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd
->path
[state_count
]));
261 tap_set_state(cmd
->path
[state_count
]);
266 tap_set_end_state(tap_get_state());
269 static void usbprog_runtest(int num_cycles
)
273 /* only do a state_move when we're not already in IDLE */
274 if (tap_get_state() != TAP_IDLE
)
276 usbprog_end_state(TAP_IDLE
);
277 usbprog_state_move();
280 /* execute num_cycles */
283 usbprog_jtag_tms_send(usbprog_jtag_handle
);
284 usbprog_write(0, 0, 0);
288 usbprog_jtag_tms_send(usbprog_jtag_handle
);
289 /* LOG_INFO("NUM CYCLES %i",num_cycles); */
292 for (i
= 0; i
< num_cycles
; i
++)
294 usbprog_write(1, 0, 0);
295 usbprog_write(0, 0, 0);
298 #ifdef _DEBUG_JTAG_IO_
299 LOG_DEBUG("runtest: cur_state %s end_state %s", tap_state_name(tap_get_state()), tap_state_name(tap_get_end_state()));
302 /* finish in end_state */
304 usbprog_end_state(saved_end_state);
305 if (tap_get_state() != tap_get_end_state())
306 usbprog_state_move();
310 static void usbprog_scan(bool ir_scan
, enum scan_type type
, uint8_t *buffer
, int scan_size
)
312 tap_state_t saved_end_state
= tap_get_end_state();
315 usbprog_end_state(TAP_IRSHIFT
);
317 usbprog_end_state(TAP_DRSHIFT
);
319 /* Only move if we're not already there */
320 if (tap_get_state() != tap_get_end_state())
321 usbprog_state_move();
323 usbprog_end_state(saved_end_state
);
325 usbprog_jtag_tms_send(usbprog_jtag_handle
);
327 void (*f
)(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
329 case SCAN_OUT
: f
= &usbprog_jtag_write_tdi
; break;
330 case SCAN_IN
: f
= &usbprog_jtag_read_tdo
; break;
331 case SCAN_IO
: f
= &usbprog_jtag_write_and_read
; break;
333 LOG_ERROR("unknown scan type: %i", type
);
336 f(usbprog_jtag_handle
, (char *)buffer
, scan_size
);
338 /* The adapter does the transition to PAUSE internally */
340 tap_set_state(TAP_IRPAUSE
);
342 tap_set_state(TAP_DRPAUSE
);
344 if (tap_get_state() != tap_get_end_state())
345 usbprog_state_move();
348 /*************** jtag wrapper functions *********************/
350 static void usbprog_write(int tck
, int tms
, int tdi
)
352 unsigned char output_value
= 0x00;
355 output_value
|= (1 << TMS_BIT
);
357 output_value
|= (1 << TDI_BIT
);
359 output_value
|= (1 << TCK_BIT
);
361 usbprog_jtag_write_slice(usbprog_jtag_handle
,output_value
);
364 /* (1) assert or (0) deassert reset lines */
365 static void usbprog_reset(int trst
, int srst
)
367 LOG_DEBUG("trst: %i, srst: %i", trst
, srst
);
370 usbprog_jtag_set_bit(usbprog_jtag_handle
, 5, 0);
372 usbprog_jtag_set_bit(usbprog_jtag_handle
, 5, 1);
375 usbprog_jtag_set_bit(usbprog_jtag_handle
, 4, 0);
377 usbprog_jtag_set_bit(usbprog_jtag_handle
, 4, 1);
380 /*************** jtag lowlevel functions ********************/
382 struct usb_bus
*busses
;
384 struct usbprog_jtag
* usbprog_jtag_open(void)
387 struct usb_device
*dev
;
389 struct usbprog_jtag
*tmp
;
391 tmp
= (struct usbprog_jtag
*)malloc(sizeof(struct usbprog_jtag
));
398 busses
= usb_get_busses();
400 /* find usbprog_jtag device in usb bus */
402 for (bus
= busses
; bus
; bus
= bus
->next
)
404 for (dev
= bus
->devices
; dev
; dev
= dev
->next
)
406 /* condition for sucessfully hit (too bad, I only check the vendor id)*/
407 if (dev
->descriptor
.idVendor
== VID
&& dev
->descriptor
.idProduct
== PID
)
409 tmp
->usb_handle
= usb_open(dev
);
410 usb_set_configuration(tmp
->usb_handle
, 1);
411 usb_claim_interface(tmp
->usb_handle
, 0);
412 usb_set_altinterface(tmp
->usb_handle
, 0);
422 static void usbprog_jtag_close(struct usbprog_jtag
*usbprog_jtag
)
424 usb_close(usbprog_jtag
->usb_handle
);
429 static unsigned char usbprog_jtag_message(struct usbprog_jtag
*usbprog_jtag
, char *msg
, int msglen
)
431 int res
= usb_bulk_write(usbprog_jtag
->usb_handle
, 3, msg
,msglen
, 100);
432 if ((msg
[0] == 2) || (msg
[0] == 1) || (msg
[0] == 4) || (msg
[0] == 0) || \
433 (msg
[0] == 6) || (msg
[0] == 0x0A) || (msg
[0] == 9))
437 /* LOG_INFO("HALLLLOOO %i",(int)msg[0]); */
438 res
= usb_bulk_read(usbprog_jtag
->usb_handle
, 0x82, msg
, 2, 100);
440 return (unsigned char)msg
[1];
449 static void usbprog_jtag_init(struct usbprog_jtag
*usbprog_jtag
)
451 usbprog_jtag_set_direction(usbprog_jtag
, 0xFE);
454 static void usbprog_jtag_write_and_read(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
)
456 char tmp
[64]; /* fastes packet size for usb controller */
457 int send_bits
, bufindex
= 0, fillindex
= 0, i
, loops
;
460 /* 61 byte can be transfered (488 bit) */
477 tmp
[0] = WRITE_AND_READ
;
478 tmp
[1] = (char)(send_bits
>> 8); /* high */
479 tmp
[2] = (char)(send_bits
); /* low */
482 for (i
= 0; i
< loops
; i
++)
484 tmp
[3 + i
] = buffer
[bufindex
];
488 if (usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, 64, 1000) == 64)
490 /* LOG_INFO("HALLLLOOO2 %i",(int)tmp[0]); */
493 while (usb_bulk_read(usbprog_jtag
->usb_handle
, 0x82, tmp
, 64, 1000) < 1)
500 for (i
= 0; i
< loops
; i
++)
503 buffer
[fillindex
++] = swap
;
509 static void usbprog_jtag_read_tdo(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
)
511 char tmp
[64]; /* fastes packet size for usb controller */
512 int send_bits
, fillindex
= 0, i
, loops
;
515 /* 61 byte can be transfered (488 bit) */
532 tmp
[0] = WRITE_AND_READ
;
533 tmp
[1] = (char)(send_bits
>> 8); /* high */
534 tmp
[2] = (char)(send_bits
); /* low */
536 usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, 3, 1000);
538 /* LOG_INFO("HALLLLOOO3 %i",(int)tmp[0]); */
541 while (usb_bulk_read(usbprog_jtag
->usb_handle
, 0x82, tmp
, 64, 10) < 1)
548 for (i
= 0; i
< loops
; i
++)
551 buffer
[fillindex
++] = swap
;
556 static void usbprog_jtag_write_tdi(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
)
558 char tmp
[64]; /* fastes packet size for usb controller */
559 int send_bits
, bufindex
= 0, i
, loops
;
561 /* 61 byte can be transfered (488 bit) */
574 /* if (loops == 0) */
579 tmp
[1] = (char)(send_bits
>> 8); /* high */
580 tmp
[2] = (char)(send_bits
); /* low */
583 for (i
= 0; i
< loops
; i
++)
585 tmp
[3 + i
] = buffer
[bufindex
];
588 usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, 64, 1000);
592 static void usbprog_jtag_write_tms(struct usbprog_jtag
*usbprog_jtag
, char tms_scan
)
594 usbprog_jtag_tms_collect(tms_scan
);
597 static void usbprog_jtag_set_direction(struct usbprog_jtag
*usbprog_jtag
, unsigned char direction
)
600 tmp
[0] = PORT_DIRECTION
;
601 tmp
[1] = (char)direction
;
602 usbprog_jtag_message(usbprog_jtag
, tmp
, 2);
605 static void usbprog_jtag_write_slice(struct usbprog_jtag
*usbprog_jtag
,unsigned char value
)
609 tmp
[1] = (char)value
;
610 usbprog_jtag_message(usbprog_jtag
, tmp
, 2);
614 static unsigned char usbprog_jtag_get_port(struct usbprog_jtag
*usbprog_jtag
)
619 return usbprog_jtag_message(usbprog_jtag
, tmp
, 2);
623 static void usbprog_jtag_set_bit(struct usbprog_jtag
*usbprog_jtag
,int bit
, int value
)
626 tmp
[0] = PORT_SETBIT
;
632 usbprog_jtag_message(usbprog_jtag
, tmp
, 3);
636 static int usbprog_jtag_get_bit(struct usbprog_jtag
*usbprog_jtag
, int bit
)
639 tmp
[0] = PORT_GETBIT
;
642 if (usbprog_jtag_message(usbprog_jtag
, tmp
, 2) > 0)
649 static void usbprog_jtag_tms_collect(char tms_scan
)
651 tms_chain
[tms_chain_index
] = tms_scan
;
655 static void usbprog_jtag_tms_send(struct usbprog_jtag
*usbprog_jtag
)
658 /* LOG_INFO("TMS SEND"); */
659 if (tms_chain_index
> 0)
661 char tmp
[tms_chain_index
+ 2];
662 tmp
[0] = WRITE_TMS_CHAIN
;
663 tmp
[1] = (char)(tms_chain_index
);
664 for (i
= 0; i
< tms_chain_index
+ 1; i
++)
665 tmp
[2 + i
] = tms_chain
[i
];
666 usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, tms_chain_index
+ 2, 1000);
671 struct jtag_interface usbprog_interface
= {
673 .execute_queue
= &usbprog_execute_queue
,
674 .speed
= &usbprog_speed
,
675 .init
= &usbprog_init
,
676 .quit
= &usbprog_quit
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)