1 /***************************************************************************
2 * Copyright (C) 2004, 2006 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
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 ***************************************************************************/
29 #include "replacements.h"
31 /* project specific includes */
35 #include "configuration.h"
36 #include "time_support.h"
43 /* FT2232 access library includes */
44 #if BUILD_FT2232_FTD2XX == 1
46 #elif BUILD_FT2232_LIBFTDI == 1
53 /* enable this to debug io latency
56 #define _DEBUG_USB_IO_
59 /* enable this to debug communication
62 #define _DEBUG_USB_COMMS_
65 int ft2232_execute_queue(void);
67 int ft2232_speed(int speed
);
68 int ft2232_register_commands(struct command_context_s
*cmd_ctx
);
69 int ft2232_init(void);
70 int ft2232_quit(void);
72 int ft2232_handle_device_desc_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int ft2232_handle_serial_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int ft2232_handle_layout_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int ft2232_handle_vid_pid_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 char *ft2232_device_desc
= NULL
;
78 char *ft2232_serial
= NULL
;
79 char *ft2232_layout
= NULL
;
80 u16 ft2232_vid
= 0x0403;
81 u16 ft2232_pid
= 0x6010;
83 typedef struct ft2232_layout_s
87 void(*reset
)(int trst
, int srst
);
91 /* init procedures for supported layouts */
92 int usbjtag_init(void);
93 int jtagkey_init(void);
94 int olimex_jtag_init(void);
97 /* reset procedures for supported layouts */
98 void usbjtag_reset(int trst
, int srst
);
99 void jtagkey_reset(int trst
, int srst
);
100 void olimex_jtag_reset(int trst
, int srst
);
101 void m5960_reset(int trst
, int srst
);
103 /* blink procedures for layouts that support a blinking led */
104 void olimex_jtag_blink(void);
106 ft2232_layout_t ft2232_layouts
[] =
108 {"usbjtag", usbjtag_init
, usbjtag_reset
, NULL
},
109 {"jtagkey", jtagkey_init
, jtagkey_reset
, NULL
},
110 {"jtagkey_prototype_v1", jtagkey_init
, jtagkey_reset
, NULL
},
111 {"signalyzer", usbjtag_init
, usbjtag_reset
, NULL
},
112 {"evb_lm3s811", usbjtag_init
, usbjtag_reset
, NULL
},
113 {"olimex-jtag", olimex_jtag_init
, olimex_jtag_reset
, olimex_jtag_blink
},
114 {"m5960", m5960_init
, m5960_reset
, NULL
},
118 static u8 nTRST
, nTRSTnOE
, nSRST
, nSRSTnOE
;
120 static ft2232_layout_t
*layout
;
121 static u8 low_output
= 0x0;
122 static u8 low_direction
= 0x0;
123 static u8 high_output
= 0x0;
124 static u8 high_direction
= 0x0;
126 #if BUILD_FT2232_FTD2XX == 1
127 static FT_HANDLE ftdih
= NULL
;
128 #elif BUILD_FT2232_LIBFTDI == 1
129 static struct ftdi_context ftdic
;
132 static u8
*ft2232_buffer
= NULL
;
133 static int ft2232_buffer_size
= 0;
134 static int ft2232_read_pointer
= 0;
135 static int ft2232_expect_read
= 0;
136 #define FT2232_BUFFER_SIZE 131072
137 #define BUFFER_ADD ft2232_buffer[ft2232_buffer_size++]
138 #define BUFFER_READ ft2232_buffer[ft2232_read_pointer++]
140 jtag_interface_t ft2232_interface
=
145 .execute_queue
= ft2232_execute_queue
,
147 .support_pathmove
= 1,
149 .speed
= ft2232_speed
,
150 .register_commands
= ft2232_register_commands
,
155 int ft2232_write(u8
*buf
, int size
, u32
* bytes_written
)
157 #if BUILD_FT2232_FTD2XX == 1
159 DWORD dw_bytes_written
;
160 if ((status
= FT_Write(ftdih
, buf
, size
, &dw_bytes_written
)) != FT_OK
)
162 *bytes_written
= dw_bytes_written
;
163 ERROR("FT_Write returned: %i", status
);
164 return ERROR_JTAG_DEVICE_ERROR
;
168 *bytes_written
= dw_bytes_written
;
171 #elif BUILD_FT2232_LIBFTDI == 1
173 if ((retval
= ftdi_write_data(&ftdic
, buf
, size
)) < 0)
176 ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic
));
177 return ERROR_JTAG_DEVICE_ERROR
;
181 *bytes_written
= retval
;
187 int ft2232_read(u8
* buf
, int size
, u32
* bytes_read
)
189 #if BUILD_FT2232_FTD2XX == 1
195 while ((*bytes_read
< size
) && timeout
--)
197 if ((status
= FT_Read(ftdih
, buf
, size
, &dw_bytes_read
)) != FT_OK
)
200 ERROR("FT_Read returned: %i", status
);
201 return ERROR_JTAG_DEVICE_ERROR
;
203 *bytes_read
+= dw_bytes_read
;
205 #elif BUILD_FT2232_LIBFTDI == 1
210 while ((*bytes_read
< size
) && timeout
--)
212 if ((retval
= ftdi_read_data(&ftdic
, buf
+ *bytes_read
, size
- *bytes_read
)) < 0)
215 ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic
));
216 return ERROR_JTAG_DEVICE_ERROR
;
218 *bytes_read
+= retval
;
222 if (*bytes_read
< size
)
224 ERROR("couldn't read the requested number of bytes from FT2232 device (%i < %i)", *bytes_read
, size
);
225 return ERROR_JTAG_DEVICE_ERROR
;
231 int ft2232_speed(int speed
)
237 buf
[0] = 0x86; /* command "set divisor" */
238 buf
[1] = speed
& 0xff; /* valueL (0=6MHz, 1=3MHz, 2=1.5MHz, ...*/
239 buf
[2] = (speed
>> 8) & 0xff; /* valueH */
241 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
242 if (((retval
= ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
244 ERROR("couldn't set FT2232 TCK speed");
251 int ft2232_register_commands(struct command_context_s
*cmd_ctx
)
253 register_command(cmd_ctx
, NULL
, "ft2232_device_desc", ft2232_handle_device_desc_command
,
254 COMMAND_CONFIG
, NULL
);
255 register_command(cmd_ctx
, NULL
, "ft2232_serial", ft2232_handle_serial_command
,
256 COMMAND_CONFIG
, NULL
);
257 register_command(cmd_ctx
, NULL
, "ft2232_layout", ft2232_handle_layout_command
,
258 COMMAND_CONFIG
, NULL
);
259 register_command(cmd_ctx
, NULL
, "ft2232_vid_pid", ft2232_handle_vid_pid_command
,
260 COMMAND_CONFIG
, NULL
);
264 void ft2232_end_state(state
)
266 if (tap_move_map
[state
] != -1)
270 ERROR("BUG: %i is not a valid end state", state
);
275 void ft2232_read_scan(enum scan_type type
, u8
* buffer
, int scan_size
)
277 int num_bytes
= ((scan_size
+ 7) / 8);
278 int bits_left
= scan_size
;
281 while(num_bytes
-- > 1)
283 buffer
[cur_byte
] = BUFFER_READ
;
288 buffer
[cur_byte
] = 0x0;
292 buffer
[cur_byte
] = BUFFER_READ
>> 1;
295 buffer
[cur_byte
] = (buffer
[cur_byte
] | ((BUFFER_READ
& 0x02) << 6)) >> (8 - bits_left
);
299 void ft2232_debug_dump_buffer(void)
305 for (i
= 0; i
< ft2232_buffer_size
; i
++)
307 line_p
+= snprintf(line_p
, 256 - (line_p
- line
), "%2.2x ", ft2232_buffer
[i
]);
319 int ft2232_send_and_recv(jtag_command_t
*first
, jtag_command_t
*last
)
329 #ifdef _DEBUG_USB_IO_
330 struct timeval start
, inter
, inter2
, end
;
331 struct timeval d_inter
, d_inter2
, d_end
;
334 #ifdef _DEBUG_USB_COMMS_
335 DEBUG("write buffer (size %i):", ft2232_buffer_size
);
336 ft2232_debug_dump_buffer();
339 #ifdef _DEBUG_USB_IO_
340 gettimeofday(&start
, NULL
);
343 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
345 ERROR("couldn't write MPSSE commands to FT2232");
349 #ifdef _DEBUG_USB_IO_
350 gettimeofday(&inter
, NULL
);
353 if (ft2232_expect_read
)
356 ft2232_buffer_size
= 0;
358 #ifdef _DEBUG_USB_IO_
359 gettimeofday(&inter2
, NULL
);
362 if ((retval
= ft2232_read(ft2232_buffer
, ft2232_expect_read
, &bytes_read
)) != ERROR_OK
)
364 ERROR("couldn't read from FT2232");
368 #ifdef _DEBUG_USB_IO_
369 gettimeofday(&end
, NULL
);
371 timeval_subtract(&d_inter
, &inter
, &start
);
372 timeval_subtract(&d_inter2
, &inter2
, &start
);
373 timeval_subtract(&d_end
, &end
, &start
);
375 INFO("inter: %i.%i, inter2: %i.%i end: %i.%i", d_inter
.tv_sec
, d_inter
.tv_usec
, d_inter2
.tv_sec
, d_inter2
.tv_usec
, d_end
.tv_sec
, d_end
.tv_usec
);
379 ft2232_buffer_size
= bytes_read
;
381 if (ft2232_expect_read
!= ft2232_buffer_size
)
383 ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read
, ft2232_buffer_size
, 100 - timeout
);
384 ft2232_debug_dump_buffer();
389 #ifdef _DEBUG_USB_COMMS_
390 DEBUG("read buffer (%i retries): %i bytes", 100 - timeout
, ft2232_buffer_size
);
391 ft2232_debug_dump_buffer();
395 ft2232_expect_read
= 0;
396 ft2232_read_pointer
= 0;
404 type
= jtag_scan_type(cmd
->cmd
.scan
);
405 if (type
!= SCAN_OUT
)
407 scan_size
= jtag_scan_size(cmd
->cmd
.scan
);
408 buffer
= calloc(CEIL(scan_size
, 8), 1);
409 ft2232_read_scan(type
, buffer
, scan_size
);
410 jtag_read_buffer(buffer
, cmd
->cmd
.scan
);
420 ft2232_buffer_size
= 0;
425 void ft2232_add_pathmove(pathmove_command_t
*cmd
)
427 int num_states
= cmd
->num_states
;
437 /* command "Clock Data to TMS/CS Pin (no Read)" */
439 /* number of states remaining */
440 BUFFER_ADD
= (num_states
% 7) - 1;
442 while (num_states
% 7)
444 if (tap_transitions
[cur_state
].low
== cmd
->path
[state_count
])
445 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x0);
446 else if (tap_transitions
[cur_state
].high
== cmd
->path
[state_count
])
447 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x1);
450 ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings
[cur_state
], tap_state_strings
[cmd
->path
[state_count
]]);
454 cur_state
= cmd
->path
[state_count
];
459 BUFFER_ADD
= tms_byte
;
462 end_state
= cur_state
;
465 void ft2232_add_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
467 int num_bytes
= (scan_size
+ 7) / 8;
468 int bits_left
= scan_size
;
472 if ((!ir_scan
&& (cur_state
!= TAP_SD
)) || (ir_scan
&& (cur_state
!= TAP_SI
)))
474 /* command "Clock Data to TMS/CS Pin (no Read)" */
481 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SI
);
486 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SD
);
489 //DEBUG("added TMS scan (no read)");
492 /* add command for complete bytes */
497 /* Clock Data Bytes In and Out LSB First */
499 //DEBUG("added TDI bytes (io %i)", num_bytes);
501 else if (type
== SCAN_OUT
)
503 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
505 //DEBUG("added TDI bytes (o)");
507 else if (type
== SCAN_IN
)
509 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
511 //DEBUG("added TDI bytes (i %i)", num_bytes);
513 BUFFER_ADD
= (num_bytes
-2) & 0xff;
514 BUFFER_ADD
= ((num_bytes
-2) >> 8) & 0xff;
518 /* add complete bytes */
519 while(num_bytes
-- > 1)
521 BUFFER_ADD
= buffer
[cur_byte
];
528 bits_left
-= 8 * (num_bytes
- 1);
531 /* the most signifcant bit is scanned during TAP movement */
533 last_bit
= (buffer
[cur_byte
] >> (bits_left
- 1)) & 0x1;
537 /* process remaining bits but the last one */
542 /* Clock Data Bits In and Out LSB First */
544 //DEBUG("added TDI bits (io) %i", bits_left - 1);
546 else if (type
== SCAN_OUT
)
548 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
550 //DEBUG("added TDI bits (o)");
552 else if (type
== SCAN_IN
)
554 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
556 //DEBUG("added TDI bits (i %i)", bits_left - 1);
558 BUFFER_ADD
= bits_left
- 2;
560 BUFFER_ADD
= buffer
[cur_byte
];
563 /* move from Shift-IR/DR to end state */
564 if (type
!= SCAN_OUT
)
566 /* Clock Data to TMS/CS Pin with Read */
568 //DEBUG("added TMS scan (read)");
572 /* Clock Data to TMS/CS Pin (no Read) */
574 //DEBUG("added TMS scan (no read)");
577 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
) | (last_bit
<< 7);
578 cur_state
= end_state
;
582 int ft2232_predict_scan_out(int scan_size
, enum scan_type type
)
584 int predicted_size
= 3;
586 if (cur_state
!= TAP_SD
)
589 if (type
== SCAN_IN
) /* only from device to host */
592 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? 3 : 0;
593 /* remaining bits - 1 (up to 7) */
594 predicted_size
+= ((scan_size
- 1) % 8) ? 2 : 0;
596 else /* host to device, or bidirectional */
599 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? (CEIL(scan_size
, 8) + 3 - 1) : 0;
600 /* remaining bits -1 (up to 7) */
601 predicted_size
+= ((scan_size
- 1) % 8) ? 3 : 0;
604 return predicted_size
;
607 int ft2232_predict_scan_in(int scan_size
, enum scan_type type
)
609 int predicted_size
= 0;
611 if (type
!= SCAN_OUT
)
614 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? (CEIL(scan_size
, 8) - 1) : 0;
615 /* remaining bits - 1 */
616 predicted_size
+= ((scan_size
- 1) % 8) ? 1 : 0;
617 /* last bit (from TMS scan) */
621 //DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size);
623 return predicted_size
;
626 void usbjtag_reset(int trst
, int srst
)
631 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
632 low_direction
|= nTRSTnOE
; /* switch to output pin (output is low) */
634 low_output
&= ~nTRST
; /* switch output low */
638 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
639 low_direction
&= ~nTRSTnOE
; /* switch to input pin (high-Z + internal and external pullup) */
641 low_output
|= nTRST
; /* switch output high */
646 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
647 low_output
&= ~nSRST
; /* switch output low */
649 low_direction
|= nSRSTnOE
; /* switch to output pin (output is low) */
653 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
654 low_output
|= nSRST
; /* switch output high */
656 low_direction
&= ~nSRSTnOE
; /* switch to input pin (high-Z) */
659 /* command "set data bits low byte" */
661 BUFFER_ADD
= low_output
;
662 BUFFER_ADD
= low_direction
;
666 void jtagkey_reset(int trst
, int srst
)
671 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
672 high_output
&= ~nTRSTnOE
;
674 high_output
&= ~nTRST
;
678 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
679 high_output
|= nTRSTnOE
;
681 high_output
|= nTRST
;
686 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
687 high_output
&= ~nSRST
;
689 high_output
&= ~nSRSTnOE
;
693 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
694 high_output
|= nSRST
;
696 high_output
|= nSRSTnOE
;
699 /* command "set data bits high byte" */
701 BUFFER_ADD
= high_output
;
702 BUFFER_ADD
= high_direction
;
703 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
706 void olimex_jtag_reset(int trst
, int srst
)
711 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
712 high_output
&= ~nTRSTnOE
;
714 high_output
&= ~nTRST
;
718 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
719 high_output
|= nTRSTnOE
;
721 high_output
|= nTRST
;
726 high_output
|= nSRST
;
730 high_output
&= ~nSRST
;
733 /* command "set data bits high byte" */
735 BUFFER_ADD
= high_output
;
736 BUFFER_ADD
= high_direction
;
737 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
740 void m5960_reset(int trst
, int srst
)
745 low_output
&= ~nTRST
;
758 low_output
&= ~nSRST
;
761 /* command "set data bits low byte" */
763 BUFFER_ADD
= low_output
;
764 BUFFER_ADD
= low_direction
;
765 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
768 int ft2232_execute_queue()
770 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
771 jtag_command_t
*first_unsent
= cmd
; /* next command that has to be sent */
773 int scan_size
; /* size of IR or DR scan */
776 int predicted_size
= 0;
777 int require_send
= 0;
779 ft2232_buffer_size
= 0;
780 ft2232_expect_read
= 0;
782 /* blink, if the current layout has that feature */
791 if (cmd
->cmd
.end_state
->end_state
!= -1)
792 ft2232_end_state(cmd
->cmd
.end_state
->end_state
);
795 /* only send the maximum buffer size that FT2232C can handle */
797 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
799 ft2232_send_and_recv(first_unsent
, cmd
);
804 layout
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
807 #ifdef _DEBUG_JTAG_IO_
808 DEBUG("trst: %i, srst: %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
812 /* only send the maximum buffer size that FT2232C can handle */
814 if (cur_state
!= TAP_RTI
)
816 predicted_size
+= 3 * CEIL(cmd
->cmd
.runtest
->num_cycles
, 7);
817 if ((cmd
->cmd
.runtest
->end_state
!= -1) && (cmd
->cmd
.runtest
->end_state
!= TAP_RTI
))
819 if ((cmd
->cmd
.runtest
->end_state
== -1) && (end_state
!= TAP_RTI
))
821 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
823 ft2232_send_and_recv(first_unsent
, cmd
);
827 if (cur_state
!= TAP_RTI
)
829 /* command "Clock Data to TMS/CS Pin (no Read)" */
834 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_RTI
);
838 i
= cmd
->cmd
.runtest
->num_cycles
;
841 /* command "Clock Data to TMS/CS Pin (no Read)" */
844 BUFFER_ADD
= (i
> 7) ? 6 : (i
- 1);
848 i
-= (i
> 7) ? 7 : i
;
849 //DEBUG("added TMS scan (no read)");
851 if (cmd
->cmd
.runtest
->end_state
!= -1)
852 ft2232_end_state(cmd
->cmd
.runtest
->end_state
);
853 if (cur_state
!= end_state
)
855 /* command "Clock Data to TMS/CS Pin (no Read)" */
860 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
);
861 cur_state
= end_state
;
862 //DEBUG("added TMS scan (no read)");
865 #ifdef _DEBUG_JTAG_IO_
866 DEBUG("runtest: %i, end in %i", cmd
->cmd
.runtest
->num_cycles
, end_state
);
870 /* only send the maximum buffer size that FT2232C can handle */
872 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
874 ft2232_send_and_recv(first_unsent
, cmd
);
878 if (cmd
->cmd
.statemove
->end_state
!= -1)
879 ft2232_end_state(cmd
->cmd
.statemove
->end_state
);
880 /* command "Clock Data to TMS/CS Pin (no Read)" */
885 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
);
886 //DEBUG("added TMS scan (no read)");
887 cur_state
= end_state
;
889 #ifdef _DEBUG_JTAG_IO_
890 DEBUG("statemove: %i", end_state
);
894 /* only send the maximum buffer size that FT2232C can handle */
895 predicted_size
= 3 * CEIL(cmd
->cmd
.pathmove
->num_states
, 7);
896 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
898 ft2232_send_and_recv(first_unsent
, cmd
);
902 ft2232_add_pathmove(cmd
->cmd
.pathmove
);
904 #ifdef _DEBUG_JTAG_IO_
905 DEBUG("pathmove: %i states, end in %i", cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
909 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
910 type
= jtag_scan_type(cmd
->cmd
.scan
);
911 predicted_size
= ft2232_predict_scan_out(scan_size
, type
);
912 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
914 DEBUG("ftd2xx buffer size reached, sending queued commands (first_unsent: %x, cmd: %x)", first_unsent
, cmd
);
915 ft2232_send_and_recv(first_unsent
, cmd
);
919 ft2232_expect_read
+= ft2232_predict_scan_in(scan_size
, type
);
920 //DEBUG("new read size: %i", ft2232_expect_read);
921 if (cmd
->cmd
.scan
->end_state
!= -1)
922 ft2232_end_state(cmd
->cmd
.scan
->end_state
);
923 ft2232_add_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
927 #ifdef _DEBUG_JTAG_IO_
928 DEBUG("%s scan, %i bit, end in %i", (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", scan_size
, end_state
);
932 ft2232_send_and_recv(first_unsent
, cmd
);
933 first_unsent
= cmd
->next
;
934 jtag_sleep(cmd
->cmd
.sleep
->us
);
935 #ifdef _DEBUG_JTAG_IO_
936 DEBUG("sleep %i usec", cmd
->cmd
.sleep
->us
);
940 ERROR("BUG: unknown JTAG command type encountered");
946 if (require_send
> 0)
947 ft2232_send_and_recv(first_unsent
, cmd
);
952 int ft2232_init(void)
959 #if BUILD_FT2232_FTD2XX == 1
961 DWORD openex_flags
= 0;
962 char *openex_string
= NULL
;
965 ft2232_layout_t
*cur_layout
= ft2232_layouts
;
967 if ((ft2232_layout
== NULL
) || (ft2232_layout
[0] == 0))
969 ft2232_layout
= "usbjtag";
970 WARNING("No ft2232 layout specified, using default 'usbjtag'");
973 while (cur_layout
->name
)
975 if (strcmp(cur_layout
->name
, ft2232_layout
) == 0)
985 ERROR("No matching layout found for %s", ft2232_layout
);
986 return ERROR_JTAG_INIT_FAILED
;
989 #if BUILD_FT2232_FTD2XX == 1
990 DEBUG("'ft2232' interface using FTD2XX with '%s' layout", ft2232_layout
);
991 #elif BUILD_FT2232_LIBFTDI == 1
992 DEBUG("'ft2232' interface using libftdi with '%s' layout", ft2232_layout
);
995 #if BUILD_FT2232_FTD2XX == 1
997 /* Add non-standard Vid/Pid to the linux driver */
998 if ((status
= FT_SetVIDPID(ft2232_vid
, ft2232_pid
)) != FT_OK
)
1000 WARNING("couldn't add %4.4x:%4.4x", ft2232_vid
, ft2232_pid
);
1004 if (ft2232_device_desc
&& ft2232_serial
)
1006 WARNING("can't open by device description and serial number, giving precedence to serial");
1007 ft2232_device_desc
= NULL
;
1010 if (ft2232_device_desc
)
1012 openex_string
= ft2232_device_desc
;
1013 openex_flags
= FT_OPEN_BY_DESCRIPTION
;
1015 else if (ft2232_serial
)
1017 openex_string
= ft2232_serial
;
1018 openex_flags
= FT_OPEN_BY_SERIAL_NUMBER
;
1022 ERROR("neither device description nor serial number specified");
1023 ERROR("please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
1025 return ERROR_JTAG_INIT_FAILED
;
1028 if ((status
= FT_OpenEx(openex_string
, openex_flags
, &ftdih
)) != FT_OK
)
1032 ERROR("unable to open ftdi device: %i", status
);
1033 status
= FT_ListDevices(&num_devices
, NULL
, FT_LIST_NUMBER_ONLY
);
1034 if (status
== FT_OK
)
1036 char **desc_array
= malloc(sizeof(char*) * (num_devices
+ 1));
1039 for (i
= 0; i
< num_devices
; i
++)
1040 desc_array
[i
] = malloc(64);
1041 desc_array
[num_devices
] = NULL
;
1043 status
= FT_ListDevices(desc_array
, &num_devices
, FT_LIST_ALL
| openex_flags
);
1045 if (status
== FT_OK
)
1047 ERROR("ListDevices: %d\n", num_devices
);
1048 for (i
= 0; i
< num_devices
; i
++)
1049 ERROR("%i: %s", i
, desc_array
[i
]);
1052 for (i
= 0; i
< num_devices
; i
++)
1053 free(desc_array
[i
]);
1058 printf("ListDevices: NONE\n");
1060 return ERROR_JTAG_INIT_FAILED
;
1063 if ((status
= FT_SetLatencyTimer(ftdih
, 2)) != FT_OK
)
1065 ERROR("unable to set latency timer: %i", status
);
1066 return ERROR_JTAG_INIT_FAILED
;
1069 if ((status
= FT_GetLatencyTimer(ftdih
, &latency_timer
)) != FT_OK
)
1071 ERROR("unable to get latency timer: %i", status
);
1072 return ERROR_JTAG_INIT_FAILED
;
1076 DEBUG("current latency timer: %i", latency_timer
);
1079 if ((status
= FT_SetTimeouts(ftdih
, 5000, 5000)) != FT_OK
)
1081 ERROR("unable to set timeouts: %i", status
);
1082 return ERROR_JTAG_INIT_FAILED
;
1085 if ((status
= FT_SetBitMode(ftdih
, 0x0b, 2)) != FT_OK
)
1087 ERROR("unable to enable bit i/o mode: %i", status
);
1088 return ERROR_JTAG_INIT_FAILED
;
1090 #elif BUILD_FT2232_LIBFTDI == 1
1091 if (ftdi_init(&ftdic
) < 0)
1092 return ERROR_JTAG_INIT_FAILED
;
1094 /* context, vendor id, product id */
1095 if (ftdi_usb_open(&ftdic
, ft2232_vid
, ft2232_pid
) < 0)
1097 ERROR("unable to open ftdi device: %s", ftdic
.error_str
);
1098 return ERROR_JTAG_INIT_FAILED
;
1101 if (ftdi_usb_reset(&ftdic
) < 0)
1103 ERROR("unable to reset ftdi device");
1104 return ERROR_JTAG_INIT_FAILED
;
1107 if (ftdi_set_latency_timer(&ftdic
, 2) < 0)
1109 ERROR("unable to set latency timer");
1110 return ERROR_JTAG_INIT_FAILED
;
1113 if (ftdi_get_latency_timer(&ftdic
, &latency_timer
) < 0)
1115 ERROR("unable to get latency timer");
1116 return ERROR_JTAG_INIT_FAILED
;
1120 DEBUG("current latency timer: %i", latency_timer
);
1123 ftdic
.bitbang_mode
= 0; /* Reset controller */
1124 ftdi_enable_bitbang(&ftdic
, 0x0b); /* ctx, JTAG I/O mask */
1126 ftdic
.bitbang_mode
= 2; /* MPSSE mode */
1127 ftdi_enable_bitbang(&ftdic
, 0x0b); /* ctx, JTAG I/O mask */
1130 ft2232_buffer_size
= 0;
1131 ft2232_buffer
= malloc(FT2232_BUFFER_SIZE
);
1133 if (layout
->init() != ERROR_OK
)
1134 return ERROR_JTAG_INIT_FAILED
;
1136 ft2232_speed(jtag_speed
);
1138 buf
[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
1139 if (((retval
= ft2232_write(buf
, 1, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 1))
1141 ERROR("couldn't write to FT2232 to disable loopback");
1142 return ERROR_JTAG_INIT_FAILED
;
1145 #if BUILD_FT2232_FTD2XX == 1
1146 if ((status
= FT_Purge(ftdih
, FT_PURGE_RX
| FT_PURGE_TX
)) != FT_OK
)
1148 ERROR("error purging ftd2xx device: %i", status
);
1149 return ERROR_JTAG_INIT_FAILED
;
1151 #elif BUILD_FT2232_LIBFTDI == 1
1152 if (ftdi_usb_purge_buffers(&ftdic
) < 0)
1154 ERROR("ftdi_purge_buffers: %s", ftdic
.error_str
);
1155 return ERROR_JTAG_INIT_FAILED
;
1162 int usbjtag_init(void)
1168 low_direction
= 0x0b;
1170 if (strcmp(ft2232_layout
, "usbjtag") == 0)
1177 else if (strcmp(ft2232_layout
, "signalyzer") == 0)
1184 else if (strcmp(ft2232_layout
, "evb_lm3s811") == 0)
1191 low_direction
= 0x8b;
1195 ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout
);
1196 return ERROR_JTAG_INIT_FAILED
;
1199 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1201 low_direction
&= ~nTRSTnOE
; /* nTRST input */
1202 low_output
&= ~nTRST
; /* nTRST = 0 */
1206 low_direction
|= nTRSTnOE
; /* nTRST output */
1207 low_output
|= nTRST
; /* nTRST = 1 */
1210 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1212 low_direction
|= nSRSTnOE
; /* nSRST output */
1213 low_output
|= nSRST
; /* nSRST = 1 */
1217 low_direction
&= ~nSRSTnOE
; /* nSRST input */
1218 low_output
&= ~nSRST
; /* nSRST = 0 */
1221 /* initialize low byte for jtag */
1222 buf
[0] = 0x80; /* command "set data bits low byte" */
1223 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, xRST high) */
1224 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in */
1225 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1227 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1229 ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
1230 return ERROR_JTAG_INIT_FAILED
;
1236 int jtagkey_init(void)
1242 low_direction
= 0x1b;
1244 /* initialize low byte for jtag */
1245 buf
[0] = 0x80; /* command "set data bits low byte" */
1246 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1247 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1248 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1250 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1252 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1253 return ERROR_JTAG_INIT_FAILED
;
1256 if (strcmp(layout
->name
, "jtagkey") == 0)
1263 else if (strcmp(layout
->name
, "jtagkey_prototype_v1") == 0)
1272 ERROR("BUG: jtagkey_init called for non jtagkey layout");
1277 high_direction
= 0x0f;
1279 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1281 high_output
|= nTRSTnOE
;
1282 high_output
&= ~nTRST
;
1286 high_output
&= ~nTRSTnOE
;
1287 high_output
|= nTRST
;
1290 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1292 high_output
&= ~nSRSTnOE
;
1293 high_output
|= nSRST
;
1297 high_output
|= nSRSTnOE
;
1298 high_output
&= ~nSRST
;
1301 /* initialize high port */
1302 buf
[0] = 0x82; /* command "set data bits high byte" */
1303 buf
[1] = high_output
; /* value */
1304 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1305 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1307 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1309 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1310 return ERROR_JTAG_INIT_FAILED
;
1316 int olimex_jtag_init(void)
1322 low_direction
= 0x1b;
1324 /* initialize low byte for jtag */
1325 buf
[0] = 0x80; /* command "set data bits low byte" */
1326 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1327 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1328 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1330 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1332 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1333 return ERROR_JTAG_INIT_FAILED
;
1339 nSRSTnOE
= 0x00; /* no output enable for nSRST */
1342 high_direction
= 0x0f;
1344 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1346 high_output
|= nTRSTnOE
;
1347 high_output
&= ~nTRST
;
1351 high_output
&= ~nTRSTnOE
;
1352 high_output
|= nTRST
;
1355 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1357 ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
1361 high_output
&= ~nSRST
;
1364 /* turn red LED on */
1365 high_output
|= 0x08;
1367 /* initialize high port */
1368 buf
[0] = 0x82; /* command "set data bits high byte" */
1369 buf
[1] = high_output
; /* value */
1370 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1371 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1373 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1375 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1376 return ERROR_JTAG_INIT_FAILED
;
1382 int m5960_init(void)
1388 low_direction
= 0xfb;
1390 /* initialize low byte for jtag */
1391 buf
[0] = 0x80; /* command "set data bits low byte" */
1392 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1393 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE[12]=out, n[ST]srst=out */
1394 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1396 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1398 ERROR("couldn't initialize FT2232 with 'm5960' layout");
1399 return ERROR_JTAG_INIT_FAILED
;
1403 nTRSTnOE
= 0x0; /* not output enable for nTRST */
1405 nSRSTnOE
= 0x00; /* no output enable for nSRST */
1408 high_direction
= 0x0c;
1410 /* turn red LED1 on, LED2 off */
1411 high_output
|= 0x08;
1413 /* initialize high port */
1414 buf
[0] = 0x82; /* command "set data bits high byte" */
1415 buf
[1] = high_output
; /* value */
1416 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1417 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1419 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1421 ERROR("couldn't initialize FT2232 with 'm5960' layout");
1422 return ERROR_JTAG_INIT_FAILED
;
1428 void olimex_jtag_blink(void)
1430 /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
1431 * ACBUS3 is bit 3 of the GPIOH port
1433 if (high_output
& 0x08)
1435 /* set port pin high */
1436 high_output
&= 0x07;
1440 /* set port pin low */
1441 high_output
|= 0x08;
1445 BUFFER_ADD
= high_output
;
1446 BUFFER_ADD
= high_direction
;
1449 int ft2232_quit(void)
1451 #if BUILD_FT2232_FTD2XX == 1
1454 status
= FT_Close(ftdih
);
1455 #elif BUILD_FT2232_LIBFTDI == 1
1456 ftdi_disable_bitbang(&ftdic
);
1458 ftdi_usb_close(&ftdic
);
1460 ftdi_deinit(&ftdic
);
1463 free(ft2232_buffer
);
1468 int ft2232_handle_device_desc_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1472 ft2232_device_desc
= strdup(args
[0]);
1476 ERROR("expected exactly one argument to ft2232_device_desc <description>");
1482 int ft2232_handle_serial_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1486 ft2232_serial
= strdup(args
[0]);
1490 ERROR("expected exactly one argument to ft2232_serial <serial-number>");
1496 int ft2232_handle_layout_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1501 ft2232_layout
= malloc(strlen(args
[0]) + 1);
1502 strcpy(ft2232_layout
, args
[0]);
1507 int ft2232_handle_vid_pid_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1511 ft2232_vid
= strtol(args
[0], NULL
, 0);
1512 ft2232_pid
= strtol(args
[1], NULL
, 0);
1516 WARNING("incomplete ft2232_vid_pid configuration directive");
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)