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
192 if ((status
= FT_Read(ftdih
, buf
, size
, &dw_bytes_read
)) != FT_OK
)
194 *bytes_read
= dw_bytes_read
;
195 ERROR("FT_Read returned: %i", status
);
196 return ERROR_JTAG_DEVICE_ERROR
;
198 *bytes_read
= dw_bytes_read
;
201 #elif BUILD_FT2232_LIBFTDI == 1
206 while ((*bytes_read
< size
) && timeout
--)
208 if ((retval
= ftdi_read_data(&ftdic
, buf
+ *bytes_read
, size
- *bytes_read
)) < 0)
211 ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic
));
212 return ERROR_JTAG_DEVICE_ERROR
;
214 *bytes_read
+= retval
;
220 int ft2232_speed(int speed
)
226 buf
[0] = 0x86; /* command "set divisor" */
227 buf
[1] = speed
& 0xff; /* valueL (0=6MHz, 1=3MHz, 2=1.5MHz, ...*/
228 buf
[2] = (speed
>> 8) & 0xff; /* valueH */
230 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
231 if (((retval
= ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
233 ERROR("couldn't set FT2232 TCK speed");
240 int ft2232_register_commands(struct command_context_s
*cmd_ctx
)
242 register_command(cmd_ctx
, NULL
, "ft2232_device_desc", ft2232_handle_device_desc_command
,
243 COMMAND_CONFIG
, NULL
);
244 register_command(cmd_ctx
, NULL
, "ft2232_serial", ft2232_handle_serial_command
,
245 COMMAND_CONFIG
, NULL
);
246 register_command(cmd_ctx
, NULL
, "ft2232_layout", ft2232_handle_layout_command
,
247 COMMAND_CONFIG
, NULL
);
248 register_command(cmd_ctx
, NULL
, "ft2232_vid_pid", ft2232_handle_vid_pid_command
,
249 COMMAND_CONFIG
, NULL
);
253 void ft2232_end_state(state
)
255 if (tap_move_map
[state
] != -1)
259 ERROR("BUG: %i is not a valid end state", state
);
264 void ft2232_read_scan(enum scan_type type
, u8
* buffer
, int scan_size
)
266 int num_bytes
= ((scan_size
+ 7) / 8);
267 int bits_left
= scan_size
;
270 while(num_bytes
-- > 1)
272 buffer
[cur_byte
] = BUFFER_READ
;
277 buffer
[cur_byte
] = 0x0;
281 buffer
[cur_byte
] = BUFFER_READ
>> 1;
284 buffer
[cur_byte
] = (buffer
[cur_byte
] | ((BUFFER_READ
& 0x02) << 6)) >> (8 - bits_left
);
288 void ft2232_debug_dump_buffer(void)
294 for (i
= 0; i
< ft2232_buffer_size
; i
++)
296 line_p
+= snprintf(line_p
, 256 - (line_p
- line
), "%2.2x ", ft2232_buffer
[i
]);
308 int ft2232_send_and_recv(jtag_command_t
*first
, jtag_command_t
*last
)
318 #ifdef _DEBUG_USB_IO_
319 struct timeval start
, inter
, inter2
, end
;
320 struct timeval d_inter
, d_inter2
, d_end
;
323 #ifdef _DEBUG_USB_COMMS_
324 DEBUG("write buffer (size %i):", ft2232_buffer_size
);
325 ft2232_debug_dump_buffer();
328 #ifdef _DEBUG_USB_IO_
329 gettimeofday(&start
, NULL
);
332 if ((retval
= ft2232_write(ft2232_buffer
, ft2232_buffer_size
, &bytes_written
)) != ERROR_OK
)
334 ERROR("couldn't write MPSSE commands to FT2232");
338 #ifdef _DEBUG_USB_IO_
339 gettimeofday(&inter
, NULL
);
342 if (ft2232_expect_read
)
345 ft2232_buffer_size
= 0;
347 #ifdef _DEBUG_USB_IO_
348 gettimeofday(&inter2
, NULL
);
351 if ((retval
= ft2232_read(ft2232_buffer
, ft2232_expect_read
, &bytes_read
)) != ERROR_OK
)
353 ERROR("couldn't read from FT2232");
357 #ifdef _DEBUG_USB_IO_
358 gettimeofday(&end
, NULL
);
360 timeval_subtract(&d_inter
, &inter
, &start
);
361 timeval_subtract(&d_inter2
, &inter2
, &start
);
362 timeval_subtract(&d_end
, &end
, &start
);
364 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
);
368 ft2232_buffer_size
= bytes_read
;
370 if (ft2232_expect_read
!= ft2232_buffer_size
)
372 ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read
, ft2232_buffer_size
, 100 - timeout
);
373 ft2232_debug_dump_buffer();
378 #ifdef _DEBUG_USB_COMMS_
379 DEBUG("read buffer (%i retries): %i bytes", 100 - timeout
, ft2232_buffer_size
);
380 ft2232_debug_dump_buffer();
384 ft2232_expect_read
= 0;
385 ft2232_read_pointer
= 0;
393 type
= jtag_scan_type(cmd
->cmd
.scan
);
394 if (type
!= SCAN_OUT
)
396 scan_size
= jtag_scan_size(cmd
->cmd
.scan
);
397 buffer
= calloc(CEIL(scan_size
, 8), 1);
398 ft2232_read_scan(type
, buffer
, scan_size
);
399 jtag_read_buffer(buffer
, cmd
->cmd
.scan
);
409 ft2232_buffer_size
= 0;
414 void ft2232_add_pathmove(pathmove_command_t
*cmd
)
416 int num_states
= cmd
->num_states
;
426 /* command "Clock Data to TMS/CS Pin (no Read)" */
428 /* number of states remaining */
429 BUFFER_ADD
= (num_states
% 7) - 1;
431 while (num_states
% 7)
433 if (tap_transitions
[cur_state
].low
== cmd
->path
[state_count
])
434 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x0);
435 else if (tap_transitions
[cur_state
].high
== cmd
->path
[state_count
])
436 buf_set_u32(&tms_byte
, bit_count
++, 1, 0x1);
439 ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings
[cur_state
], tap_state_strings
[cmd
->path
[state_count
]]);
443 cur_state
= cmd
->path
[state_count
];
448 BUFFER_ADD
= tms_byte
;
451 end_state
= cur_state
;
454 void ft2232_add_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
456 int num_bytes
= (scan_size
+ 7) / 8;
457 int bits_left
= scan_size
;
461 if ((!ir_scan
&& (cur_state
!= TAP_SD
)) || (ir_scan
&& (cur_state
!= TAP_SI
)))
463 /* command "Clock Data to TMS/CS Pin (no Read)" */
470 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SI
);
475 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_SD
);
478 //DEBUG("added TMS scan (no read)");
481 /* add command for complete bytes */
486 /* Clock Data Bytes In and Out LSB First */
488 //DEBUG("added TDI bytes (io %i)", num_bytes);
490 else if (type
== SCAN_OUT
)
492 /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */
494 //DEBUG("added TDI bytes (o)");
496 else if (type
== SCAN_IN
)
498 /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */
500 //DEBUG("added TDI bytes (i %i)", num_bytes);
502 BUFFER_ADD
= (num_bytes
-2) & 0xff;
503 BUFFER_ADD
= ((num_bytes
-2) >> 8) & 0xff;
507 /* add complete bytes */
508 while(num_bytes
-- > 1)
510 BUFFER_ADD
= buffer
[cur_byte
];
517 bits_left
-= 8 * (num_bytes
- 1);
520 /* the most signifcant bit is scanned during TAP movement */
522 last_bit
= (buffer
[cur_byte
] >> (bits_left
- 1)) & 0x1;
526 /* process remaining bits but the last one */
531 /* Clock Data Bits In and Out LSB First */
533 //DEBUG("added TDI bits (io) %i", bits_left - 1);
535 else if (type
== SCAN_OUT
)
537 /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */
539 //DEBUG("added TDI bits (o)");
541 else if (type
== SCAN_IN
)
543 /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */
545 //DEBUG("added TDI bits (i %i)", bits_left - 1);
547 BUFFER_ADD
= bits_left
- 2;
549 BUFFER_ADD
= buffer
[cur_byte
];
552 /* move from Shift-IR/DR to end state */
553 if (type
!= SCAN_OUT
)
555 /* Clock Data to TMS/CS Pin with Read */
557 //DEBUG("added TMS scan (read)");
561 /* Clock Data to TMS/CS Pin (no Read) */
563 //DEBUG("added TMS scan (no read)");
566 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
) | (last_bit
<< 7);
567 cur_state
= end_state
;
571 int ft2232_predict_scan_out(int scan_size
, enum scan_type type
)
573 int predicted_size
= 3;
575 if (cur_state
!= TAP_SD
)
578 if (type
== SCAN_IN
) /* only from device to host */
581 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? 3 : 0;
582 /* remaining bits - 1 (up to 7) */
583 predicted_size
+= ((scan_size
- 1) % 8) ? 2 : 0;
585 else /* host to device, or bidirectional */
588 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? (CEIL(scan_size
, 8) + 3 - 1) : 0;
589 /* remaining bits -1 (up to 7) */
590 predicted_size
+= ((scan_size
- 1) % 8) ? 3 : 0;
593 return predicted_size
;
596 int ft2232_predict_scan_in(int scan_size
, enum scan_type type
)
598 int predicted_size
= 0;
600 if (type
!= SCAN_OUT
)
603 predicted_size
+= (CEIL(scan_size
, 8) > 1) ? (CEIL(scan_size
, 8) - 1) : 0;
604 /* remaining bits - 1 */
605 predicted_size
+= ((scan_size
- 1) % 8) ? 1 : 0;
606 /* last bit (from TMS scan) */
610 //DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size);
612 return predicted_size
;
615 void usbjtag_reset(int trst
, int srst
)
620 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
621 low_direction
|= nTRSTnOE
; /* switch to output pin (output is low) */
623 low_output
&= ~nTRST
; /* switch output low */
627 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
628 low_direction
&= ~nTRSTnOE
; /* switch to input pin (high-Z + internal and external pullup) */
630 low_output
|= nTRST
; /* switch output high */
635 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
636 low_output
&= ~nSRST
; /* switch output low */
638 low_direction
|= nSRSTnOE
; /* switch to output pin (output is low) */
642 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
643 low_output
|= nSRST
; /* switch output high */
645 low_direction
&= ~nSRSTnOE
; /* switch to input pin (high-Z) */
648 /* command "set data bits low byte" */
650 BUFFER_ADD
= low_output
;
651 BUFFER_ADD
= low_direction
;
655 void jtagkey_reset(int trst
, int srst
)
660 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
661 high_output
&= ~nTRSTnOE
;
663 high_output
&= ~nTRST
;
667 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
668 high_output
|= nTRSTnOE
;
670 high_output
|= nTRST
;
675 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
676 high_output
&= ~nSRST
;
678 high_output
&= ~nSRSTnOE
;
682 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
683 high_output
|= nSRST
;
685 high_output
|= nSRSTnOE
;
688 /* command "set data bits high byte" */
690 BUFFER_ADD
= high_output
;
691 BUFFER_ADD
= high_direction
;
692 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
695 void olimex_jtag_reset(int trst
, int srst
)
700 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
701 high_output
&= ~nTRSTnOE
;
703 high_output
&= ~nTRST
;
707 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
708 high_output
|= nTRSTnOE
;
710 high_output
|= nTRST
;
715 high_output
|= nSRST
;
719 high_output
&= ~nSRST
;
722 /* command "set data bits high byte" */
724 BUFFER_ADD
= high_output
;
725 BUFFER_ADD
= high_direction
;
726 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
729 void m5960_reset(int trst
, int srst
)
734 low_output
&= ~nTRST
;
747 low_output
&= ~nSRST
;
750 /* command "set data bits low byte" */
752 BUFFER_ADD
= low_output
;
753 BUFFER_ADD
= low_direction
;
754 DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst
, srst
, high_output
, high_direction
);
757 int ft2232_execute_queue()
759 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
760 jtag_command_t
*first_unsent
= cmd
; /* next command that has to be sent */
762 int scan_size
; /* size of IR or DR scan */
765 int predicted_size
= 0;
766 int require_send
= 0;
768 ft2232_buffer_size
= 0;
769 ft2232_expect_read
= 0;
771 /* blink, if the current layout has that feature */
780 if (cmd
->cmd
.end_state
->end_state
!= -1)
781 ft2232_end_state(cmd
->cmd
.end_state
->end_state
);
784 /* only send the maximum buffer size that FT2232C can handle */
786 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
788 ft2232_send_and_recv(first_unsent
, cmd
);
793 layout
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
796 #ifdef _DEBUG_JTAG_IO_
797 DEBUG("trst: %i, srst: %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
801 /* only send the maximum buffer size that FT2232C can handle */
803 if (cur_state
!= TAP_RTI
)
805 predicted_size
+= 3 * CEIL(cmd
->cmd
.runtest
->num_cycles
, 7);
806 if ((cmd
->cmd
.runtest
->end_state
!= -1) && (cmd
->cmd
.runtest
->end_state
!= TAP_RTI
))
808 if ((cmd
->cmd
.runtest
->end_state
== -1) && (end_state
!= TAP_RTI
))
810 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
812 ft2232_send_and_recv(first_unsent
, cmd
);
816 if (cur_state
!= TAP_RTI
)
818 /* command "Clock Data to TMS/CS Pin (no Read)" */
823 BUFFER_ADD
= TAP_MOVE(cur_state
, TAP_RTI
);
827 i
= cmd
->cmd
.runtest
->num_cycles
;
830 /* command "Clock Data to TMS/CS Pin (no Read)" */
833 BUFFER_ADD
= (i
> 7) ? 6 : (i
- 1);
837 i
-= (i
> 7) ? 7 : i
;
838 //DEBUG("added TMS scan (no read)");
840 if (cmd
->cmd
.runtest
->end_state
!= -1)
841 ft2232_end_state(cmd
->cmd
.runtest
->end_state
);
842 if (cur_state
!= end_state
)
844 /* command "Clock Data to TMS/CS Pin (no Read)" */
849 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
);
850 cur_state
= end_state
;
851 //DEBUG("added TMS scan (no read)");
854 #ifdef _DEBUG_JTAG_IO_
855 DEBUG("runtest: %i, end in %i", cmd
->cmd
.runtest
->num_cycles
, end_state
);
859 /* only send the maximum buffer size that FT2232C can handle */
861 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
863 ft2232_send_and_recv(first_unsent
, cmd
);
867 if (cmd
->cmd
.statemove
->end_state
!= -1)
868 ft2232_end_state(cmd
->cmd
.statemove
->end_state
);
869 /* command "Clock Data to TMS/CS Pin (no Read)" */
874 BUFFER_ADD
= TAP_MOVE(cur_state
, end_state
);
875 //DEBUG("added TMS scan (no read)");
876 cur_state
= end_state
;
878 #ifdef _DEBUG_JTAG_IO_
879 DEBUG("statemove: %i", end_state
);
883 /* only send the maximum buffer size that FT2232C can handle */
884 predicted_size
= 3 * CEIL(cmd
->cmd
.pathmove
->num_states
, 7);
885 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
887 ft2232_send_and_recv(first_unsent
, cmd
);
891 ft2232_add_pathmove(cmd
->cmd
.pathmove
);
893 #ifdef _DEBUG_JTAG_IO_
894 DEBUG("pathmove: %i states, end in %i", cmd
->cmd
.pathmove
->num_states
, cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]);
898 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
899 type
= jtag_scan_type(cmd
->cmd
.scan
);
900 predicted_size
= ft2232_predict_scan_out(scan_size
, type
);
901 if (ft2232_buffer_size
+ predicted_size
+ 1 > FT2232_BUFFER_SIZE
)
903 DEBUG("ftd2xx buffer size reached, sending queued commands (first_unsent: %x, cmd: %x)", first_unsent
, cmd
);
904 ft2232_send_and_recv(first_unsent
, cmd
);
908 ft2232_expect_read
+= ft2232_predict_scan_in(scan_size
, type
);
909 //DEBUG("new read size: %i", ft2232_expect_read);
910 if (cmd
->cmd
.scan
->end_state
!= -1)
911 ft2232_end_state(cmd
->cmd
.scan
->end_state
);
912 ft2232_add_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
916 #ifdef _DEBUG_JTAG_IO_
917 DEBUG("%s scan, %i bit, end in %i", (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", scan_size
, end_state
);
921 ft2232_send_and_recv(first_unsent
, cmd
);
922 first_unsent
= cmd
->next
;
923 jtag_sleep(cmd
->cmd
.sleep
->us
);
924 #ifdef _DEBUG_JTAG_IO_
925 DEBUG("sleep %i usec", cmd
->cmd
.sleep
->us
);
929 ERROR("BUG: unknown JTAG command type encountered");
935 if (require_send
> 0)
936 ft2232_send_and_recv(first_unsent
, cmd
);
941 int ft2232_init(void)
948 #if BUILD_FT2232_FTD2XX == 1
950 DWORD openex_flags
= 0;
951 char *openex_string
= NULL
;
954 ft2232_layout_t
*cur_layout
= ft2232_layouts
;
956 if ((ft2232_layout
== NULL
) || (ft2232_layout
[0] == 0))
958 ft2232_layout
= "usbjtag";
959 WARNING("No ft2232 layout specified, using default 'usbjtag'");
962 while (cur_layout
->name
)
964 if (strcmp(cur_layout
->name
, ft2232_layout
) == 0)
974 ERROR("No matching layout found for %s", ft2232_layout
);
975 return ERROR_JTAG_INIT_FAILED
;
978 #if BUILD_FT2232_FTD2XX == 1
979 DEBUG("'ft2232' interface using FTD2XX with '%s' layout", ft2232_layout
);
980 #elif BUILD_FT2232_LIBFTDI == 1
981 DEBUG("'ft2232' interface using libftdi with '%s' layout", ft2232_layout
);
984 #if BUILD_FT2232_FTD2XX == 1
986 /* Add non-standard Vid/Pid to the linux driver */
987 if ((status
= FT_SetVIDPID(ft2232_vid
, ft2232_pid
)) != FT_OK
)
989 WARNING("couldn't add %4.4x:%4.4x", ft2232_vid
, ft2232_pid
);
993 if (ft2232_device_desc
&& ft2232_serial
)
995 WARNING("can't open by device description and serial number, giving precedence to serial");
996 ft2232_device_desc
= NULL
;
999 if (ft2232_device_desc
)
1001 openex_string
= ft2232_device_desc
;
1002 openex_flags
= FT_OPEN_BY_DESCRIPTION
;
1004 else if (ft2232_serial
)
1006 openex_string
= ft2232_serial
;
1007 openex_flags
= FT_OPEN_BY_SERIAL_NUMBER
;
1011 ERROR("neither device description nor serial number specified");
1012 ERROR("please add \"ft2232_device_desc <string>\" or \"ft2232_serial <string>\" to your .cfg file");
1014 return ERROR_JTAG_INIT_FAILED
;
1017 if ((status
= FT_OpenEx(openex_string
, openex_flags
, &ftdih
)) != FT_OK
)
1021 ERROR("unable to open ftdi device: %i", status
);
1022 status
= FT_ListDevices(&num_devices
, NULL
, FT_LIST_NUMBER_ONLY
);
1023 if (status
== FT_OK
)
1025 char **desc_array
= malloc(sizeof(char*) * (num_devices
+ 1));
1028 for (i
= 0; i
< num_devices
; i
++)
1029 desc_array
[i
] = malloc(64);
1030 desc_array
[num_devices
] = NULL
;
1032 status
= FT_ListDevices(desc_array
, &num_devices
, FT_LIST_ALL
| openex_flags
);
1034 if (status
== FT_OK
)
1036 ERROR("ListDevices: %d\n", num_devices
);
1037 for (i
= 0; i
< num_devices
; i
++)
1038 ERROR("%i: %s", i
, desc_array
[i
]);
1041 for (i
= 0; i
< num_devices
; i
++)
1042 free(desc_array
[i
]);
1047 printf("ListDevices: NONE\n");
1049 return ERROR_JTAG_INIT_FAILED
;
1052 if ((status
= FT_SetLatencyTimer(ftdih
, 2)) != FT_OK
)
1054 ERROR("unable to set latency timer: %i", status
);
1055 return ERROR_JTAG_INIT_FAILED
;
1058 if ((status
= FT_GetLatencyTimer(ftdih
, &latency_timer
)) != FT_OK
)
1060 ERROR("unable to get latency timer: %i", status
);
1061 return ERROR_JTAG_INIT_FAILED
;
1065 DEBUG("current latency timer: %i", latency_timer
);
1068 if ((status
= FT_SetTimeouts(ftdih
, 5000, 5000)) != FT_OK
)
1070 ERROR("unable to set timeouts: %i", status
);
1071 return ERROR_JTAG_INIT_FAILED
;
1074 if ((status
= FT_SetBitMode(ftdih
, 0x0b, 2)) != FT_OK
)
1076 ERROR("unable to enable bit i/o mode: %i", status
);
1077 return ERROR_JTAG_INIT_FAILED
;
1079 #elif BUILD_FT2232_LIBFTDI == 1
1080 if (ftdi_init(&ftdic
) < 0)
1081 return ERROR_JTAG_INIT_FAILED
;
1083 /* context, vendor id, product id */
1084 if (ftdi_usb_open(&ftdic
, ft2232_vid
, ft2232_pid
) < 0)
1086 ERROR("unable to open ftdi device: %s", ftdic
.error_str
);
1087 return ERROR_JTAG_INIT_FAILED
;
1090 if (ftdi_usb_reset(&ftdic
) < 0)
1092 ERROR("unable to reset ftdi device");
1093 return ERROR_JTAG_INIT_FAILED
;
1096 if (ftdi_set_latency_timer(&ftdic
, 2) < 0)
1098 ERROR("unable to set latency timer");
1099 return ERROR_JTAG_INIT_FAILED
;
1102 if (ftdi_get_latency_timer(&ftdic
, &latency_timer
) < 0)
1104 ERROR("unable to get latency timer");
1105 return ERROR_JTAG_INIT_FAILED
;
1109 DEBUG("current latency timer: %i", latency_timer
);
1112 ftdic
.bitbang_mode
= 0; /* Reset controller */
1113 ftdi_enable_bitbang(&ftdic
, 0x0b); /* ctx, JTAG I/O mask */
1115 ftdic
.bitbang_mode
= 2; /* MPSSE mode */
1116 ftdi_enable_bitbang(&ftdic
, 0x0b); /* ctx, JTAG I/O mask */
1119 ft2232_buffer_size
= 0;
1120 ft2232_buffer
= malloc(FT2232_BUFFER_SIZE
);
1122 if (layout
->init() != ERROR_OK
)
1123 return ERROR_JTAG_INIT_FAILED
;
1125 ft2232_speed(jtag_speed
);
1127 buf
[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
1128 if (((retval
= ft2232_write(buf
, 1, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 1))
1130 ERROR("couldn't write to FT2232 to disable loopback");
1131 return ERROR_JTAG_INIT_FAILED
;
1134 #if BUILD_FT2232_FTD2XX == 1
1135 if ((status
= FT_Purge(ftdih
, FT_PURGE_RX
| FT_PURGE_TX
)) != FT_OK
)
1137 ERROR("error purging ftd2xx device: %i", status
);
1138 return ERROR_JTAG_INIT_FAILED
;
1140 #elif BUILD_FT2232_LIBFTDI == 1
1141 if (ftdi_usb_purge_buffers(&ftdic
) < 0)
1143 ERROR("ftdi_purge_buffers: %s", ftdic
.error_str
);
1144 return ERROR_JTAG_INIT_FAILED
;
1151 int usbjtag_init(void)
1157 low_direction
= 0x0b;
1159 if (strcmp(ft2232_layout
, "usbjtag") == 0)
1166 else if (strcmp(ft2232_layout
, "signalyzer") == 0)
1173 else if (strcmp(ft2232_layout
, "evb_lm3s811") == 0)
1180 low_direction
= 0x8b;
1184 ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout
);
1185 return ERROR_JTAG_INIT_FAILED
;
1188 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1190 low_direction
&= ~nTRSTnOE
; /* nTRST input */
1191 low_output
&= ~nTRST
; /* nTRST = 0 */
1195 low_direction
|= nTRSTnOE
; /* nTRST output */
1196 low_output
|= nTRST
; /* nTRST = 1 */
1199 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1201 low_direction
|= nSRSTnOE
; /* nSRST output */
1202 low_output
|= nSRST
; /* nSRST = 1 */
1206 low_direction
&= ~nSRSTnOE
; /* nSRST input */
1207 low_output
&= ~nSRST
; /* nSRST = 0 */
1210 /* initialize low byte for jtag */
1211 buf
[0] = 0x80; /* command "set data bits low byte" */
1212 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, xRST high) */
1213 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in */
1214 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1216 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1218 ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
1219 return ERROR_JTAG_INIT_FAILED
;
1225 int jtagkey_init(void)
1231 low_direction
= 0x1b;
1233 /* initialize low byte for jtag */
1234 buf
[0] = 0x80; /* command "set data bits low byte" */
1235 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1236 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1237 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1239 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1241 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1242 return ERROR_JTAG_INIT_FAILED
;
1245 if (strcmp(layout
->name
, "jtagkey") == 0)
1252 else if (strcmp(layout
->name
, "jtagkey_prototype_v1") == 0)
1261 ERROR("BUG: jtagkey_init called for non jtagkey layout");
1266 high_direction
= 0x0f;
1268 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1270 high_output
|= nTRSTnOE
;
1271 high_output
&= ~nTRST
;
1275 high_output
&= ~nTRSTnOE
;
1276 high_output
|= nTRST
;
1279 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1281 high_output
&= ~nSRSTnOE
;
1282 high_output
|= nSRST
;
1286 high_output
|= nSRSTnOE
;
1287 high_output
&= ~nSRST
;
1290 /* initialize high port */
1291 buf
[0] = 0x82; /* command "set data bits high byte" */
1292 buf
[1] = high_output
; /* value */
1293 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1294 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1296 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1298 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1299 return ERROR_JTAG_INIT_FAILED
;
1305 int olimex_jtag_init(void)
1311 low_direction
= 0x1b;
1313 /* initialize low byte for jtag */
1314 buf
[0] = 0x80; /* command "set data bits low byte" */
1315 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1316 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
1317 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1319 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1321 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1322 return ERROR_JTAG_INIT_FAILED
;
1328 nSRSTnOE
= 0x00; /* no output enable for nSRST */
1331 high_direction
= 0x0f;
1333 if (jtag_reset_config
& RESET_TRST_OPEN_DRAIN
)
1335 high_output
|= nTRSTnOE
;
1336 high_output
&= ~nTRST
;
1340 high_output
&= ~nTRSTnOE
;
1341 high_output
|= nTRST
;
1344 if (jtag_reset_config
& RESET_SRST_PUSH_PULL
)
1346 ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD");
1350 high_output
&= ~nSRST
;
1353 /* turn red LED on */
1354 high_output
|= 0x08;
1356 /* initialize high port */
1357 buf
[0] = 0x82; /* command "set data bits high byte" */
1358 buf
[1] = high_output
; /* value */
1359 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1360 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1362 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1364 ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
1365 return ERROR_JTAG_INIT_FAILED
;
1371 int m5960_init(void)
1377 low_direction
= 0xfb;
1379 /* initialize low byte for jtag */
1380 buf
[0] = 0x80; /* command "set data bits low byte" */
1381 buf
[1] = low_output
; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
1382 buf
[2] = low_direction
; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE[12]=out, n[ST]srst=out */
1383 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1385 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1387 ERROR("couldn't initialize FT2232 with 'm5960' layout");
1388 return ERROR_JTAG_INIT_FAILED
;
1392 nTRSTnOE
= 0x0; /* not output enable for nTRST */
1394 nSRSTnOE
= 0x00; /* no output enable for nSRST */
1397 high_direction
= 0x0c;
1399 /* turn red LED1 on, LED2 off */
1400 high_output
|= 0x08;
1402 /* initialize high port */
1403 buf
[0] = 0x82; /* command "set data bits high byte" */
1404 buf
[1] = high_output
; /* value */
1405 buf
[2] = high_direction
; /* all outputs (xRST and xRSTnOE) */
1406 DEBUG("%2.2x %2.2x %2.2x", buf
[0], buf
[1], buf
[2]);
1408 if (((ft2232_write(buf
, 3, &bytes_written
)) != ERROR_OK
) || (bytes_written
!= 3))
1410 ERROR("couldn't initialize FT2232 with 'm5960' layout");
1411 return ERROR_JTAG_INIT_FAILED
;
1417 void olimex_jtag_blink(void)
1419 /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
1420 * ACBUS3 is bit 3 of the GPIOH port
1422 if (high_output
& 0x08)
1424 /* set port pin high */
1425 high_output
&= 0x07;
1429 /* set port pin low */
1430 high_output
|= 0x08;
1434 BUFFER_ADD
= high_output
;
1435 BUFFER_ADD
= high_direction
;
1438 int ft2232_quit(void)
1440 #if BUILD_FT2232_FTD2XX == 1
1443 status
= FT_Close(ftdih
);
1444 #elif BUILD_FT2232_LIBFTDI == 1
1445 ftdi_disable_bitbang(&ftdic
);
1447 ftdi_usb_close(&ftdic
);
1449 ftdi_deinit(&ftdic
);
1452 free(ft2232_buffer
);
1457 int ft2232_handle_device_desc_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1461 ft2232_device_desc
= strdup(args
[0]);
1465 ERROR("expected exactly one argument to ft2232_device_desc <description>");
1471 int ft2232_handle_serial_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1475 ft2232_serial
= strdup(args
[0]);
1479 ERROR("expected exactly one argument to ft2232_serial <serial-number>");
1485 int ft2232_handle_layout_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1490 ft2232_layout
= malloc(strlen(args
[0]) + 1);
1491 strcpy(ft2232_layout
, args
[0]);
1496 int ft2232_handle_vid_pid_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1500 ft2232_vid
= strtol(args
[0], NULL
, 0);
1501 ft2232_pid
= strtol(args
[1], NULL
, 0);
1505 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)