X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fbuspirate.c;h=ad9be41e2c6eb45e29ec7aadf1e5a4c504457a22;hp=13819ba8a29a43b5d16cc99f19eaf9eadc1ff055;hb=1d1f1b95a7516af3ce845c79af73511c82035528;hpb=1ceb2c7e7ac1014d25d1544b44f59404e636ef5c diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c index 13819ba8a2..ad9be41e2c 100644 --- a/src/jtag/drivers/buspirate.c +++ b/src/jtag/drivers/buspirate.c @@ -32,8 +32,6 @@ #undef DEBUG_SERIAL /*#define DEBUG_SERIAL */ static int buspirate_execute_queue(void); -static int buspirate_speed(int speed); -static int buspirate_khz(int khz, int *jtag_speed); static int buspirate_init(void); static int buspirate_quit(void); @@ -44,8 +42,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 +52,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 +81,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 +88,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); @@ -115,19 +115,6 @@ static int buspirate_serial_read(int fd, char *buf, int size); static void buspirate_serial_close(int fd); static void buspirate_print_buffer(char *buf, int size); -static int buspirate_speed(int speed) -{ - /* TODO */ - LOG_INFO("Want to set speed to %dkHz, but not implemented yet", speed); - return ERROR_OK; -} - -static int buspirate_khz(int khz, int *jtag_speed) -{ - *jtag_speed = khz; - return ERROR_OK; -} - static int buspirate_execute_queue(void) { /* currently processed command */ @@ -212,13 +199,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 +231,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 +249,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 +261,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 +277,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 +293,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 +314,8 @@ COMMAND_HANDLER(buspirate_handle_led_command) COMMAND_HANDLER(buspirate_handle_mode_command) { - if (CMD_ARGC != 1) { - LOG_ERROR("usage: buspirate_mode "); - return ERROR_OK; - } + if (CMD_ARGC < 1) + return ERROR_COMMAND_SYNTAX_ERROR; if (CMD_ARGV[0][0] == 'n') buspirate_pinmode = MODE_JTAG; @@ -350,10 +330,8 @@ COMMAND_HANDLER(buspirate_handle_mode_command) COMMAND_HANDLER(buspirate_handle_speed_command) { - if (CMD_ARGC != 1) { - LOG_ERROR("usage: buspirate_speed "); - return ERROR_OK; - } + if (CMD_ARGC < 1) + return ERROR_COMMAND_SYNTAX_ERROR; if (CMD_ARGV[0][0] == 'n') buspirate_baudrate = SERIAL_NORMAL; @@ -368,12 +346,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 +365,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 = "", .handler = &buspirate_handle_speed_command, .mode = COMMAND_CONFIG, .help = "speed of the interface", }, { .name = "buspirate_mode", + .usage = "", .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", @@ -429,8 +411,6 @@ static const struct command_registration buspirate_command_handlers[] = { struct jtag_interface buspirate_interface = { .name = "buspirate", .execute_queue = buspirate_execute_queue, - .speed = buspirate_speed, - .khz = buspirate_khz, .commands = buspirate_command_handlers, .init = buspirate_init, .quit = buspirate_quit @@ -523,7 +503,10 @@ static void buspirate_scan(bool ir_scan, enum scan_type type, saved_end_state = tap_get_end_state(); buspirate_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT); - buspirate_state_move(); + + /* Only move if we're not already there */ + if (tap_get_state() != tap_get_end_state()) + buspirate_state_move(); buspirate_tap_append_scan(scan_size, buffer, command); @@ -602,6 +585,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 +646,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 +705,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 +742,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 +775,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 +933,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 +964,6 @@ static void buspirate_print_buffer(char *buf, int size) } } - if (line[0] != 0) { + if (line[0] != 0) LOG_DEBUG("%s", line); - } } -