ftdi: correct ftdi_initialize error text
[fw/openocd] / src / jtag / drivers / buspirate.c
index 13819ba8a29a43b5d16cc99f19eaf9eadc1ff055..86b98823567c3dbbfbeb284accccf0c7b7c03ea8 100644 (file)
@@ -44,8 +44,7 @@ static void buspirate_runtest(int num_cycles);
 static void buspirate_scan(bool ir_scan, enum scan_type type,
        uint8_t *buffer, int scan_size, struct scan_command *command);
 
-
-#define CMD_UNKOWN        0x00
+#define CMD_UNKNOWN       0x00
 #define CMD_PORT_MODE     0x01
 #define CMD_FEATURE       0x02
 #define CMD_READ_ADCS     0x03
@@ -55,6 +54,11 @@ static void buspirate_scan(bool ir_scan, enum scan_type type,
 #define CMD_UART_SPEED    0x07
 #define CMD_JTAG_SPEED    0x08
 
+/* Not all OSes have this speed defined */
+#if !defined(B1000000)
+#define  B1000000 0010010
+#endif
+
 enum {
        MODE_HIZ = 0,
        MODE_JTAG = 1,          /* push-pull outputs */
@@ -79,7 +83,6 @@ enum {
        SERIAL_FAST = 1
 };
 
-
 static int buspirate_fd = -1;
 static int buspirate_pinmode = MODE_JTAG_OD;
 static int buspirate_baudrate = SERIAL_NORMAL;
@@ -87,7 +90,6 @@ static int buspirate_vreg;
 static int buspirate_pullup;
 static char *buspirate_port;
 
-
 /* TAP interface */
 static void buspirate_tap_init(void);
 static int buspirate_tap_execute(void);
@@ -212,13 +214,13 @@ static int buspirate_execute_queue(void)
 static int buspirate_init(void)
 {
        if (buspirate_port == NULL) {
-               LOG_ERROR("You need to specify port !");
+               LOG_ERROR("You need to specify the serial port!");
                return ERROR_JTAG_INIT_FAILED;
        }
 
        buspirate_fd = buspirate_serial_open(buspirate_port);
        if (buspirate_fd == -1) {
-               LOG_ERROR("Could not open serial port.");
+               LOG_ERROR("Could not open serial port");
                return ERROR_JTAG_INIT_FAILED;
        }
 
@@ -244,7 +246,7 @@ static int buspirate_init(void)
 
 static int buspirate_quit(void)
 {
-       LOG_INFO("Shuting down buspirate ");
+       LOG_INFO("Shutting down buspirate.");
        buspirate_jtag_set_mode(buspirate_fd, MODE_HIZ);
 
        buspirate_jtag_set_speed(buspirate_fd, SERIAL_NORMAL);
@@ -262,11 +264,6 @@ static int buspirate_quit(void)
 /* openocd command interface */
 COMMAND_HANDLER(buspirate_handle_adc_command)
 {
-       if (CMD_ARGC != 0) {
-               LOG_ERROR("usage: buspirate_adc");
-               return ERROR_OK;
-       }
-
        if (buspirate_fd == -1)
                return ERROR_OK;
 
@@ -279,15 +276,15 @@ COMMAND_HANDLER(buspirate_handle_adc_command)
 
 COMMAND_HANDLER(buspirate_handle_vreg_command)
 {
-       if (CMD_ARGC != 1) {
-               LOG_ERROR("usage: buspirate_vreg <1|0>");
-               return ERROR_OK;
-       }
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (atoi(CMD_ARGV[0]) == 1)
                buspirate_vreg = 1;
-       else
+       else if (atoi(CMD_ARGV[0]) == 0)
                buspirate_vreg = 0;
+       else
+               LOG_ERROR("usage: buspirate_vreg <1|0>");
 
        return ERROR_OK;
 
@@ -295,15 +292,15 @@ COMMAND_HANDLER(buspirate_handle_vreg_command)
 
 COMMAND_HANDLER(buspirate_handle_pullup_command)
 {
-       if (CMD_ARGC != 1) {
-               LOG_ERROR("usage: buspirate_pullup <1|0>");
-               return ERROR_OK;
-       }
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (atoi(CMD_ARGV[0]) == 1)
                buspirate_pullup = 1;
-       else
+       else if (atoi(CMD_ARGV[0]) == 0)
                buspirate_pullup = 0;
+       else
+               LOG_ERROR("usage: buspirate_pullup <1|0>");
 
        return ERROR_OK;
 
@@ -311,19 +308,19 @@ COMMAND_HANDLER(buspirate_handle_pullup_command)
 
 COMMAND_HANDLER(buspirate_handle_led_command)
 {
-       if (CMD_ARGC != 1) {
-               LOG_ERROR("usage: buspirate_led <1|0>");
-               return ERROR_OK;
-       }
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (atoi(CMD_ARGV[0]) == 1) {
                /* enable led */
                buspirate_jtag_set_feature(buspirate_fd, FEATURE_LED,
                                ACTION_ENABLE);
-       } else {
+       } else if (atoi(CMD_ARGV[0]) == 0) {
                /* disable led */
                buspirate_jtag_set_feature(buspirate_fd, FEATURE_LED,
                                ACTION_DISABLE);
+       } else {
+               LOG_ERROR("usage: buspirate_led <1|0>");
        }
 
        return ERROR_OK;
@@ -332,10 +329,8 @@ COMMAND_HANDLER(buspirate_handle_led_command)
 
 COMMAND_HANDLER(buspirate_handle_mode_command)
 {
-       if (CMD_ARGC != 1) {
-               LOG_ERROR("usage: buspirate_mode <normal|open-drain>");
-               return ERROR_OK;
-       }
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (CMD_ARGV[0][0] == 'n')
                buspirate_pinmode = MODE_JTAG;
@@ -350,10 +345,8 @@ COMMAND_HANDLER(buspirate_handle_mode_command)
 
 COMMAND_HANDLER(buspirate_handle_speed_command)
 {
-       if (CMD_ARGC != 1) {
-               LOG_ERROR("usage: buspirate_speed <normal|fast>");
-               return ERROR_OK;
-       }
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (CMD_ARGV[0][0] == 'n')
                buspirate_baudrate = SERIAL_NORMAL;
@@ -368,12 +361,10 @@ COMMAND_HANDLER(buspirate_handle_speed_command)
 
 COMMAND_HANDLER(buspirate_handle_port_command)
 {
-       if (CMD_ARGC != 1) {
-               LOG_ERROR("usage: buspirate_port /dev/ttyUSB0");
-               return ERROR_OK;
-       }
+       if (CMD_ARGC < 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
-       if (buspirate_port == 0)
+       if (buspirate_port == NULL)
                buspirate_port = strdup(CMD_ARGV[0]);
 
        return ERROR_OK;
@@ -389,36 +380,42 @@ static const struct command_registration buspirate_command_handlers[] = {
        },
        {
                .name = "buspirate_vreg",
+               .usage = "<1|0>",
                .handler = &buspirate_handle_vreg_command,
                .mode = COMMAND_CONFIG,
                .help = "changes the state of voltage regulators",
        },
        {
                .name = "buspirate_pullup",
+               .usage = "<1|0>",
                .handler = &buspirate_handle_pullup_command,
                .mode = COMMAND_CONFIG,
                .help = "changes the state of pullup",
        },
        {
                .name = "buspirate_led",
+               .usage = "<1|0>",
                .handler = &buspirate_handle_led_command,
                .mode = COMMAND_EXEC,
                .help = "changes the state of led",
        },
        {
                .name = "buspirate_speed",
+               .usage = "<normal|fast>",
                .handler = &buspirate_handle_speed_command,
                .mode = COMMAND_CONFIG,
                .help = "speed of the interface",
        },
        {
                .name = "buspirate_mode",
+               .usage = "<normal|open-drain>",
                .handler = &buspirate_handle_mode_command,
                .mode = COMMAND_CONFIG,
                .help = "pin mode of the interface",
        },
        {
                .name = "buspirate_port",
+               .usage = "/dev/ttyUSB0",
                .handler = &buspirate_handle_port_command,
                .mode = COMMAND_CONFIG,
                .help = "name of the serial port to open",
@@ -602,6 +599,10 @@ static int buspirate_tap_execute(void)
        }
 
        ret = buspirate_serial_read(buspirate_fd, tmp, bytes_to_send + 3);
+       if (ret != bytes_to_send + 3) {
+               LOG_ERROR("error reading");
+               return ERROR_FAIL;
+       }
        in_buf = (uint8_t *)(&tmp[3]);
 
        /* parse the scans */
@@ -659,7 +660,7 @@ static void buspirate_tap_append(int tms, int tdi)
 
                tap_chain_index++;
        } else
-               LOG_ERROR("tap_chain overflow, Bad things will happen");
+               LOG_ERROR("tap_chain overflow, bad things will happen");
 
 }
 
@@ -718,32 +719,35 @@ static void buspirate_jtag_enable(int fd)
        while (!done) {
                ret = buspirate_serial_read(fd, tmp, 4);
                if (ret != 4) {
-                       LOG_ERROR("Buspirate did not respond :"
-                               "( restart everything");
+                       LOG_ERROR("Buspirate error. Is binary"
+                               "/OpenOCD support enabled?");
                        exit(-1);
                }
-               LOG_DEBUG("TUI");
                if (strncmp(tmp, "BBIO", 4) == 0) {
                        ret = buspirate_serial_read(fd, tmp, 1);
                        if (ret != 1) {
-                               LOG_ERROR("Buspirate did not respond well :"
-                                       "( restart everything");
+                               LOG_ERROR("Buspirate did not answer correctly! "
+                                       "Do you have correct firmware?");
                                exit(-1);
                        }
                        if (tmp[0] != '1') {
-                               LOG_ERROR("Unsupported binary protocol ");
+                               LOG_ERROR("Unsupported binary protocol");
                                exit(-1);
                        }
                        if (cmd_sent == 0) {
                                cmd_sent = 1;
                                tmp[0] = CMD_ENTER_OOCD;
                                ret = buspirate_serial_write(fd, tmp, 1);
+                               if (ret != 1) {
+                                       LOG_ERROR("error reading");
+                                       exit(-1);
+                               }
                        }
                } else if (strncmp(tmp, "OCD1", 4) == 0)
                        done = 1;
                else {
-                       LOG_ERROR("Buspirate did not respond :"
-                               "( restart everything");
+                       LOG_ERROR("Buspirate did not answer correctly! "
+                               "Do you have correct firmware?");
                        exit(-1);
                }
        }
@@ -752,18 +756,18 @@ static void buspirate_jtag_enable(int fd)
 
 static void buspirate_jtag_reset(int fd)
 {
-       int ret;
        char tmp[5];
 
        tmp[0] = 0x00; /* exit OCD1 mode */
        buspirate_serial_write(fd, tmp, 1);
        usleep(10000);
-       ret = buspirate_serial_read(fd, tmp, 5);
+       /* We ignore the return value here purposly, nothing we can do */
+       buspirate_serial_read(fd, tmp, 5);
        if (strncmp(tmp, "BBIO1", 5) == 0) {
                tmp[0] = 0x0F; /*  reset BP */
                buspirate_serial_write(fd, tmp, 1);
        } else
-               LOG_ERROR("Bad reply :( Please restart manually");
+               LOG_ERROR("Unable to restart buspirate!");
 }
 
 static void buspirate_jtag_set_speed(int fd, char speed)
@@ -785,13 +789,11 @@ static void buspirate_jtag_set_speed(int fd, char speed)
        buspirate_serial_write(fd, ack, 2);
        ret = buspirate_serial_read(fd, tmp, 2);
        if (ret != 2) {
-               LOG_ERROR("Buspirate did not respond :"
-                       "( restart everything");
+               LOG_ERROR("Buspirate did not ack speed change");
                exit(-1);
        }
        if ((tmp[0] != CMD_UART_SPEED) || (tmp[1] != speed)) {
-               LOG_ERROR("Buspirate didn't reply as expected :"
-                       "( restart everything");
+               LOG_ERROR("Buspirate did not reply as expected");
                exit(-1);
        }
        LOG_INFO("Buspirate switched to %s mode",
@@ -945,7 +947,7 @@ static int buspirate_serial_read(int fd, char *buf, int size)
        buspirate_print_buffer(buf, len);
 
        if (len != size)
-               LOG_ERROR("Error sending data");
+               LOG_ERROR("Error reading data");
 
        return len;
 }
@@ -976,8 +978,6 @@ static void buspirate_print_buffer(char *buf, int size)
                }
        }
 
-       if (line[0] != 0) {
+       if (line[0] != 0)
                LOG_DEBUG("%s", line);
-       }
 }
-