1 /***************************************************************************
2 * Copyright (C) 2007 by Benedikt Sauter sauter@ixbat.de *
3 * based on Dominic Rath's amt_jtagaccel.c *
5 * usbprog is a free programming adapter. You can easily install *
6 * different firmware versions from an "online pool" over USB. *
7 * The adapter can be used for programming and debugging AVR and ARM *
8 * processors, as USB to RS232 converter, as JTAG interface or as *
9 * simple I/O interface (5 lines). *
11 * http://www.embedded-projects.net/usbprog *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
18 * This program is distributed in the hope that it will be useful, *
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
21 * GNU General Public License for more details. *
23 * You should have received a copy of the GNU General Public License *
24 * along with this program; if not, write to the *
25 * Free Software Foundation, Inc., *
26 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
27 ***************************************************************************/
33 #include "replacements.h"
51 int usbprog_execute_queue(void);
52 int usbprog_speed(int speed
);
53 int usbprog_register_commands(struct command_context_s
*cmd_ctx
);
54 int usbprog_init(void);
55 int usbprog_quit(void);
57 void usbprog_end_state(enum tap_state state
);
58 void usbprog_state_move(void);
59 void usbprog_path_move(pathmove_command_t
*cmd
);
60 void usbprog_runtest(int num_cycles
);
61 void usbprog_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
);
63 jtag_interface_t usbprog_interface
=
66 .execute_queue
= usbprog_execute_queue
,
67 .speed
= usbprog_speed
,
68 .register_commands
= usbprog_register_commands
,
73 #define UNKOWN_COMMAND 0x00
74 #define PORT_DIRECTION 0x01
77 #define PORT_SETBIT 0x04
78 #define PORT_GETBIT 0x05
79 #define WRITE_TDI 0x06
81 #define WRITE_AND_READ 0x08
82 #define WRITE_TMS 0x09
83 #define WRITE_TMS_CHAIN 0x0A
87 struct usb_dev_handle
* usb_handle
;
90 struct usbprog_jtag
* usbprog_jtag_handle
;
92 struct usbprog_jtag
* usbprog_jtag_open();
93 void usbprog_jtag_close(struct usbprog_jtag
*usbprog_jtag
);
94 void usbprog_jtag_init(struct usbprog_jtag
*usbprog_jtag
);
95 unsigned char usbprog_jtag_message(struct usbprog_jtag
*usbprog_jtag
, char *msg
, int msglen
);
97 void usbprog_jtag_read_tdo(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
98 void usbprog_jtag_write_tdi(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
99 void usbprog_jtag_write_and_read(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
);
100 void usbprog_jtag_write_tms(struct usbprog_jtag
*usbprog_jtag
, char tms_scan
);
104 void usbprog_jtag_tms_collect(char tms_scan
);
105 void usbprog_jtag_tms_send(struct usbprog_jtag
*usbprog_jtag
);
107 void usbprog_write(int tck
, int tms
, int tdi
);
108 void usbprog_reset(int trst
, int srst
);
110 void usbprog_jtag_set_direction(struct usbprog_jtag
*usbprog_jtag
, unsigned char direction
);
111 void usbprog_jtag_write_slice(struct usbprog_jtag
*usbprog_jtag
,unsigned char value
);
112 unsigned char usbprog_jtag_get_port(struct usbprog_jtag
*usbprog_jtag
);
113 void usbprog_jtag_set_bit(struct usbprog_jtag
*usbprog_jtag
,int bit
, int value
);
114 int usbprog_jtag_get_bit(struct usbprog_jtag
*usbprog_jtag
, int bit
);
116 int usbprog_speed(int speed
)
121 int usbprog_register_commands(struct command_context_s
*cmd_ctx
)
126 int usbprog_execute_queue(void)
128 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
138 #ifdef _DEBUG_JTAG_IO_
139 DEBUG("end_state: %i", cmd
->cmd
.end_state
->end_state
);
141 if (cmd
->cmd
.end_state
->end_state
!= -1)
142 usbprog_end_state(cmd
->cmd
.end_state
->end_state
);
145 #ifdef _DEBUG_JTAG_IO_
146 DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
148 if (cmd
->cmd
.reset
->trst
== 1)
152 usbprog_reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
155 #ifdef _DEBUG_JTAG_IO_
156 DEBUG("runtest %i cycles, end in %i", cmd
->cmd
.runtest
->num_cycles
, cmd
->cmd
.runtest
->end_state
);
158 if (cmd
->cmd
.runtest
->end_state
!= -1)
159 usbprog_end_state(cmd
->cmd
.runtest
->end_state
);
160 usbprog_runtest(cmd
->cmd
.runtest
->num_cycles
);
163 #ifdef _DEBUG_JTAG_IO_
164 DEBUG("statemove end in %i", cmd
->cmd
.statemove
->end_state
);
166 if (cmd
->cmd
.statemove
->end_state
!= -1)
167 usbprog_end_state(cmd
->cmd
.statemove
->end_state
);
168 usbprog_state_move();
171 #ifdef _DEBUG_JTAG_IO_
172 DEBUG("pathmove: %i states, end in %i", cmd
->cmd
.pathmove
->num_states
,
173 cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
175 usbprog_path_move(cmd
->cmd
.pathmove
);
178 #ifdef _DEBUG_JTAG_IO_
179 DEBUG("scan end in %i", cmd
->cmd
.scan
->end_state
);
181 if (cmd
->cmd
.scan
->end_state
!= -1)
182 usbprog_end_state(cmd
->cmd
.scan
->end_state
);
183 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
184 type
= jtag_scan_type(cmd
->cmd
.scan
);
185 usbprog_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
186 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
187 return ERROR_JTAG_QUEUE_FAILED
;
192 #ifdef _DEBUG_JTAG_IO_
193 DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
195 jtag_sleep(cmd
->cmd
.sleep
->us
);
198 ERROR("BUG: unknown JTAG command type encountered");
208 int usbprog_init(void)
210 usbprog_jtag_handle
= usbprog_jtag_open();
213 if (usbprog_jtag_handle
== 0)
215 ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
216 return ERROR_JTAG_INIT_FAILED
;
219 INFO("USB JTAG Interface ready!");
221 usbprog_jtag_init(usbprog_jtag_handle
);
223 usbprog_write(0, 0, 0);
228 int usbprog_quit(void)
233 /*************** jtag execute commands **********************/
234 void usbprog_end_state(enum tap_state state
)
236 if (tap_move_map
[state
] != -1)
240 ERROR("BUG: %i is not a valid end state", state
);
245 void usbprog_state_move(void)
248 u8 tms_scan
= TAP_MOVE(cur_state
, end_state
);
250 usbprog_jtag_write_tms(usbprog_jtag_handle
, (char)tms_scan
);
251 for (i
= 0; i
< 7; i
++)
253 tms
= (tms_scan
>> i
) & 1;
256 cur_state
= end_state
;
259 void usbprog_path_move(pathmove_command_t
*cmd
)
261 int num_states
= cmd
->num_states
;
267 if (tap_transitions
[cur_state
].low
== cmd
->path
[state_count
])
270 usbprog_write(0, 0, 0);
271 usbprog_write(1, 0, 0);
273 else if (tap_transitions
[cur_state
].high
== cmd
->path
[state_count
])
276 usbprog_write(0, 1, 0);
277 usbprog_write(1, 1, 0);
281 ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings
[cur_state
], tap_state_strings
[cmd
->path
[state_count
]]);
285 cur_state
= cmd
->path
[state_count
];
290 end_state
= cur_state
;
293 void usbprog_runtest(int num_cycles
)
297 /* only do a state_move when we're not already in RTI */
298 if (cur_state
!= TAP_RTI
)
300 usbprog_end_state(TAP_RTI
);
301 usbprog_state_move();
304 /* execute num_cycles */
307 usbprog_jtag_tms_send(usbprog_jtag_handle
);
308 usbprog_write(0, 0, 0);
312 usbprog_jtag_tms_send(usbprog_jtag_handle
);
313 //INFO("NUM CYCLES %i",num_cycles);
316 for (i
= 0; i
< num_cycles
; i
++)
318 usbprog_write(1, 0, 0);
319 usbprog_write(0, 0, 0);
322 /* finish in end_state */
324 usbprog_end_state(saved_end_state);
325 if (cur_state != end_state)
326 usbprog_state_move();
330 void usbprog_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
332 enum tap_state saved_end_state
= end_state
;
335 usbprog_end_state(TAP_SI
);
337 usbprog_end_state(TAP_SD
);
339 //usbprog_jtag_tms_send(usbprog_jtag_handle);
341 usbprog_state_move();
342 usbprog_end_state(saved_end_state
);
344 usbprog_jtag_tms_send(usbprog_jtag_handle
);
346 if (type
== SCAN_OUT
)
348 usbprog_jtag_write_tdi(usbprog_jtag_handle
,buffer
, scan_size
);
352 usbprog_jtag_read_tdo(usbprog_jtag_handle
,buffer
, scan_size
);
356 usbprog_jtag_write_and_read(usbprog_jtag_handle
,buffer
, scan_size
);
364 if (cur_state
!= end_state
)
365 usbprog_state_move();
368 /*************** jtag wrapper functions *********************/
370 void usbprog_write(int tck
, int tms
, int tdi
)
372 unsigned char output_value
=0x00;
375 output_value
|= (1<<TMS_BIT
);
377 output_value
|= (1<<TDI_BIT
);
379 output_value
|= (1<<TCK_BIT
);
381 usbprog_jtag_write_slice(usbprog_jtag_handle
,output_value
);
384 /* (1) assert or (0) deassert reset lines */
385 void usbprog_reset(int trst
, int srst
)
387 DEBUG("trst: %i, srst: %i", trst
, srst
);
390 usbprog_jtag_set_bit(usbprog_jtag_handle
, 5, 0);
392 usbprog_jtag_set_bit(usbprog_jtag_handle
, 5, 1);
395 usbprog_jtag_set_bit(usbprog_jtag_handle
, 4, 0);
397 usbprog_jtag_set_bit(usbprog_jtag_handle
, 4, 1);
400 /*************** jtag lowlevel functions ********************/
402 struct usb_bus
*busses
;
404 struct usbprog_jtag
* usbprog_jtag_open()
407 struct usb_device
*dev
;
409 struct usbprog_jtag
*tmp
;
411 tmp
= (struct usbprog_jtag
*)malloc(sizeof(struct usbprog_jtag
));
418 busses
= usb_get_busses();
420 /* find usbprog_jtag device in usb bus */
422 for (bus
= busses
; bus
; bus
= bus
->next
)
424 for (dev
= bus
->devices
; dev
; dev
= dev
->next
)
426 /* condition for sucessfully hit (too bad, I only check the vendor id)*/
427 if (dev
->descriptor
.idVendor
== VID
&& dev
->descriptor
.idProduct
== PID
)
429 tmp
->usb_handle
= usb_open(dev
);
430 usb_set_configuration(tmp
->usb_handle
, 1);
431 usb_claim_interface(tmp
->usb_handle
, 0);
432 usb_set_altinterface(tmp
->usb_handle
, 0);
440 void usbprog_jtag_close(struct usbprog_jtag
*usbprog_jtag
)
442 usb_close(usbprog_jtag
->usb_handle
);
446 unsigned char usbprog_jtag_message(struct usbprog_jtag
*usbprog_jtag
, char *msg
, int msglen
)
448 int res
= usb_bulk_write(usbprog_jtag
->usb_handle
, 3, msg
,msglen
, 100);
449 if ((msg
[0] == 2) || (msg
[0] == 1) || (msg
[0] == 4) || (msg
[0] == 0) || \
450 (msg
[0] == 6) || (msg
[0] == 0x0A) || (msg
[0] == 9))
454 //INFO("HALLLLOOO %i",(int)msg[0]);
455 res
= usb_bulk_read(usbprog_jtag
->usb_handle
, 0x82, msg
, 2, 100);
457 return (unsigned char)msg
[1];
466 void usbprog_jtag_init(struct usbprog_jtag
*usbprog_jtag
)
468 usbprog_jtag_set_direction(usbprog_jtag
, 0xFE);
471 void usbprog_jtag_write_and_read(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
)
473 char tmp
[64]; // fastes packet size for usb controller
474 int send_bits
, bufindex
= 0, fillindex
= 0, i
, loops
;
477 // 61 byte can be transfered (488 bit)
494 tmp
[0] = WRITE_AND_READ
;
495 tmp
[1] = (char)(send_bits
>> 8); // high
496 tmp
[2] = (char)(send_bits
); // low
499 for (i
= 0; i
< loops
; i
++)
501 tmp
[3 + i
] = buffer
[bufindex
];
505 if (usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, 64, 1000) == 64)
507 //INFO("HALLLLOOO2 %i",(int)tmp[0]);
510 while (usb_bulk_read(usbprog_jtag
->usb_handle
, 0x82, tmp
, 64, 1000) < 1)
517 for (i
= 0; i
< loops
; i
++)
520 buffer
[fillindex
++] = swap
;
526 void usbprog_jtag_read_tdo(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
)
528 char tmp
[64]; // fastes packet size for usb controller
529 int send_bits
, fillindex
= 0, i
, loops
;
532 // 61 byte can be transfered (488 bit)
549 tmp
[0] = WRITE_AND_READ
;
550 tmp
[1] = (char)(send_bits
>> 8); // high
551 tmp
[2] = (char)(send_bits
); // low
553 usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, 3, 1000);
555 //INFO("HALLLLOOO3 %i",(int)tmp[0]);
558 while (usb_bulk_read(usbprog_jtag
->usb_handle
, 0x82, tmp
, 64, 10) < 1)
565 for (i
= 0; i
< loops
; i
++)
568 buffer
[fillindex
++] = swap
;
573 void usbprog_jtag_write_tdi(struct usbprog_jtag
*usbprog_jtag
, char * buffer
, int size
)
575 char tmp
[64]; // fastes packet size for usb controller
576 int send_bits
, bufindex
= 0, i
, loops
;
578 // 61 byte can be transfered (488 bit)
596 tmp
[1] = (char)(send_bits
>> 8); // high
597 tmp
[2] = (char)(send_bits
); // low
600 for (i
= 0; i
< loops
; i
++)
602 tmp
[3 + i
] = buffer
[bufindex
];
605 usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, 64, 1000);
609 void usbprog_jtag_write_tms(struct usbprog_jtag
*usbprog_jtag
, char tms_scan
)
611 usbprog_jtag_tms_collect(tms_scan
);
614 void usbprog_jtag_set_direction(struct usbprog_jtag
*usbprog_jtag
, unsigned char direction
)
617 tmp
[0] = PORT_DIRECTION
;
618 tmp
[1] = (char)direction
;
619 usbprog_jtag_message(usbprog_jtag
, tmp
, 2);
622 void usbprog_jtag_write_slice(struct usbprog_jtag
*usbprog_jtag
,unsigned char value
)
626 tmp
[1] = (char)value
;
627 usbprog_jtag_message(usbprog_jtag
, tmp
, 2);
630 unsigned char usbprog_jtag_get_port(struct usbprog_jtag
*usbprog_jtag
)
635 return usbprog_jtag_message(usbprog_jtag
, tmp
, 2);
638 void usbprog_jtag_set_bit(struct usbprog_jtag
*usbprog_jtag
,int bit
, int value
)
641 tmp
[0] = PORT_SETBIT
;
647 usbprog_jtag_message(usbprog_jtag
, tmp
, 3);
650 int usbprog_jtag_get_bit(struct usbprog_jtag
*usbprog_jtag
, int bit
)
653 tmp
[0] = PORT_GETBIT
;
656 if (usbprog_jtag_message(usbprog_jtag
, tmp
, 2) > 0)
662 void usbprog_jtag_tms_collect(char tms_scan
)
664 tms_chain
[tms_chain_index
] = tms_scan
;
668 void usbprog_jtag_tms_send(struct usbprog_jtag
*usbprog_jtag
)
672 if (tms_chain_index
> 0)
674 char tmp
[tms_chain_index
+ 2];
675 tmp
[0] = WRITE_TMS_CHAIN
;
676 tmp
[1] = (char)(tms_chain_index
);
677 for (i
= 0; i
< tms_chain_index
+ 1; i
++)
678 tmp
[2 + i
] = tms_chain
[i
];
679 usb_bulk_write(usbprog_jtag
->usb_handle
, 3, tmp
, tms_chain_index
+ 2, 1000);
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)