Laurentiu Cocanu - more help text
[fw/openocd] / src / jtag / ft2232.c
index 0b2e79c990280937d6ebf86b2e4a1b9f689bf704..47376241b18567d9997b6cccf74a062f932952c5 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2004, 2006 by Dominic Rath                              *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2008 by Spencer Oliver                                  *
+ *   spen@spen-soft.co.uk                                                  *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
@@ -153,15 +156,11 @@ static int ft2232_expect_read = 0;
 
 jtag_interface_t ft2232_interface = 
 {
-       
        .name = "ft2232",
-       
        .execute_queue = ft2232_execute_queue,
-       
        .speed = ft2232_speed,
-  .speed_div = ft2232_speed_div,
-  .khz = ft2232_khz,
-  
+       .speed_div = ft2232_speed_div,
+       .khz = ft2232_khz, 
        .register_commands = ft2232_register_commands,
        .init = ft2232_init,
        .quit = ft2232_quit,
@@ -266,60 +265,66 @@ int ft2232_speed(int speed)
 
 int ft2232_speed_div(int speed, int *khz)
 {
-  /*
-   * Take a look in the FT2232 manual, 
-   * AN2232C-01 Command Processor for
-   * MPSSE and MCU Host Bus. Chapter 3.8
-   */
-  *khz = 6000 / (1+speed);
-  
+       /* Take a look in the FT2232 manual, 
+        * AN2232C-01 Command Processor for
+        * MPSSE and MCU Host Bus. Chapter 3.8 */
+       
+       *khz = 6000 / (1+speed);
+       
        return ERROR_OK;
 }
 
 int ft2232_khz(int khz, int *jtag_speed)
 {
-  /*
-   * Take a look in the FT2232 manual, 
-   * AN2232C-01 Command Processor for
-   * MPSSE and MCU Host Bus. Chapter 3.8
-   *
-   * We will calc here with a multiplier
-   * of 10 for better rounding later.
-   */
-   
-  /* Calc speed, (6000 / khz) - 1 */
-  /* Use 65000 for better rounding */ 
-  *jtag_speed = (60000 / khz) - 10;
-  
-  /* Add 0.9 for rounding */
-  *jtag_speed += 9;
-  
-  /* Calc real speed */
-  *jtag_speed = *jtag_speed / 10;
-  
-  /* Check if speed is greater than 0 */
-  if (*jtag_speed < 0)
-  {
-    *jtag_speed = 0;
-  }    
-  
+       if (khz==0)
+       {
+               LOG_ERROR("RCLK not supported");
+               return ERROR_FAIL;
+       }
+       /* Take a look in the FT2232 manual, 
+        * AN2232C-01 Command Processor for
+        * MPSSE and MCU Host Bus. Chapter 3.8
+        * 
+        * We will calc here with a multiplier
+        * of 10 for better rounding later. */
+       
+       /* Calc speed, (6000 / khz) - 1 */
+       /* Use 65000 for better rounding */
+       *jtag_speed = (60000 / khz) - 10;
+       
+       /* Add 0.9 for rounding */
+       *jtag_speed += 9;
+       
+       /* Calc real speed */
+       *jtag_speed = *jtag_speed / 10;
+       
+       /* Check if speed is greater than 0 */
+       if (*jtag_speed < 0)
+       {
+               *jtag_speed = 0;
+       }
+       
+       /* Check max value */
+       if (*jtag_speed > 0xFFFF)
+       {
+               *jtag_speed = 0xFFFF;
+       }
+       
        return ERROR_OK;
 }
 
-
-
 int ft2232_register_commands(struct command_context_s *cmd_ctx)
 {
        register_command(cmd_ctx, NULL, "ft2232_device_desc", ft2232_handle_device_desc_command,
-               COMMAND_CONFIG, NULL);
+               COMMAND_CONFIG, "the USB device description of the FTDI FT2232 device");
        register_command(cmd_ctx, NULL, "ft2232_serial", ft2232_handle_serial_command,
-               COMMAND_CONFIG, NULL);
+               COMMAND_CONFIG, "the serial number of the FTDI FT2232 device");
        register_command(cmd_ctx, NULL, "ft2232_layout", ft2232_handle_layout_command,
-               COMMAND_CONFIG, NULL);
+               COMMAND_CONFIG, "the layout of the FT2232 GPIO signals used to control output-enables and reset signals");
        register_command(cmd_ctx, NULL, "ft2232_vid_pid", ft2232_handle_vid_pid_command,
-                                        COMMAND_CONFIG, NULL);
+                                        COMMAND_CONFIG, "the vendor ID and product ID of the FTDI FT2232 device");
        register_command(cmd_ctx, NULL, "ft2232_latency", ft2232_handle_latency_command,
-                                        COMMAND_CONFIG, NULL);
+                                        COMMAND_CONFIG, "set the FT2232 latency timer to a new value");
        return ERROR_OK;
 }
 
@@ -405,7 +410,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
        if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
        {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
-               exit(-1);
+               return retval;
        }
        
 #ifdef _DEBUG_USB_IO_
