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);
96 int turtle_init(void);
98 /* reset procedures for supported layouts */
99 void usbjtag_reset(int trst
, int srst
);
100 void jtagkey_reset(int trst
, int srst
);
101 void olimex_jtag_reset(int trst
, int srst
);
102 void m5960_reset(int trst
, int srst
);
103 void turtle_reset(int trst
, int srst
);
105 /* blink procedures for layouts that support a blinking led */
106 void olimex_jtag_blink(void);
107 void turtle_jtag_blink(void);
109 ft2232_layout_t ft2232_layouts
[] =
111 {"usbjtag", usbjtag_init
, usbjtag_reset
, NULL
},
112 {"jtagkey", jtagkey_init
, jtagkey_reset
, NULL
},
113 {"jtagkey_prototype_v1", jtagkey_init
, jtagkey_reset
, NULL
},
114 {"oocdlink", jtagkey_init
, jtagkey_reset
, NULL
},
115 {"signalyzer", usbjtag_init
, usbjtag_reset
, NULL
},
116 {"evb_lm3s811", usbjtag_init
, usbjtag_reset
, NULL
},
117 {"olimex-jtag", olimex_jtag_init
, olimex_jtag_reset
, olimex_jtag_blink
},
118 {"m5960", m5960_init
, m5960_reset
, NULL
},
119 {"turtelizer2", turtle_init
, turtle_reset
, turtle_jtag_blink
},
123 static u8 nTRST
, nTRSTnOE
, nSRST
, nSRSTnOE
;
125 static ft2232_layout_t
*layout
;
126 static u8 low_output
= 0x0;
127 static u8 low_direction
= 0x0;
128 static u8 high_output
= 0x0;
129 static u8 high_direction
= 0x0;
131 #if BUILD_FT2232_FTD2XX == 1
132 static FT_HANDLE ftdih
= NULL
;
133 #elif BUILD_FT2232_LIBFTDI == 1
134 static struct ftdi_context ftdic
;
137 static u8
*ft2232_buffer
= NULL
;
138 static int ft2232_buffer_size
= 0;
139 static int ft2232_read_pointer
= 0;
140 static int ft2232_expect_read
= 0;
141 #define FT2232_BUFFER_SIZE 131072
142 #define BUFFER_ADD ft2232_buffer[ft2232_buffer_size++]
143 #define BUFFER_READ ft2232_buffer[ft2232_read_pointer++]
145 jtag_interface_t ft2232_interface
=
150 .execute_queue
= ft2232_execute_queue
,
152 .support_pathmove
= 1,
154 .speed
= ft2232_speed
,
155 .register_commands
= ft2232_register_commands
,
160 int ft2232_write(u8
*buf
, int size
, u32
* bytes_written
)
162 #if BUILD_FT2232_FTD2XX == 1
164 DWORD dw_bytes_written
;
165 if ((status
= FT_Write(ftdih
, buf
, size
, &dw_bytes_written
)) != FT_OK
)
167 *bytes_written
= dw_bytes_written
;
168 ERROR("FT_Write returned: %lu", status
);
169 return ERROR_JTAG_DEVICE_ERROR
;
173 *bytes_written
= dw_bytes_written
;
176 #elif BUILD_FT2232_LIBFTDI == 1
178 if ((retval
= ftdi_write_data(&ftdic
, buf
, size
)) < 0)
181 ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic
));
182 return ERROR_JTAG_DEVICE_ERROR
;
186 *bytes_written
= retval
;
192 int ft2232_read(u8
* buf
, int size
, u32
* bytes_read
)
194 #if BUILD_FT2232_FTD2XX == 1
200 while ((*bytes_read
< size
) && timeout
--)
202 if ((status
= FT_Read(ftdih
, buf
, size
, &dw_bytes_read
)) != FT_OK
)
205 ERROR("FT_Read returned: %lu", status
);
206 return ERROR_JTAG_DEVICE_ERROR
;
208 *bytes_read
+= dw_bytes_read
;
210 #elif BUILD_FT2232_LIBFTDI == 1
215 while ((*bytes_read
< size
) && timeout
--)
217 if ((retval
= ftdi_read_data(&ftdic
, buf
+ *bytes_read
, size
- *bytes_read
)) < 0)
220 ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic
));
221 return ERROR_JTAG_DEVICE_ERROR
;
223 *bytes_read
+= retval
;
227 if (*bytes_read
< size
)
229 ERROR("couldn't read the requested number of bytes from FT2232 device (%i < %i)", *bytes_read
, size
);
230 return ERROR_JTAG_DEVICE_ERROR
;
236 int ft2232_speed(int speed
)
242 buf
[0] = 0x86; /* command "set divisor" */
243 buf
[1] = speed
& 0xff; /* valueL (0=6MHz, 1=3MHz, 2=1.5MHz, ...*/
244 buf
[2] = (speed
>> 8) & 0xff; /* valueH */
246 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
247 if (((retval
= ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
249 ERROR("couldn't set FT2232 TCK speed");
256 int ft2232_register_commands(struct command_context_s
*cmd_ctx
)
258 register_command(cmd_ctx
, NULL
, "ft2232_device_desc", ft2232_handle_device_desc_command
,
259 COMMAND_CONFIG
, NULL
);
260 register_command(cmd_ctx
, NULL
, "ft2232_serial", ft2232_handle_serial_command
,
261 COMMAND_CONFIG
, NULL
);
262 register_command(cmd_ctx
, NULL
, "ft2232_layout", ft2232_handle_layout_command
,
263 COMMAND_CONFIG
, NULL
);
264 register_command(cmd_ctx
, NULL
, "ft2232_vid_pid", ft2232_handle_vid_pid_command
,
265 COMMAND_CONFIG
, NULL
);
269 void ft2232_end_state(state
)
271 if (tap_move_map
[state
] != -1)
275 ERROR("BUG: %i is not a valid end state", state
);
280 void ft2232_read_scan(enum scan_type type
, u8
* buffer
, int scan_size
)
282 int num_bytes
= ((scan_size
+ 7) / 8);
283 int bits_left
= scan_size
;
286 while(num_bytes
-- > 1)
288 buffer
[cur_byte
] = BUFFER_READ
;
293 buffer
[cur_byte
] = 0x0;
297 buffer
[cur_byte
] = BUFFER_READ
>> 1;
300 buffer
[cur_byte
] = (buffer
[cur_byte
] | ((BUFFER_READ
& 0x02) << 6)) >> (8 - bits_left
);
304 void ft2232_debug_dump_buffer(void)
310 for (i
= 0; i
< ft2232_buffer_size
; i
++)
312 line_p
+= snprintf(line_p
, 256 - (line_p
- line
), "%2.2x ", ft2232_buffer
[i
]);
324 int ft2232_send_and_recv(jtag_command_t
*first
, jtag_command_t
*last
)
334 #ifdef _DEBUG_USB_IO_
335 struct timeval start
, inter
, inter2
, end
;
336 struct timeval d_inter
, d_inter2
, d_end
;
339 #ifdef _DEBUG_USB_COMMS_
340 DEBUG("write buffer (size %i):", ft2232_buffer_size
);
341 ft2232_debug_dump_buffer();
344 #ifdef _DEBUG_USB_IO_
345 gettimeofday(&start
, NULL
);
348 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
350 ERROR("couldn't write MPSSE commands to FT2232");
354 #ifdef _DEBUG_USB_IO_
355 gettimeofday(&inter
, NULL
);
358 if (ft2232_expect_read
)
361 ft2232_buffer_size
= 0;
363 #ifdef _DEBUG_USB_IO_
364 gettimeofday(&inter2
, NULL
);
367 if ((retval
= ft2232_read(ft2232_buffer
, ft2232_expect_read
, &bytes_read
)) != ERROR_OK
)
369 ERROR("couldn't read from FT2232");
373 #ifdef _DEBUG_USB_IO_
374 gettimeofday(&end
, NULL
);
376 timeval_subtract(&d_inter
, &inter
, &start
);
377 timeval_subtract(&d_inter2
, &inter2
, &start
);
378 timeval_subtract(&d_end
, &end
, &start
);
380 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
);
384 ft2232_buffer_size
= bytes_read
;
386 if (ft2232_expect_read
!= ft2232_buffer_size
)
388 ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read
, ft2232_buffer_size
, 100 - timeout
);
389 ft2232_debug_dump_buffer();
394 #ifdef _DEBUG_USB_COMMS_
395 DEBUG("read buffer (%i retries): %i bytes", 100 - timeout
, ft2232_buffer_size
);
396 ft2232_debug_dump_buffer();
400 ft2232_expect_read
= 0;
401 ft2232_read_pointer
= 0;
409 type
= jtag_scan_type(cmd
->cmd
.scan
);
410 if (type
!= SCAN_OUT
)
412 scan_size
= jtag_scan_size(cmd
->cmd
.scan
);
413 buffer
= calloc(CEIL(scan_size
, 8), 1);
414 ft2232_read_scan(type
, buffer
, scan_size
);
415 jtag_read_buffer(buffer
, cmd
->cmd
.scan
);
425 ft2232_buffer_size
= 0;
430 void ft2232_add_pathmove(pathmove_command_t
*cmd
)
432 int num_states
= cmd
->num_states
;
442 /* command "Clock Data to TMS/CS Pin (no Read)" */
444 /* number of states remaining */
445 BUFFER_ADD
= (num_states
% 7) - 1;
447 while (num_states
% 7)
449 if (tap_transitions
[cur_state
].low
== cmd
->path
[state_count
])
450 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x0);
451 else if (tap_transitions
[cur_state
].high
== cmd
->path
[state_count
])
452 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x1);
455 ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings
[cur_state
], tap_state_strings
[cmd
->path
[state_count
]]);
459 cur_state
= cmd
->path
[state_count
];
464 BUFFER_ADD
= tms_byte
;
467 end_state
= cur_state
;
470 void ft2232_add_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
472 int num_bytes
= (scan_size
+ 7) / 8;
473 int bits_left
= scan_size
;
477 if (!((!ir_scan
&& (cur_state
== TAP_SD
)) || (ir_scan
&& (cur_state
== TAP_SI
))))
479 /* command "Clock Data to TMS/CS Pin (no Read)" */
486 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SI
);
491 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SD
);
494 //DEBUG("added TMS scan (no read)");
497 /* add command for complete bytes */
498 while (num_bytes
> 1)
503 /* Clock Data Bytes In and Out LSB First */
505 //DEBUG("added TDI bytes (io %i)", num_bytes);
507 else if (type
== SCAN_OUT
)
509 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
511 //DEBUG("added TDI bytes (o)");
513 else if (type
== SCAN_IN
)
515 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
517 //DEBUG("added TDI bytes (i %i)", num_bytes);
519 thisrun_bytes
= (num_bytes
> 65537) ? 65536 : (num_bytes
- 1);
520 num_bytes
-= thisrun_bytes
;
521 BUFFER_ADD
= (thisrun_bytes
- 1) & 0xff;
522 BUFFER_ADD
= ((thisrun_bytes
- 1) >> 8) & 0xff;
525 /* add complete bytes */
526 while(thisrun_bytes
-- > 0)
528 BUFFER_ADD
= buffer
[cur_byte
];
533 else /* (type == SCAN_IN) */
535 bits_left
-= 8 * (thisrun_bytes
);
539 /* the most signifcant bit is scanned during TAP movement */
541 last_bit
= (buffer
[cur_byte
] >> (bits_left
- 1)) & 0x1;
545 /* process remaining bits but the last one */
550 /* Clock Data Bits In and Out LSB First */
552 //DEBUG("added TDI bits (io) %i", bits_left - 1);
554 else if (type
== SCAN_OUT
)
556 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
558 //DEBUG("added TDI bits (o)");
560 else if (type
== SCAN_IN
)
562 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
564 //DEBUG("added TDI bits (i %i)", bits_left - 1);
566 BUFFER_ADD
= bits_left
- 2;
568 BUFFER_ADD
= buffer
[cur_byte
];
571 if ((ir_scan
&& (end_state
== TAP_SI
)) ||
572 (!ir_scan
&& (end_state
== TAP_SD
)))
576 /* Clock Data Bits In and Out LSB First */
578 //DEBUG("added TDI bits (io) %i", bits_left - 1);
580 else if (type
== SCAN_OUT
)
582 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
584 //DEBUG("added TDI bits (o)");
586 else if (type
== SCAN_IN
)
588 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
590 //DEBUG("added TDI bits (i %i)", bits_left - 1);
593 BUFFER_ADD
= last_bit
;
597 /* move from Shift-IR/DR to end state */
598 if (type
!= SCAN_OUT
)
600 /* Clock Data to TMS/CS Pin with Read */
602 //DEBUG("added TMS scan (read)");
606 /* Clock Data to TMS/CS Pin (no Read) */
608 //DEBUG("added TMS scan (no read)");
611 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
) | (last_bit
<< 7);
612 cur_state
= end_state
;
616 int ft2232_large_scan(scan_command_t
*cmd
, enum scan_type type
, u8
*buffer
, int scan_size
)
618 int num_bytes
= (scan_size
+ 7) / 8;
619 int bits_left
= scan_size
;
622 u8
*receive_buffer
= malloc(CEIL(scan_size
, 8));
623 u8
*receive_pointer
= receive_buffer
;
627 int thisrun_read
= 0;
631 ERROR("BUG: large IR scans are not supported");
635 if (cur_state
!= TAP_SD
)
637 /* command "Clock Data to TMS/CS Pin (no Read)" */
642 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SD
);
646 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
648 ERROR("couldn't write MPSSE commands to FT2232");
651 DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size
, bytes_written
);
652 ft2232_buffer_size
= 0;
654 /* add command for complete bytes */
655 while (num_bytes
> 1)
661 /* Clock Data Bytes In and Out LSB First */
663 //DEBUG("added TDI bytes (io %i)", num_bytes);
665 else if (type
== SCAN_OUT
)
667 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
669 //DEBUG("added TDI bytes (o)");
671 else if (type
== SCAN_IN
)
673 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
675 //DEBUG("added TDI bytes (i %i)", num_bytes);
677 thisrun_bytes
= (num_bytes
> 65537) ? 65536 : (num_bytes
- 1);
678 thisrun_read
= thisrun_bytes
;
679 num_bytes
-= thisrun_bytes
;
680 BUFFER_ADD
= (thisrun_bytes
- 1) & 0xff;
681 BUFFER_ADD
= ((thisrun_bytes
- 1) >> 8) & 0xff;
684 /* add complete bytes */
685 while(thisrun_bytes
-- > 0)
687 BUFFER_ADD
= buffer
[cur_byte
];
692 else /* (type == SCAN_IN) */
694 bits_left
-= 8 * (thisrun_bytes
);
697 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
699 ERROR("couldn't write MPSSE commands to FT2232");
702 DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size
, bytes_written
);
703 ft2232_buffer_size
= 0;
705 if (type
!= SCAN_OUT
)
707 if ((retval
= ft2232_read(receive_pointer
, thisrun_read
, &bytes_read
)) != ERROR_OK
)
709 ERROR("couldn't read from FT2232");
712 DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read
, bytes_read
);
713 receive_pointer
+= bytes_read
;
719 /* the most signifcant bit is scanned during TAP movement */
721 last_bit
= (buffer
[cur_byte
] >> (bits_left
- 1)) & 0x1;
725 /* process remaining bits but the last one */
730 /* Clock Data Bits In and Out LSB First */
732 //DEBUG("added TDI bits (io) %i", bits_left - 1);
734 else if (type
== SCAN_OUT
)
736 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
738 //DEBUG("added TDI bits (o)");
740 else if (type
== SCAN_IN
)
742 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
744 //DEBUG("added TDI bits (i %i)", bits_left - 1);
746 BUFFER_ADD
= bits_left
- 2;
748 BUFFER_ADD
= buffer
[cur_byte
];
750 if (type
!= SCAN_OUT
)
754 if (end_state
== TAP_SD
)
758 /* Clock Data Bits In and Out LSB First */
760 //DEBUG("added TDI bits (io) %i", bits_left - 1);
762 else if (type
== SCAN_OUT
)
764 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
766 //DEBUG("added TDI bits (o)");
768 else if (type
== SCAN_IN
)
770 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
772 //DEBUG("added TDI bits (i %i)", bits_left - 1);
775 BUFFER_ADD
= last_bit
;
779 /* move from Shift-IR/DR to end state */
780 if (type
!= SCAN_OUT
)
782 /* Clock Data to TMS/CS Pin with Read */
784 //DEBUG("added TMS scan (read)");
788 /* Clock Data to TMS/CS Pin (no Read) */
790 //DEBUG("added TMS scan (no read)");
793 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
) | (last_bit
<< 7);
794 cur_state
= end_state
;
797 if (type
!= SCAN_OUT
)
800 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
802 ERROR("couldn't write MPSSE commands to FT2232");
805 DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size
, bytes_written
);
806 ft2232_buffer_size
= 0;
808 if (type
!= SCAN_OUT
)
810 if ((retval
= ft2232_read(receive_pointer
, thisrun_read
, &bytes_read
)) != ERROR_OK
)
812 ERROR("couldn't read from FT2232");
815 DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read
, bytes_read
);
816 receive_pointer
+= bytes_read
;
822 int ft2232_predict_scan_out(int scan_size
, enum scan_type type
)
824 int predicted_size
= 3;
825 int num_bytes
= (scan_size
- 1) / 8;
827 if (cur_state
!= TAP_SD
)
830 if (type
== SCAN_IN
) /* only from device to host */
833 predicted_size
+= (CEIL(num_bytes
, 65536)) * 3;
834 /* remaining bits - 1 (up to 7) */
835 predicted_size
+= ((scan_size
- 1) % 8) ? 2 : 0;
837 else /* host to device, or bidirectional */
840 predicted_size
+= num_bytes
+ (CEIL(num_bytes
, 65536)) * 3;
841 /* remaining bits -1 (up to 7) */
842 predicted_size
+= ((scan_size
- 1) % 8) ? 3 : 0;
845 return predicted_size
;
848 int ft2232_predict_scan_in(int scan_size
, enum scan_type type
)
850 int predicted_size
= 0;
852 if (type
!= SCAN_OUT
)
855 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? (CEIL(scan_size
, 8) - 1) : 0;
856 /* remaining bits - 1 */
857 predicted_size
+= ((scan_size
- 1) % 8) ? 1 : 0;
858 /* last bit (from TMS scan) */
862 //DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size);
864 return predicted_size
;
867 void usbjtag_reset(int trst
, int srst
)
872 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
873 low_direction
|= nTRSTnOE
; /* switch to output pin (output is low) */
875 low_output
&= ~nTRST
; /* switch output low */
879 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
880 low_direction
&= ~nTRSTnOE
; /* switch to input pin (high-Z + internal and external pullup) */
882 low_output
|= nTRST
; /* switch output high */
887 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
888 low_output
&= ~nSRST
; /* switch output low */
890 low_direction
|= nSRSTnOE
; /* switch to output pin (output is low) */
894 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
895 low_output
|= nSRST
; /* switch output high */
897 low_direction
&= ~nSRSTnOE
; /* switch to input pin (high-Z) */
900 /* command "set data bits low byte" */
902 BUFFER_ADD
= low_output
;
903 BUFFER_ADD
= low_direction
;
907 void jtagkey_reset(int trst
, int srst
)
912 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
913 high_output
&= ~nTRSTnOE
;
915 high_output
&= ~nTRST
;
919 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
920 high_output
|= nTRSTnOE
;
922 high_output
|= nTRST
;
927 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
928 high_output
&= ~nSRST
;
930 high_output
&= ~nSRSTnOE
;
934 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
935 high_output
|= nSRST
;
937 high_output
|= nSRSTnOE
;
940 /* command "set data bits high byte" */
942 BUFFER_ADD
= high_output
;
943 BUFFER_ADD
= high_direction
;
944 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
947 void olimex_jtag_reset(int trst
, int srst
)
952 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
953 high_output
&= ~nTRSTnOE
;
955 high_output
&= ~nTRST
;
959 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
960 high_output
|= nTRSTnOE
;
962 high_output
|= nTRST
;
967 high_output
|= nSRST
;
971 high_output
&= ~nSRST
;
974 /* command "set data bits high byte" */
976 BUFFER_ADD
= high_output
;
977 BUFFER_ADD
= high_direction
;
978 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
981 void m5960_reset(int trst
, int srst
)
986 low_output
&= ~nTRST
;
999 low_output
&= ~nSRST
;
1002 /* command "set data bits low byte" */
1004 BUFFER_ADD
= low_output
;
1005 BUFFER_ADD
= low_direction
;
1006 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
1009 void turtle_reset(int trst
, int srst
)
1015 low_output
|= nSRST
;
1019 low_output
&= ~nSRST
;
1022 /* command "set data bits high byte" */
1024 BUFFER_ADD
= low_output
;
1025 BUFFER_ADD
= low_direction
;
1026 DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst
, low_output
, low_direction
);
1029 int ft2232_execute_queue()
1031 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
1032 jtag_command_t
*first_unsent
= cmd
; /* next command that has to be sent */
1034 int scan_size
; /* size of IR or DR scan */
1035 enum scan_type type
;
1037 int predicted_size
= 0;
1038 int require_send
= 0;
1040 ft2232_buffer_size
= 0;
1041 ft2232_expect_read
= 0;
1043 /* blink, if the current layout has that feature */
1051 case JTAG_END_STATE
:
1052 if (cmd
->cmd
.end_state
->end_state
!= -1)
1053 ft2232_end_state(cmd
->cmd
.end_state
->end_state
);
1056 /* only send the maximum buffer size that FT2232C can handle */
1058 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1060 ft2232_send_and_recv(first_unsent
, cmd
);
1065 layout
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
1068 #ifdef _DEBUG_JTAG_IO_
1069 DEBUG("trst: %i, srst: %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
1073 /* only send the maximum buffer size that FT2232C can handle */
1075 if (cur_state
!= TAP_RTI
)
1076 predicted_size
+= 3;
1077 predicted_size
+= 3 * CEIL(cmd
->cmd
.runtest
->num_cycles
, 7);
1078 if ((cmd
->cmd
.runtest
->end_state
!= -1) && (cmd
->cmd
.runtest
->end_state
!= TAP_RTI
))
1079 predicted_size
+= 3;
1080 if ((cmd
->cmd
.runtest
->end_state
== -1) && (end_state
!= TAP_RTI
))
1081 predicted_size
+= 3;
1082 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1084 ft2232_send_and_recv(first_unsent
, cmd
);
1088 if (cur_state
!= TAP_RTI
)
1090 /* command "Clock Data to TMS/CS Pin (no Read)" */
1095 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_RTI
);
1096 cur_state
= TAP_RTI
;
1099 i
= cmd
->cmd
.runtest
->num_cycles
;
1102 /* command "Clock Data to TMS/CS Pin (no Read)" */
1105 BUFFER_ADD
= (i
> 7) ? 6 : (i
- 1);
1108 cur_state
= TAP_RTI
;
1109 i
-= (i
> 7) ? 7 : i
;
1110 //DEBUG("added TMS scan (no read)");
1112 if (cmd
->cmd
.runtest
->end_state
!= -1)
1113 ft2232_end_state(cmd
->cmd
.runtest
->end_state
);
1114 if (cur_state
!= end_state
)
1116 /* command "Clock Data to TMS/CS Pin (no Read)" */
1121 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
);
1122 cur_state
= end_state
;
1123 //DEBUG("added TMS scan (no read)");
1126 #ifdef _DEBUG_JTAG_IO_
1127 DEBUG("runtest: %i, end in %i", cmd
->cmd
.runtest
->num_cycles
, end_state
);
1130 case JTAG_STATEMOVE
:
1131 /* only send the maximum buffer size that FT2232C can handle */
1133 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1135 ft2232_send_and_recv(first_unsent
, cmd
);
1139 if (cmd
->cmd
.statemove
->end_state
!= -1)
1140 ft2232_end_state(cmd
->cmd
.statemove
->end_state
);
1141 /* command "Clock Data to TMS/CS Pin (no Read)" */
1146 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
);
1147 //DEBUG("added TMS scan (no read)");
1148 cur_state
= end_state
;
1150 #ifdef _DEBUG_JTAG_IO_
1151 DEBUG("statemove: %i", end_state
);
1155 /* only send the maximum buffer size that FT2232C can handle */
1156 predicted_size
= 3 * CEIL(cmd
->cmd
.pathmove
->num_states
, 7);
1157 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1159 ft2232_send_and_recv(first_unsent
, cmd
);
1163 ft2232_add_pathmove(cmd
->cmd
.pathmove
);
1165 #ifdef _DEBUG_JTAG_IO_
1166 DEBUG("pathmove: %i states, end in %i", cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
1170 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
1171 type
= jtag_scan_type(cmd
->cmd
.scan
);
1172 predicted_size
= ft2232_predict_scan_out(scan_size
, type
);
1173 if ((predicted_size
+ 1) > FT2232_BUFFER_SIZE
)
1175 DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
1176 /* unsent commands before this */
1177 if (first_unsent
!= cmd
)
1178 ft2232_send_and_recv(first_unsent
, cmd
);
1180 /* current command */
1181 if (cmd
->cmd
.scan
->end_state
!= -1)
1182 ft2232_end_state(cmd
->cmd
.scan
->end_state
);
1183 ft2232_large_scan(cmd
->cmd
.scan
, type
, buffer
, scan_size
);
1185 first_unsent
= cmd
->next
;
1190 else if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
1192 DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)", first_unsent
, cmd
);
1193 ft2232_send_and_recv(first_unsent
, cmd
);
1197 ft2232_expect_read
+= ft2232_predict_scan_in(scan_size
, type
);
1198 //DEBUG("new read size: %i", ft2232_expect_read);
1199 if (cmd
->cmd
.scan
->end_state
!= -1)
1200 ft2232_end_state(cmd
->cmd
.scan
->end_state
);
1201 ft2232_add_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
1205 #ifdef _DEBUG_JTAG_IO_
1206 DEBUG("%s scan, %i bit, end in %i", (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", scan_size
, end_state
);
1210 ft2232_send_and_recv(first_unsent
, cmd
);
1211 first_unsent
= cmd
->next
;
1212 jtag_sleep(cmd
->cmd
.sleep
->us
);
1213 #ifdef _DEBUG_JTAG_IO_
1214 DEBUG("sleep %i usec", cmd
->cmd
.sleep
->us
);
1218 ERROR("BUG: unknown JTAG command type encountered");
1224 if (require_send
> 0)
1225 ft2232_send_and_recv(first_unsent
, cmd
);
1230 int ft2232_init(void)
1237 #if BUILD_FT2232_FTD2XX == 1
1239 DWORD openex_flags
= 0;
1240 char *openex_string
= NULL
;
1243 ft2232_layout_t
*cur_layout
= ft2232_layouts
;
1245 if ((ft2232_layout
== NULL
) || (ft2232_layout
[0] == 0))
1247 ft2232_layout
= "usbjtag";
1248 WARNING("No ft2232 layout specified, using default 'usbjtag'");
1251 while (cur_layout
->name
)
1253 if (strcmp(cur_layout
->name
, ft2232_layout
) == 0)
1255 layout
= cur_layout
;
1263 ERROR("No matching layout found for %s", ft2232_layout
);
1264 return ERROR_JTAG_INIT_FAILED
;
1267 #if BUILD_FT2232_FTD2XX == 1
1268 DEBUG("'ft2232' interface using FTD2XX with '%s' layout", ft2232_layout
);
1269 #elif BUILD_FT2232_LIBFTDI == 1
1270 DEBUG("'ft2232' interface using libftdi with '%s' layout", ft2232_layout
);
1273 #if BUILD_FT2232_FTD2XX == 1
1275 /* Add non-standard Vid/Pid to the linux driver */
1276 if ((status
= FT_SetVIDPID(ft2232_vid
, ft2232_pid
)) != FT_OK
)
1278 WARNING("couldn't add %4.4x:%4.4x", ft2232_vid
, ft2232_pid
);
1282 if (ft2232_device_desc
&& ft2232_serial
)
1284 WARNING("can't open by device description and serial number, giving precedence to serial");
1285 ft2232_device_desc
= NULL
;
1288 if (ft2232_device_desc
)
1290 openex_string
= ft2232_device_desc
;
1291 openex_flags
= FT_OPEN_BY_DESCRIPTION
;
1293 else if (ft2232_serial
)
1295 openex_string
= ft2232_serial
;
1296 openex_flags
= FT_OPEN_BY_SERIAL_NUMBER
;
1300 ERROR("neither device description nor serial number specified");
1301 ERROR("please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
1303 return ERROR_JTAG_INIT_FAILED
;
1306 if ((status
= FT_OpenEx(openex_string
, openex_flags
, &ftdih
)) != FT_OK
)
1310 ERROR("unable to open ftdi device: %lu", status
);
1311 status
= FT_ListDevices(&num_devices
, NULL
, FT_LIST_NUMBER_ONLY
);
1312 if (status
== FT_OK
)
1314 char **desc_array
= malloc(sizeof(char*) * (num_devices
+ 1));
1317 for (i
= 0; i
< num_devices
; i
++)
1318 desc_array
[i
] = malloc(64);
1319 desc_array
[num_devices
] = NULL
;
1321 status
= FT_ListDevices(desc_array
, &num_devices
, FT_LIST_ALL
| openex_flags
);
1323 if (status
== FT_OK
)
1325 ERROR("ListDevices: %lu\n", num_devices
);
1326 for (i
= 0; i
< num_devices
; i
++)
1327 ERROR("%i: %s", i
, desc_array
[i
]);
1330 for (i
= 0; i
< num_devices
; i
++)
1331 free(desc_array
[i
]);
1336 printf("ListDevices: NONE\n");
1338 return ERROR_JTAG_INIT_FAILED
;
1341 if ((status
= FT_SetLatencyTimer(ftdih
, 2)) != FT_OK
)
1343 ERROR("unable to set latency timer: %lu", status
);
1344 return ERROR_JTAG_INIT_FAILED
;
1347 if ((status
= FT_GetLatencyTimer(ftdih
, &latency_timer
)) != FT_OK
)
1349 ERROR("unable to get latency timer: %lu", status
);
1350 return ERROR_JTAG_INIT_FAILED
;
1354 DEBUG("current latency timer: %i", latency_timer
);
1357 if ((status
= FT_SetTimeouts(ftdih
, 5000, 5000)) != FT_OK
)
1359 ERROR("unable to set timeouts: %lu", status
);
1360 return ERROR_JTAG_INIT_FAILED
;
1363 if ((status
= FT_SetBitMode(ftdih
, 0x0b, 2)) != FT_OK
)
1365 ERROR("unable to enable bit i/o mode: %lu", status
);
1366 return ERROR_JTAG_INIT_FAILED
;
1368 #elif BUILD_FT2232_LIBFTDI == 1
1369 if (ftdi_init(&ftdic
) < 0)
1370 return ERROR_JTAG_INIT_FAILED
;
1372 /* context, vendor id, product id */
1373 if (ftdi_usb_open_desc(&ftdic
, ft2232_vid
, ft2232_pid
, ft2232_device_desc
, ft2232_serial
) < 0)
1375 ERROR("unable to open ftdi device: %s", ftdic
.error_str
);
1376 return ERROR_JTAG_INIT_FAILED
;
1379 if (ftdi_set_interface(&ftdic
, INTERFACE_A
) < 0)
1381 ERROR("unable to select FT2232 channel A: %s", ftdic
.error_str
);
1382 return ERROR_JTAG_INIT_FAILED
;
1385 if (ftdi_usb_reset(&ftdic
) < 0)
1387 ERROR("unable to reset ftdi device");
1388 return ERROR_JTAG_INIT_FAILED
;
1391 if (ftdi_set_latency_timer(&ftdic
, 2) < 0)
1393 ERROR("unable to set latency timer");
1394 return ERROR_JTAG_INIT_FAILED
;
1397 if (ftdi_get_latency_timer(&ftdic
, &latency_timer
) < 0)
1399 ERROR("unable to get latency timer");
1400 return ERROR_JTAG_INIT_FAILED
;
1404 DEBUG("current latency timer: %i", latency_timer
);
1407 ftdi_set_bitmode(&ftdic
, 0x0b, 2); /* ctx, JTAG I/O mask */
1410 ft2232_buffer_size
= 0;
1411 ft2232_buffer
= malloc(FT2232_BUFFER_SIZE
);
1413 if (layout
->init() != ERROR_OK
)
1414 return ERROR_JTAG_INIT_FAILED
;
1416 ft2232_speed(jtag_speed
);
1418 buf
[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
1419 if (((retval
= ft2232_write(buf
, 1, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 1))
1421 ERROR("couldn't write to FT2232 to disable loopback");
1422 return ERROR_JTAG_INIT_FAILED
;
1425 #if BUILD_FT2232_FTD2XX == 1
1426 if ((status
= FT_Purge(ftdih
, FT_PURGE_RX
| FT_PURGE_TX
)) != FT_OK
)
1428 ERROR("error purging ftd2xx device: %lu", status
);
1429 return ERROR_JTAG_INIT_FAILED
;
1431 #elif BUILD_FT2232_LIBFTDI == 1
1432 if (ftdi_usb_purge_buffers(&ftdic
) < 0)
1434 ERROR("ftdi_purge_buffers: %s", ftdic
.error_str
);
1435 return ERROR_JTAG_INIT_FAILED
;
1442 int usbjtag_init(void)
1448 low_direction
= 0x0b;
1450 if (strcmp(ft2232_layout
, "usbjtag") == 0)
1457 else if (strcmp(ft2232_layout
, "signalyzer") == 0)
1464 else if (strcmp(ft2232_layout
, "evb_lm3s811") == 0)
1471 low_direction
= 0x8b;
1475 ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout
);
1476 return ERROR_JTAG_INIT_FAILED
;
1479 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1481 low_direction
&= ~nTRSTnOE
; /* nTRST input */
1482 low_output
&= ~nTRST
; /* nTRST = 0 */
1486 low_direction
|= nTRSTnOE
; /* nTRST output */
1487 low_output
|= nTRST
; /* nTRST = 1 */
1490 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1492 low_direction
|= nSRSTnOE
; /* nSRST output */
1493 low_output
|= nSRST
; /* nSRST = 1 */
1497 low_direction
&= ~nSRSTnOE
; /* nSRST input */
1498 low_output
&= ~nSRST
; /* nSRST = 0 */
1501 /* initialize low byte for jtag */
1502 buf
[0] = 0x80; /* command "set data bits low byte" */
1503 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, xRST high) */
1504 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in */
1505 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1507 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1509 ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
1510 return ERROR_JTAG_INIT_FAILED
;
1516 int jtagkey_init(void)
1522 low_direction
= 0x1b;
1524 /* initialize low byte for jtag */
1525 buf
[0] = 0x80; /* command "set data bits low byte" */
1526 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1527 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1528 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1530 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1532 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1533 return ERROR_JTAG_INIT_FAILED
;
1536 if (strcmp(layout
->name
, "jtagkey") == 0)
1543 else if ((strcmp(layout
->name
, "jtagkey_prototype_v1") == 0) ||
1544 (strcmp(layout
->name
, "oocdlink") == 0))
1553 ERROR("BUG: jtagkey_init called for non jtagkey layout");
1558 high_direction
= 0x0f;
1560 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1562 high_output
|= nTRSTnOE
;
1563 high_output
&= ~nTRST
;
1567 high_output
&= ~nTRSTnOE
;
1568 high_output
|= nTRST
;
1571 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1573 high_output
&= ~nSRSTnOE
;
1574 high_output
|= nSRST
;
1578 high_output
|= nSRSTnOE
;
1579 high_output
&= ~nSRST
;
1582 /* initialize high port */
1583 buf
[0] = 0x82; /* command "set data bits high byte" */
1584 buf
[1] = high_output
; /* value */
1585 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1586 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1588 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1590 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1591 return ERROR_JTAG_INIT_FAILED
;
1597 int olimex_jtag_init(void)
1603 low_direction
= 0x1b;
1605 /* initialize low byte for jtag */
1606 buf
[0] = 0x80; /* command "set data bits low byte" */
1607 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1608 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1609 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1611 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1613 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1614 return ERROR_JTAG_INIT_FAILED
;
1620 nSRSTnOE
= 0x00; /* no output enable for nSRST */
1623 high_direction
= 0x0f;
1625 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1627 high_output
|= nTRSTnOE
;
1628 high_output
&= ~nTRST
;
1632 high_output
&= ~nTRSTnOE
;
1633 high_output
|= nTRST
;
1636 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1638 ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
1642 high_output
&= ~nSRST
;
1645 /* turn red LED on */
1646 high_output
|= 0x08;
1648 /* initialize high port */
1649 buf
[0] = 0x82; /* command "set data bits high byte" */
1650 buf
[1] = high_output
; /* value */
1651 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1652 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1654 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1656 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1657 return ERROR_JTAG_INIT_FAILED
;
1663 int m5960_init(void)
1669 low_direction
= 0xfb;
1671 /* initialize low byte for jtag */
1672 buf
[0] = 0x80; /* command "set data bits low byte" */
1673 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1674 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE[12]=out, n[ST]srst=out */
1675 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1677 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1679 ERROR("couldn't initialize FT2232 with 'm5960' layout");
1680 return ERROR_JTAG_INIT_FAILED
;
1684 nTRSTnOE
= 0x0; /* not output enable for nTRST */
1686 nSRSTnOE
= 0x00; /* no output enable for nSRST */
1689 high_direction
= 0x0c;
1691 /* turn red LED1 on, LED2 off */
1692 high_output
|= 0x08;
1694 /* initialize high port */
1695 buf
[0] = 0x82; /* command "set data bits high byte" */
1696 buf
[1] = high_output
; /* value */
1697 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1698 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1700 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1702 ERROR("couldn't initialize FT2232 with 'm5960' layout");
1703 return ERROR_JTAG_INIT_FAILED
;
1709 int turtle_init(void)
1715 low_direction
= 0x5b;
1717 /* initialize low byte for jtag */
1718 buf
[0] = 0x80; /* command "set data bits low byte" */
1719 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1720 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1721 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1723 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1725 ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
1726 return ERROR_JTAG_INIT_FAILED
;
1732 high_direction
= 0x0C;
1734 /* initialize high port */
1735 buf
[0] = 0x82; /* command "set data bits high byte" */
1736 buf
[1] = high_output
;
1737 buf
[2] = high_direction
;
1738 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1740 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1742 ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
1743 return ERROR_JTAG_INIT_FAILED
;
1749 void olimex_jtag_blink(void)
1751 /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
1752 * ACBUS3 is bit 3 of the GPIOH port
1754 if (high_output
& 0x08)
1756 /* set port pin high */
1757 high_output
&= 0x07;
1761 /* set port pin low */
1762 high_output
|= 0x08;
1766 BUFFER_ADD
= high_output
;
1767 BUFFER_ADD
= high_direction
;
1770 void turtle_jtag_blink(void)
1773 * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
1775 if (high_output
& 0x08)
1785 BUFFER_ADD
= high_output
;
1786 BUFFER_ADD
= high_direction
;
1790 int ft2232_quit(void)
1792 #if BUILD_FT2232_FTD2XX == 1
1795 status
= FT_Close(ftdih
);
1796 #elif BUILD_FT2232_LIBFTDI == 1
1797 ftdi_disable_bitbang(&ftdic
);
1799 ftdi_usb_close(&ftdic
);
1801 ftdi_deinit(&ftdic
);
1804 free(ft2232_buffer
);
1809 int ft2232_handle_device_desc_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1813 ft2232_device_desc
= strdup(args
[0]);
1817 ERROR("expected exactly one argument to ft2232_device_desc <description>");
1823 int ft2232_handle_serial_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1827 ft2232_serial
= strdup(args
[0]);
1831 ERROR("expected exactly one argument to ft2232_serial <serial-number>");
1837 int ft2232_handle_layout_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1842 ft2232_layout
= malloc(strlen(args
[0]) + 1);
1843 strcpy(ft2232_layout
, args
[0]);
1848 int ft2232_handle_vid_pid_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1852 ft2232_vid
= strtol(args
[0], NULL
, 0);
1853 ft2232_pid
= strtol(args
[1], NULL
, 0);
1857 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)