This is an automated email from Gerrit.

Stephen Tridgell (stephen.tridg...@exablaze.com) just uploaded a new patch set 
to Gerrit, which you can find at http://openocd.zylin.com/2556

-- gerrit

commit 0cd5b5ed62589a5406e88ee05844c6b67cb09e6e
Author: Stephen Tridgell <stephen.tridg...@exablaze.com>
Date:   Wed Feb 25 19:18:27 2015 +1100

    Added a method to read the signal values from ftdi
    
    Change-Id: Ie32a372bbc57249b4802d900234a0e8e7d1d1830
    Signed-off-by: Stephen Tridgell <stephen.tridg...@exablaze.com>

diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c
index 7df6389..22b01c7 100644
--- a/src/jtag/drivers/ftdi.c
+++ b/src/jtag/drivers/ftdi.c
@@ -90,6 +90,7 @@
 
 static char *ftdi_device_desc;
 static char *ftdi_serial;
+static char *ftdi_device_path;
 static uint8_t ftdi_channel;
 
 static bool swd_mode;
@@ -210,6 +211,26 @@ static int ftdi_set_signal(const struct signal *s, char 
value)
        return ERROR_OK;
 }
 
+static int ftdi_get_signal(const struct signal *s, uint16_t * value_out)
+{
+       uint8_t data_low = 0;
+       uint8_t data_high = 0;
+
+       if (s->data_mask == 0 && s->oe_mask == 0) {
+               LOG_ERROR("interface doesn't provide signal '%s'", s->name);
+               return ERROR_FAIL;
+       }
+
+       if (s->data_mask & 0xff)
+               mpsse_read_data_bits_low_byte(mpsse_ctx, &data_low);
+       if (s->data_mask >> 8)
+               mpsse_read_data_bits_high_byte(mpsse_ctx, &data_high);
+
+       *value_out = (((uint16_t)data_high) << 8) | data_low;
+       *value_out &= s->data_mask;
+
+       return ERROR_OK;
+}
 
 /**
  * Function move_to_state
@@ -626,7 +647,7 @@ static int ftdi_initialize(void)
 
        for (int i = 0; ftdi_vid[i] || ftdi_pid[i]; i++) {
                mpsse_ctx = mpsse_open(&ftdi_vid[i], &ftdi_pid[i], 
ftdi_device_desc,
-                               ftdi_serial, ftdi_channel);
+                               ftdi_serial, ftdi_device_path, ftdi_channel);
                if (mpsse_ctx)
                        break;
        }
@@ -678,6 +699,19 @@ COMMAND_HANDLER(ftdi_handle_device_desc_command)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(ftdi_handle_device_path_command)
+{
+       if (CMD_ARGC == 1) {
+               if (ftdi_device_path)
+                       free(ftdi_device_path);
+               ftdi_device_path = strdup(CMD_ARGV[0]);
+       } else {
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+
+       return ERROR_OK;
+}
+
 COMMAND_HANDLER(ftdi_handle_serial_command)
 {
        if (CMD_ARGC == 1) {
@@ -800,6 +834,26 @@ COMMAND_HANDLER(ftdi_handle_set_signal_command)
        return mpsse_flush(mpsse_ctx);
 }
 
+COMMAND_HANDLER(ftdi_handle_get_signal_command)
+{
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       struct signal *sig;
+       uint16_t sig_data = 0;
+       sig = find_signal_by_name(CMD_ARGV[0]);
+       if (!sig) {
+               LOG_ERROR("interface configuration doesn't define signal '%s'", 
CMD_ARGV[0]);
+               return ERROR_FAIL;
+       }
+
+       ftdi_get_signal(sig, &sig_data);
+
+       LOG_USER("Signal %s = %#06x", sig->name, sig_data);
+
+       return mpsse_flush(mpsse_ctx);
+}
+
 COMMAND_HANDLER(ftdi_handle_vid_pid_command)
 {
        if (CMD_ARGC > MAX_USB_IDS * 2) {
@@ -876,6 +930,20 @@ static const struct command_registration 
ftdi_command_handlers[] = {
                .usage = "name (1|0|z)",
        },
        {
+               .name = "ftdi_get_signal",
+               .handler = &ftdi_handle_get_signal_command,
+               .mode = COMMAND_EXEC,
+               .help = "read the value of a layout-specific signal",
+               .usage = "name",
+       },
+       {
+               .name = "ftdi_device_path",
+               .handler = &ftdi_handle_device_path_command,
+               .mode = COMMAND_CONFIG,
+               .help = "set the device path of the FTDI device",
+               .usage = "device_path_string",
+       },
+       {
                .name = "ftdi_vid_pid",
                .handler = &ftdi_handle_vid_pid_command,
                .mode = COMMAND_CONFIG,

-- 

------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to