@@ -424,7 +429,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
                if ((retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read)) != ERROR_OK)
                {
                        LOG_ERROR("couldn't read from FT2232");
-                       exit(-1);
+                       return retval;
                }
                
 #ifdef _DEBUG_USB_IO_
@@ -1024,20 +1029,20 @@ void olimex_jtag_reset(int trst, int srst)
                        high_output |= nTRST;
        }
 
-    if (srst == 1)
-    {
-        high_output |= nSRST;
-    }
-    else if (srst == 0)
-    {
-        high_output &= ~nSRST;
-    }
-
-    /* command "set data bits high byte" */
-    BUFFER_ADD = 0x82;
-    BUFFER_ADD = high_output;
-    BUFFER_ADD = high_direction;
-    LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       if (srst == 1)
+       {
+               high_output |= nSRST;
+       }
+       else if (srst == 0)
+       {
+               high_output &= ~nSRST;
+       }
+
+       /* command "set data bits high byte" */
+       BUFFER_ADD = 0x82;
+       BUFFER_ADD = high_output;
+       BUFFER_ADD = high_direction;
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
 }
 
 void flyswatter_reset(int trst, int srst)
@@ -1051,20 +1056,20 @@ void flyswatter_reset(int trst, int srst)
                low_output |= nTRST;
        }
 
-    if (srst == 1)
-    {
-        low_output |= nSRST;
-    }
-    else if (srst == 0)
-    {
-        low_output &= ~nSRST;
-    }
-
-    /* command "set data bits low byte" */
-    BUFFER_ADD = 0x80;
-    BUFFER_ADD = low_output;
-    BUFFER_ADD = low_direction;
-    LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
+       if (srst == 1)
+       {
+               low_output |= nSRST;
+       }
+       else if (srst == 0)
+       {
+               low_output &= ~nSRST;
+       }
+
+       /* command "set data bits low byte" */
+       BUFFER_ADD = 0x80;
+       BUFFER_ADD = low_output;
+       BUFFER_ADD = low_direction;
+       LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
 }
 
 void turtle_reset(int trst, int srst)
@@ -1098,14 +1103,14 @@ void comstick_reset(int trst, int srst)
                high_output |= nTRST;
        }
 
-    if (srst == 1)
-    {
-        high_output &= ~nSRST;
-    }
-    else if (srst == 0)
-    {
-        high_output |= nSRST;
-    }
+       if (srst == 1)
+       {
+               high_output &= ~nSRST;
+       }
+       else if (srst == 0)
+       {
+               high_output |= nSRST;
+       }
        
        /* command "set data bits high byte" */
        BUFFER_ADD = 0x82;
@@ -1125,14 +1130,14 @@ void stm32stick_reset(int trst, int srst)
                high_output |= nTRST;
        }
 
-    if (srst == 1)
-    {
-        low_output &= ~nSRST;
-    }
-    else if (srst == 0)
-    {
-        low_output |= nSRST;
-    }
+       if (srst == 1)
+       {
+               low_output &= ~nSRST;
+       }
+       else if (srst == 0)
+       {
+               low_output |= nSRST;
+       }
        
        /* command "set data bits low byte" */
        BUFFER_ADD = 0x80;
@@ -1501,17 +1506,17 @@ static int ft2232_init_libftdi(u16 vid, u16 pid, int more, int *try_more)
        u8 latency_timer;
 
        LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)",
-           ft2232_layout, vid, pid);
+               ft2232_layout, vid, pid);
 
        if (ftdi_init(&ftdic) < 0)
                return ERROR_JTAG_INIT_FAILED;
 
        /* context, vendor id, product id */
        if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc,
-           ft2232_serial) < 0) {
+               ft2232_serial) < 0) {
                if (more)
                        LOG_WARNING("unable to open ftdi device (trying more): %s",
-                            ftdic.error_str);
+                               ftdic.error_str);
                else
                        LOG_ERROR("unable to open ftdi device: %s", ftdic.error_str);
                *try_more = 1;
@@ -1608,10 +1613,10 @@ int ft2232_init(void)
 
 #if BUILD_FT2232_FTD2XX == 1
                retval = ft2232_init_ftd2xx(ft2232_vid[i], ft2232_pid[i],
-                   more, &try_more);
+                       more, &try_more);
 #elif BUILD_FT2232_LIBFTDI == 1
                retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
-                   more, &try_more);
+                       more, &try_more);
 #endif 
                if (retval >= 0)
                        break;
@@ -2076,7 +2081,6 @@ void turtle_jtag_blink(void)
        BUFFER_ADD = high_direction;
 }
 
-
 int ft2232_quit(void)
 {
 #if BUILD_FT2232_FTD2XX == 1
@@ -2142,7 +2146,7 @@ int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd,
 
        if (argc > MAX_USB_IDS*2) {
                LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
-                   "(maximum is %d pairs)", MAX_USB_IDS);
+                       "(maximum is %d pairs)", MAX_USB_IDS);
                argc = MAX_USB_IDS*2;
        }
        if (argc < 2 || (argc & 1))
@@ -2178,5 +2182,3 @@ int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd,
        
        return ERROR_OK;
 }
-
-