jtag_libusb_bulk_read|write: return error code instead of size
[fw/openocd] / src / jtag / drivers / ft232r.c
1 /***************************************************************************
2  *   Copyright (C) 2010 Serge Vakulenko                                    *
3  *   serge@vak.ru                                                          *
4  *                                                                         *
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.                                   *
9  *                                                                         *
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.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
17  ***************************************************************************/
18
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23 #if IS_CYGWIN == 1
24 #include "windows.h"
25 #undef LOG_ERROR
26 #endif
27
28 /* project specific includes */
29 #include <jtag/interface.h>
30 #include <jtag/commands.h>
31 #include <helper/time_support.h>
32 #include "libusb1_common.h"
33
34 /* system includes */
35 #include <string.h>
36 #include <stdlib.h>
37 #include <unistd.h>
38 #include <sys/time.h>
39 #include <time.h>
40
41 /*
42  * Sync bit bang mode is implemented as described in FTDI Application
43  * Note AN232R-01: "Bit Bang Modes for the FT232R and FT245R".
44  */
45
46 /*
47  * USB endpoints.
48  */
49 #define IN_EP                   0x02
50 #define OUT_EP                  0x81
51
52 /* Requests */
53 #define SIO_RESET               0 /* Reset the port */
54 #define SIO_MODEM_CTRL          1 /* Set the modem control register */
55 #define SIO_SET_FLOW_CTRL       2 /* Set flow control register */
56 #define SIO_SET_BAUD_RATE       3 /* Set baud rate */
57 #define SIO_SET_DATA            4 /* Set the data characteristics of the port */
58 #define SIO_POLL_MODEM_STATUS   5
59 #define SIO_SET_EVENT_CHAR      6
60 #define SIO_SET_ERROR_CHAR      7
61 #define SIO_SET_LATENCY_TIMER   9
62 #define SIO_GET_LATENCY_TIMER   10
63 #define SIO_SET_BITMODE         11
64 #define SIO_READ_PINS           12
65 #define SIO_READ_EEPROM         0x90
66 #define SIO_WRITE_EEPROM        0x91
67 #define SIO_ERASE_EEPROM        0x92
68
69 #define FT232R_BUF_SIZE_EXTRA   4096
70
71 static char *ft232r_serial_desc;
72 static uint16_t ft232r_vid = 0x0403; /* FTDI */
73 static uint16_t ft232r_pid = 0x6001; /* FT232R */
74 static jtag_libusb_device_handle *adapter;
75
76 static uint8_t *ft232r_output;
77 static size_t ft232r_output_len;
78
79 /**
80  * FT232R GPIO bit number to RS232 name
81  */
82 #define FT232R_BIT_COUNT 8
83 static char *ft232r_bit_name_array[FT232R_BIT_COUNT] = {
84         "TXD", /* 0: pin 1  TCK output */
85         "RXD", /* 1: pin 5  TDI output */
86         "RTS", /* 2: pin 3  TDO input */
87         "CTS", /* 3: pin 11 TMS output */
88         "DTR", /* 4: pin 2  /TRST output */
89         "DSR", /* 5: pin 9  unused */
90         "DCD", /* 6: pin 10 /SYSRST output */
91         "RI"   /* 7: pin 6  unused */
92 };
93
94 static int tck_gpio; /* initialized to 0 by default */
95 static int tdi_gpio = 1;
96 static int tdo_gpio = 2;
97 static int tms_gpio = 3;
98 static int ntrst_gpio = 4;
99 static int nsysrst_gpio = 6;
100 static size_t ft232r_buf_size = FT232R_BUF_SIZE_EXTRA;
101 /** 0xFFFF disables restore by default, after exit serial port will not work.
102  *  0x15 sets TXD RTS DTR as outputs, after exit serial port will continue to work.
103  */
104 static uint16_t ft232r_restore_bitmode = 0xFFFF;
105
106 /**
107  * Perform sync bitbang output/input transaction.
108  * Before call, an array ft232r_output[] should be filled with data to send.
109  * Counter ft232r_output_len contains the number of bytes to send.
110  * On return, received data is put back to array ft232r_output[].
111  */
112 static int ft232r_send_recv(void)
113 {
114         /* FIFO TX buffer has 128 bytes.
115          * FIFO RX buffer has 256 bytes.
116          * First two bytes of received packet contain contain modem
117          * and line status and are ignored.
118          * Unfortunately, transfer sizes bigger than 64 bytes
119          * frequently cause hang ups. */
120         assert(ft232r_output_len > 0);
121
122         size_t total_written = 0;
123         size_t total_read = 0;
124         int rxfifo_free = 128;
125
126         while (total_read < ft232r_output_len) {
127                 /* Write */
128                 int bytes_to_write = ft232r_output_len - total_written;
129                 if (bytes_to_write > 64)
130                         bytes_to_write = 64;
131                 if (bytes_to_write > rxfifo_free)
132                         bytes_to_write = rxfifo_free;
133
134                 if (bytes_to_write) {
135                         int n;
136
137                         if (jtag_libusb_bulk_write(adapter, IN_EP,
138                                                    (char *) ft232r_output + total_written,
139                                                    bytes_to_write, 1000, &n) != ERROR_OK) {
140                                 LOG_ERROR("usb bulk write failed");
141                                 return ERROR_JTAG_DEVICE_ERROR;
142                         }
143
144                         total_written += n;
145                         rxfifo_free -= n;
146                 }
147
148                 /* Read */
149                 uint8_t reply[64];
150                 int n;
151
152                 if (jtag_libusb_bulk_read(adapter, OUT_EP, (char *) reply,
153                                           sizeof(reply), 1000, &n) != ERROR_OK) {
154                         LOG_ERROR("usb bulk read failed");
155                         return ERROR_JTAG_DEVICE_ERROR;
156                 }
157                 if (n > 2) {
158                         /* Copy data, ignoring first 2 bytes. */
159                         memcpy(ft232r_output + total_read, reply + 2, n - 2);
160                         int bytes_read = n - 2;
161                         total_read += bytes_read;
162                         rxfifo_free += bytes_read;
163                         if (total_read > total_written) {
164                                 LOG_ERROR("read more bytes than wrote");
165                                 return ERROR_JTAG_DEVICE_ERROR;
166                         }
167                 }
168         }
169         ft232r_output_len = 0;
170         return ERROR_OK;
171 }
172
173 void ft232r_increase_buf_size(size_t new_buf_size)
174 {
175         uint8_t *new_buf_ptr;
176         if (new_buf_size >= ft232r_buf_size) {
177                 new_buf_size += FT232R_BUF_SIZE_EXTRA;
178                 new_buf_ptr = realloc(ft232r_output, new_buf_size);
179                 if (new_buf_ptr != NULL) {
180                         ft232r_output = new_buf_ptr;
181                         ft232r_buf_size = new_buf_size;
182                 }
183         }
184 }
185
186 /**
187  * Add one TCK/TMS/TDI sample to send buffer.
188  */
189 static void ft232r_write(int tck, int tms, int tdi)
190 {
191         unsigned out_value = (1<<ntrst_gpio) | (1<<nsysrst_gpio);
192         if (tck)
193                 out_value |= (1<<tck_gpio);
194         if (tms)
195                 out_value |= (1<<tms_gpio);
196         if (tdi)
197                 out_value |= (1<<tdi_gpio);
198
199         ft232r_increase_buf_size(ft232r_output_len);
200
201         if (ft232r_output_len >= ft232r_buf_size) {
202                 /* FIXME: should we just execute queue here? */
203                 LOG_ERROR("ft232r_write: buffer overflow");
204                 return;
205         }
206         ft232r_output[ft232r_output_len++] = out_value;
207 }
208
209 /**
210  * Control /TRST and /SYSRST pins.
211  * Perform immediate bitbang transaction.
212  */
213 static void ft232r_reset(int trst, int srst)
214 {
215         unsigned out_value = (1<<ntrst_gpio) | (1<<nsysrst_gpio);
216         LOG_DEBUG("ft232r_reset(%d,%d)", trst, srst);
217
218         if (trst == 1)
219                 out_value &= ~(1<<ntrst_gpio);          /* switch /TRST low */
220         else if (trst == 0)
221                 out_value |= (1<<ntrst_gpio);                   /* switch /TRST high */
222
223         if (srst == 1)
224                 out_value &= ~(1<<nsysrst_gpio);                /* switch /SYSRST low */
225         else if (srst == 0)
226                 out_value |= (1<<nsysrst_gpio);         /* switch /SYSRST high */
227
228         ft232r_increase_buf_size(ft232r_output_len);
229
230         if (ft232r_output_len >= ft232r_buf_size) {
231                 /* FIXME: should we just execute queue here? */
232                 LOG_ERROR("ft232r_write: buffer overflow");
233                 return;
234         }
235
236         ft232r_output[ft232r_output_len++] = out_value;
237         ft232r_send_recv();
238 }
239
240 static int ft232r_speed(int divisor)
241 {
242         int baud = (divisor == 0) ? 3000000 :
243                 (divisor == 1) ? 2000000 :
244                 3000000 / divisor;
245         LOG_DEBUG("ft232r_speed(%d) rate %d bits/sec", divisor, baud);
246
247         if (jtag_libusb_control_transfer(adapter,
248                 LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
249                 SIO_SET_BAUD_RATE, divisor, 0, 0, 0, 1000) != 0) {
250                 LOG_ERROR("cannot set baud rate");
251                 return ERROR_JTAG_DEVICE_ERROR;
252         }
253         return ERROR_OK;
254 }
255
256 static int ft232r_init(void)
257 {
258         uint16_t avids[] = {ft232r_vid, 0};
259         uint16_t apids[] = {ft232r_pid, 0};
260         if (jtag_libusb_open(avids, apids, ft232r_serial_desc, &adapter)) {
261                 LOG_ERROR("ft232r not found: vid=%04x, pid=%04x, serial=%s\n",
262                         ft232r_vid, ft232r_pid, (ft232r_serial_desc == NULL) ? "[any]" : ft232r_serial_desc);
263                 return ERROR_JTAG_INIT_FAILED;
264         }
265
266         if (ft232r_restore_bitmode == 0xFFFF) /* serial port will not be restored after jtag: */
267                 libusb_detach_kernel_driver(adapter, 0);
268         else /* serial port will be restored after jtag: */
269                 libusb_set_auto_detach_kernel_driver(adapter, 1); /* 1: DONT_DETACH_SIO_MODULE */
270
271         if (jtag_libusb_claim_interface(adapter, 0)) {
272                 LOG_ERROR("unable to claim interface");
273                 return ERROR_JTAG_INIT_FAILED;
274         }
275
276         /* Reset the device. */
277         if (jtag_libusb_control_transfer(adapter,
278                 LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
279                 SIO_RESET, 0, 0, 0, 0, 1000) != 0) {
280                 LOG_ERROR("unable to reset device");
281                 return ERROR_JTAG_INIT_FAILED;
282         }
283
284         /* Sync bit bang mode. */
285         if (jtag_libusb_control_transfer(adapter,
286                 LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
287                 SIO_SET_BITMODE, (1<<tck_gpio) | (1<<tdi_gpio) | (1<<tms_gpio) | (1<<ntrst_gpio) | (1<<nsysrst_gpio) | 0x400,
288                 0, 0, 0, 1000) != 0) {
289                 LOG_ERROR("cannot set sync bitbang mode");
290                 return ERROR_JTAG_INIT_FAILED;
291         }
292
293         /* Exactly 500 nsec between updates. */
294         unsigned divisor = 1;
295         unsigned char latency_timer = 1;
296
297         /* Frequency divisor is 14-bit non-zero value. */
298         if (jtag_libusb_control_transfer(adapter,
299                 LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
300                 SIO_SET_BAUD_RATE, divisor,
301                 0, 0, 0, 1000) != 0) {
302                 LOG_ERROR("cannot set baud rate");
303                 return ERROR_JTAG_INIT_FAILED;
304         }
305         if (jtag_libusb_control_transfer(adapter,
306                 LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
307                 SIO_SET_LATENCY_TIMER, latency_timer, 0, 0, 0, 1000) != 0) {
308                 LOG_ERROR("unable to set latency timer");
309                 return ERROR_JTAG_INIT_FAILED;
310         }
311
312         ft232r_output = malloc(ft232r_buf_size);
313         if (ft232r_output == NULL) {
314                 LOG_ERROR("Unable to allocate memory for the buffer");
315                 return ERROR_JTAG_INIT_FAILED;
316         }
317
318         return ERROR_OK;
319 }
320
321 static int ft232r_quit(void)
322 {
323         /* to restore serial port: set TXD RTS DTR as outputs, others as inputs, disable sync bit bang mode. */
324         if (ft232r_restore_bitmode != 0xFFFF) {
325                 if (jtag_libusb_control_transfer(adapter,
326                         LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
327                         SIO_SET_BITMODE, ft232r_restore_bitmode,
328                         0, 0, 0, 1000) != 0) {
329                         LOG_ERROR("cannot set bitmode to restore serial port");
330                 }
331         }
332
333         if (jtag_libusb_release_interface(adapter, 0) != 0)
334                 LOG_ERROR("usb release interface failed");
335
336         jtag_libusb_close(adapter);
337
338         free(ft232r_output); /* free used memory */
339         ft232r_output = NULL; /* reset pointer to memory */
340         ft232r_buf_size = FT232R_BUF_SIZE_EXTRA; /* reset next initial buffer size */
341
342         return ERROR_OK;
343 }
344
345 static int ft232r_speed_div(int divisor, int *khz)
346 {
347         /* Maximum 3 Mbaud for bit bang mode. */
348         if (divisor == 0)
349                 *khz = 3000;
350         else if (divisor == 1)
351                 *khz = 2000;
352         else
353                 *khz = 3000 / divisor;
354         return ERROR_OK;
355 }
356
357 static int ft232r_khz(int khz, int *divisor)
358 {
359         if (khz == 0) {
360                 LOG_DEBUG("RCLK not supported");
361                 return ERROR_FAIL;
362         }
363
364         /* Calculate frequency divisor. */
365         if (khz > 2500)
366                 *divisor = 0;           /* Special case: 3 MHz */
367         else if (khz > 1700)
368                 *divisor = 1;           /* Special case: 2 MHz */
369         else {
370                 *divisor = (2*3000 / khz + 1) / 2;
371                 if (*divisor > 0x3FFF)
372                         *divisor = 0x3FFF;
373         }
374         return ERROR_OK;
375 }
376
377 static char *ft232r_bit_number_to_name(int bit)
378 {
379         if (bit >= 0 && bit < FT232R_BIT_COUNT)
380                 return ft232r_bit_name_array[bit];
381         return "?";
382 }
383
384 static int ft232r_bit_name_to_number(const char *name)
385 {
386         int i;
387         if (name[0] >= '0' && name[0] <= '9' && name[1] == '\0') {
388                 i = atoi(name);
389                 if (i >= 0 && i < FT232R_BIT_COUNT)
390                         return i;
391         }
392         for (i = 0; i < FT232R_BIT_COUNT; i++)
393                 if (strcasecmp(name, ft232r_bit_name_array[i]) == 0)
394                         return i;
395         return -1;
396 }
397
398 COMMAND_HANDLER(ft232r_handle_serial_desc_command)
399 {
400         if (CMD_ARGC == 1)
401                 ft232r_serial_desc = strdup(CMD_ARGV[0]);
402         else
403                 LOG_ERROR("require exactly one argument to "
404                                   "ft232r_serial_desc <serial>");
405         return ERROR_OK;
406 }
407
408 COMMAND_HANDLER(ft232r_handle_vid_pid_command)
409 {
410         if (CMD_ARGC > 2) {
411                 LOG_WARNING("ignoring extra IDs in ft232r_vid_pid "
412                                         "(maximum is 1 pair)");
413                 CMD_ARGC = 2;
414         }
415         if (CMD_ARGC == 2) {
416                 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[0], ft232r_vid);
417                 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[1], ft232r_pid);
418         } else
419                 LOG_WARNING("incomplete ft232r_vid_pid configuration");
420
421         return ERROR_OK;
422 }
423
424 COMMAND_HANDLER(ft232r_handle_jtag_nums_command)
425 {
426         if (CMD_ARGC == 4) {
427                 tck_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
428                 tms_gpio = ft232r_bit_name_to_number(CMD_ARGV[1]);
429                 tdi_gpio = ft232r_bit_name_to_number(CMD_ARGV[2]);
430                 tdo_gpio = ft232r_bit_name_to_number(CMD_ARGV[3]);
431         } else if (CMD_ARGC != 0)
432                 return ERROR_COMMAND_SYNTAX_ERROR;
433
434         if (tck_gpio < 0)
435                 return ERROR_COMMAND_SYNTAX_ERROR;
436         if (tms_gpio < 0)
437                 return ERROR_COMMAND_SYNTAX_ERROR;
438         if (tdi_gpio < 0)
439                 return ERROR_COMMAND_SYNTAX_ERROR;
440         if (tdo_gpio < 0)
441                 return ERROR_COMMAND_SYNTAX_ERROR;
442
443         command_print(CMD,
444                         "FT232R nums: TCK = %d %s, TMS = %d %s, TDI = %d %s, TDO = %d %s",
445                         tck_gpio, ft232r_bit_number_to_name(tck_gpio),
446                         tms_gpio, ft232r_bit_number_to_name(tms_gpio),
447                         tdi_gpio, ft232r_bit_number_to_name(tdi_gpio),
448                         tdo_gpio, ft232r_bit_number_to_name(tdo_gpio));
449
450         return ERROR_OK;
451 }
452
453 COMMAND_HANDLER(ft232r_handle_tck_num_command)
454 {
455         if (CMD_ARGC == 1)
456                 tck_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
457         else if (CMD_ARGC != 0)
458                 return ERROR_COMMAND_SYNTAX_ERROR;
459
460         if (tck_gpio < 0)
461                 return ERROR_COMMAND_SYNTAX_ERROR;
462
463         command_print(CMD,
464                         "FT232R num: TCK = %d %s", tck_gpio, ft232r_bit_number_to_name(tck_gpio));
465
466         return ERROR_OK;
467 }
468
469 COMMAND_HANDLER(ft232r_handle_tms_num_command)
470 {
471         if (CMD_ARGC == 1)
472                 tms_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
473         else if (CMD_ARGC != 0)
474                 return ERROR_COMMAND_SYNTAX_ERROR;
475
476         if (tms_gpio < 0)
477                 return ERROR_COMMAND_SYNTAX_ERROR;
478
479         command_print(CMD,
480                         "FT232R num: TMS = %d %s", tms_gpio, ft232r_bit_number_to_name(tms_gpio));
481
482         return ERROR_OK;
483 }
484
485 COMMAND_HANDLER(ft232r_handle_tdo_num_command)
486 {
487         if (CMD_ARGC == 1)
488                 tdo_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
489         else if (CMD_ARGC != 0)
490                 return ERROR_COMMAND_SYNTAX_ERROR;
491
492         if (tdo_gpio < 0)
493                 return ERROR_COMMAND_SYNTAX_ERROR;
494
495         command_print(CMD,
496                         "FT232R num: TDO = %d %s", tdo_gpio, ft232r_bit_number_to_name(tdo_gpio));
497
498         return ERROR_OK;
499 }
500
501 COMMAND_HANDLER(ft232r_handle_tdi_num_command)
502 {
503         if (CMD_ARGC == 1)
504                 tdi_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
505         else if (CMD_ARGC != 0)
506                 return ERROR_COMMAND_SYNTAX_ERROR;
507
508         if (tdi_gpio < 0)
509                 return ERROR_COMMAND_SYNTAX_ERROR;
510
511         command_print(CMD,
512                         "FT232R num: TDI = %d %s", tdi_gpio, ft232r_bit_number_to_name(tdi_gpio));
513
514         return ERROR_OK;
515 }
516
517 COMMAND_HANDLER(ft232r_handle_trst_num_command)
518 {
519         if (CMD_ARGC == 1)
520                 ntrst_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
521         else if (CMD_ARGC != 0)
522                 return ERROR_COMMAND_SYNTAX_ERROR;
523
524         if (ntrst_gpio < 0)
525                 return ERROR_COMMAND_SYNTAX_ERROR;
526
527         command_print(CMD,
528                         "FT232R num: TRST = %d %s", ntrst_gpio, ft232r_bit_number_to_name(ntrst_gpio));
529
530         return ERROR_OK;
531 }
532
533 COMMAND_HANDLER(ft232r_handle_srst_num_command)
534 {
535         if (CMD_ARGC == 1)
536                 nsysrst_gpio = ft232r_bit_name_to_number(CMD_ARGV[0]);
537         else if (CMD_ARGC != 0)
538                 return ERROR_COMMAND_SYNTAX_ERROR;
539
540         if (nsysrst_gpio < 0)
541                 return ERROR_COMMAND_SYNTAX_ERROR;
542
543         command_print(CMD,
544                         "FT232R num: SRST = %d %s", nsysrst_gpio, ft232r_bit_number_to_name(nsysrst_gpio));
545
546         return ERROR_OK;
547 }
548
549 COMMAND_HANDLER(ft232r_handle_restore_serial_command)
550 {
551         if (CMD_ARGC == 1)
552                 COMMAND_PARSE_NUMBER(u16, CMD_ARGV[0], ft232r_restore_bitmode);
553         else if (CMD_ARGC != 0)
554                 return ERROR_COMMAND_SYNTAX_ERROR;
555
556         command_print(CMD,
557                         "FT232R restore serial: 0x%04X (%s)",
558                         ft232r_restore_bitmode, ft232r_restore_bitmode == 0xFFFF ? "disabled" : "enabled");
559
560         return ERROR_OK;
561 }
562
563 static const struct command_registration ft232r_command_handlers[] = {
564         {
565                 .name = "ft232r_serial_desc",
566                 .handler = ft232r_handle_serial_desc_command,
567                 .mode = COMMAND_CONFIG,
568                 .help = "USB serial descriptor of the adapter",
569                 .usage = "serial string",
570         },
571         {
572                 .name = "ft232r_vid_pid",
573                 .handler = ft232r_handle_vid_pid_command,
574                 .mode = COMMAND_CONFIG,
575                 .help = "USB VID and PID of the adapter",
576                 .usage = "vid pid",
577         },
578         {
579                 .name = "ft232r_jtag_nums",
580                 .handler = ft232r_handle_jtag_nums_command,
581                 .mode = COMMAND_CONFIG,
582                 .help = "gpio numbers for tck, tms, tdi, tdo. (in that order)",
583                 .usage = "<0-7|TXD-RI> <0-7|TXD-RI> <0-7|TXD-RI> <0-7|TXD-RI>",
584         },
585         {
586                 .name = "ft232r_tck_num",
587                 .handler = ft232r_handle_tck_num_command,
588                 .mode = COMMAND_CONFIG,
589                 .help = "gpio number for tck.",
590                 .usage = "<0-7|TXD|RXD|RTS|CTS|DTR|DSR|DCD|RI>",
591         },
592         {
593                 .name = "ft232r_tms_num",
594                 .handler = ft232r_handle_tms_num_command,
595                 .mode = COMMAND_CONFIG,
596                 .help = "gpio number for tms.",
597                 .usage = "<0-7|TXD|RXD|RTS|CTS|DTR|DSR|DCD|RI>",
598         },
599         {
600                 .name = "ft232r_tdo_num",
601                 .handler = ft232r_handle_tdo_num_command,
602                 .mode = COMMAND_CONFIG,
603                 .help = "gpio number for tdo.",
604                 .usage = "<0-7|TXD|RXD|RTS|CTS|DTR|DSR|DCD|RI>",
605         },
606         {
607                 .name = "ft232r_tdi_num",
608                 .handler = ft232r_handle_tdi_num_command,
609                 .mode = COMMAND_CONFIG,
610                 .help = "gpio number for tdi.",
611                 .usage = "<0-7|TXD|RXD|RTS|CTS|DTR|DSR|DCD|RI>",
612         },
613         {
614                 .name = "ft232r_srst_num",
615                 .handler = ft232r_handle_srst_num_command,
616                 .mode = COMMAND_CONFIG,
617                 .help = "gpio number for srst.",
618                 .usage = "<0-7|TXD|RXD|RTS|CTS|DTR|DSR|DCD|RI>",
619         },
620         {
621                 .name = "ft232r_trst_num",
622                 .handler = ft232r_handle_trst_num_command,
623                 .mode = COMMAND_CONFIG,
624                 .help = "gpio number for trst.",
625                 .usage = "<0-7|TXD|RXD|RTS|CTS|DTR|DSR|DCD|RI>",
626         },
627         {
628                 .name = "ft232r_restore_serial",
629                 .handler = ft232r_handle_restore_serial_command,
630                 .mode = COMMAND_CONFIG,
631                 .help = "bitmode control word that restores serial port.",
632                 .usage = "bitmode_control_word",
633         },
634         COMMAND_REGISTRATION_DONE
635 };
636
637 /*
638  * Synchronous bitbang protocol implementation.
639  */
640
641 static void syncbb_end_state(tap_state_t state)
642 {
643         if (tap_is_state_stable(state))
644                 tap_set_end_state(state);
645         else {
646                 LOG_ERROR("BUG: %i is not a valid end state", state);
647                 exit(-1);
648         }
649 }
650
651 static void syncbb_state_move(int skip)
652 {
653         int i = 0, tms = 0;
654         uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
655         int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
656
657         for (i = skip; i < tms_count; i++) {
658                 tms = (tms_scan >> i) & 1;
659                 ft232r_write(0, tms, 0);
660                 ft232r_write(1, tms, 0);
661         }
662         ft232r_write(0, tms, 0);
663
664         tap_set_state(tap_get_end_state());
665 }
666
667 /**
668  * Clock a bunch of TMS (or SWDIO) transitions, to change the JTAG
669  * (or SWD) state machine.
670  */
671 static int syncbb_execute_tms(struct jtag_command *cmd)
672 {
673         unsigned num_bits = cmd->cmd.tms->num_bits;
674         const uint8_t *bits = cmd->cmd.tms->bits;
675
676         LOG_DEBUG_IO("TMS: %d bits", num_bits);
677
678         int tms = 0;
679         for (unsigned i = 0; i < num_bits; i++) {
680                 tms = ((bits[i/8] >> (i % 8)) & 1);
681                 ft232r_write(0, tms, 0);
682                 ft232r_write(1, tms, 0);
683         }
684         ft232r_write(0, tms, 0);
685
686         return ERROR_OK;
687 }
688
689 static void syncbb_path_move(struct pathmove_command *cmd)
690 {
691         int num_states = cmd->num_states;
692         int state_count;
693         int tms = 0;
694
695         state_count = 0;
696         while (num_states) {
697                 if (tap_state_transition(tap_get_state(), false) == cmd->path[state_count]) {
698                         tms = 0;
699                 } else if (tap_state_transition(tap_get_state(), true) == cmd->path[state_count]) {
700                         tms = 1;
701                 } else {
702                         LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
703                                 tap_state_name(tap_get_state()),
704                                 tap_state_name(cmd->path[state_count]));
705                         exit(-1);
706                 }
707
708                 ft232r_write(0, tms, 0);
709                 ft232r_write(1, tms, 0);
710
711                 tap_set_state(cmd->path[state_count]);
712                 state_count++;
713                 num_states--;
714         }
715
716         ft232r_write(0, tms, 0);
717
718         tap_set_end_state(tap_get_state());
719 }
720
721 static void syncbb_runtest(int num_cycles)
722 {
723         int i;
724
725         tap_state_t saved_end_state = tap_get_end_state();
726
727         /* only do a state_move when we're not already in IDLE */
728         if (tap_get_state() != TAP_IDLE) {
729                 syncbb_end_state(TAP_IDLE);
730                 syncbb_state_move(0);
731         }
732
733         /* execute num_cycles */
734         for (i = 0; i < num_cycles; i++) {
735                 ft232r_write(0, 0, 0);
736                 ft232r_write(1, 0, 0);
737         }
738         ft232r_write(0, 0, 0);
739
740         /* finish in end_state */
741         syncbb_end_state(saved_end_state);
742         if (tap_get_state() != tap_get_end_state())
743                 syncbb_state_move(0);
744 }
745
746 /**
747  * Function syncbb_stableclocks
748  * issues a number of clock cycles while staying in a stable state.
749  * Because the TMS value required to stay in the RESET state is a 1, whereas
750  * the TMS value required to stay in any of the other stable states is a 0,
751  * this function checks the current stable state to decide on the value of TMS
752  * to use.
753  */
754 static void syncbb_stableclocks(int num_cycles)
755 {
756         int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
757         int i;
758
759         /* send num_cycles clocks onto the cable */
760         for (i = 0; i < num_cycles; i++) {
761                 ft232r_write(1, tms, 0);
762                 ft232r_write(0, tms, 0);
763         }
764 }
765
766 static void syncbb_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size)
767 {
768         tap_state_t saved_end_state = tap_get_end_state();
769         int bit_cnt, bit0_index;
770
771         if (!((!ir_scan && (tap_get_state() == TAP_DRSHIFT)) || (ir_scan && (tap_get_state() == TAP_IRSHIFT)))) {
772                 if (ir_scan)
773                         syncbb_end_state(TAP_IRSHIFT);
774                 else
775                         syncbb_end_state(TAP_DRSHIFT);
776
777                 syncbb_state_move(0);
778                 syncbb_end_state(saved_end_state);
779         }
780
781         bit0_index = ft232r_output_len;
782         for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++) {
783                 int tms = (bit_cnt == scan_size-1) ? 1 : 0;
784                 int tdi;
785                 int bytec = bit_cnt/8;
786                 int bcval = 1 << (bit_cnt % 8);
787
788                 /* if we're just reading the scan, but don't care about the output
789                  * default to outputting 'low', this also makes valgrind traces more readable,
790                  * as it removes the dependency on an uninitialised value
791                  */
792                 tdi = 0;
793                 if ((type != SCAN_IN) && (buffer[bytec] & bcval))
794                         tdi = 1;
795
796                 ft232r_write(0, tms, tdi);
797                 ft232r_write(1, tms, tdi);
798         }
799
800         if (tap_get_state() != tap_get_end_state()) {
801                 /* we *KNOW* the above loop transitioned out of
802                  * the shift state, so we skip the first state
803                  * and move directly to the end state.
804                  */
805                 syncbb_state_move(1);
806         }
807         ft232r_send_recv();
808
809         if (type != SCAN_OUT)
810                 for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++) {
811                         int bytec = bit_cnt/8;
812                         int bcval = 1 << (bit_cnt % 8);
813                         int val = ft232r_output[bit0_index + bit_cnt*2 + 1];
814
815                         if (val & (1<<tdo_gpio))
816                                 buffer[bytec] |= bcval;
817                         else
818                                 buffer[bytec] &= ~bcval;
819                 }
820 }
821
822 static int syncbb_execute_queue(void)
823 {
824         struct jtag_command *cmd = jtag_command_queue; /* currently processed command */
825         int scan_size;
826         enum scan_type type;
827         uint8_t *buffer;
828         int retval;
829
830         /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
831          * that wasn't handled by a caller-provided error handler
832          */
833         retval = ERROR_OK;
834
835 /*      ft232r_blink(1);*/
836
837         while (cmd) {
838                 switch (cmd->type) {
839                         case JTAG_RESET:
840                                 LOG_DEBUG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
841
842                                 if ((cmd->cmd.reset->trst == 1) ||
843                                         (cmd->cmd.reset->srst &&
844                                         (jtag_get_reset_config() & RESET_SRST_PULLS_TRST))) {
845                                         tap_set_state(TAP_RESET);
846                                 }
847                                 ft232r_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
848                                 break;
849
850                         case JTAG_RUNTEST:
851                                 LOG_DEBUG_IO("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles,
852                                         tap_state_name(cmd->cmd.runtest->end_state));
853
854                                 syncbb_end_state(cmd->cmd.runtest->end_state);
855                                 syncbb_runtest(cmd->cmd.runtest->num_cycles);
856                                 break;
857
858                         case JTAG_STABLECLOCKS:
859                                 /* this is only allowed while in a stable state.  A check for a stable
860                                  * state was done in jtag_add_clocks()
861                                  */
862                                 syncbb_stableclocks(cmd->cmd.stableclocks->num_cycles);
863                                 break;
864
865                         case JTAG_TLR_RESET: /* renamed from JTAG_STATEMOVE */
866                                 LOG_DEBUG_IO("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state));
867
868                                 syncbb_end_state(cmd->cmd.statemove->end_state);
869                                 syncbb_state_move(0);
870                                 break;
871
872                         case JTAG_PATHMOVE:
873                                 LOG_DEBUG_IO("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
874                                         tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
875
876                                 syncbb_path_move(cmd->cmd.pathmove);
877                                 break;
878
879                         case JTAG_SCAN:
880                                 LOG_DEBUG_IO("%s scan end in %s",  (cmd->cmd.scan->ir_scan) ? "IR" : "DR",
881                                         tap_state_name(cmd->cmd.scan->end_state));
882
883                                 syncbb_end_state(cmd->cmd.scan->end_state);
884                                 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
885                                 type = jtag_scan_type(cmd->cmd.scan);
886                                 syncbb_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
887                                 if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
888                                         retval = ERROR_JTAG_QUEUE_FAILED;
889                                 if (buffer)
890                                         free(buffer);
891                                 break;
892
893                         case JTAG_SLEEP:
894                                 LOG_DEBUG_IO("sleep %" PRIi32, cmd->cmd.sleep->us);
895
896                                 jtag_sleep(cmd->cmd.sleep->us);
897                                 break;
898
899                         case JTAG_TMS:
900                                 retval = syncbb_execute_tms(cmd);
901                                 break;
902                         default:
903                                 LOG_ERROR("BUG: unknown JTAG command type encountered");
904                                 exit(-1);
905                 }
906                 if (ft232r_output_len > 0)
907                         ft232r_send_recv();
908                 cmd = cmd->next;
909         }
910 /*      ft232r_blink(0);*/
911
912         return retval;
913 }
914
915 static struct jtag_interface ft232r_interface = {
916         .supported = DEBUG_CAP_TMS_SEQ,
917         .execute_queue = syncbb_execute_queue,
918 };
919
920 struct adapter_driver ft232r_adapter_driver = {
921         .name = "ft232r",
922         .transports = jtag_only,
923         .commands = ft232r_command_handlers,
924
925         .init = ft232r_init,
926         .quit = ft232r_quit,
927         .speed = ft232r_speed,
928         .khz = ft232r_khz,
929         .speed_div = ft232r_speed_div,
930
931         .jtag_ops = &ft232r_interface,
932 };