X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fjtag%2Fdrivers%2Fbuspirate.c;h=34dcd2b52e5679b59f3ea22fd9b9b06a9f0e9110;hb=refs%2Fchanges%2F26%2F1426%2F4;hp=836a4d18a9bf9fa0f16d0309aedb4c66907401a6;hpb=405b7a458d516f1f5c6dad860a31189e1007a6b6;p=openocd.git diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c index 836a4d18a9..34dcd2b52e 100644 --- a/src/jtag/drivers/buspirate.c +++ b/src/jtag/drivers/buspirate.c @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -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); @@ -274,10 +261,8 @@ 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; @@ -292,10 +277,8 @@ 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; @@ -310,10 +293,8 @@ 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 */ @@ -333,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; @@ -351,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; @@ -369,10 +346,8 @@ 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 == NULL) buspirate_port = strdup(CMD_ARGV[0]); @@ -390,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", @@ -430,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 @@ -524,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); @@ -603,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 */ @@ -660,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"); } @@ -719,30 +705,34 @@ static void buspirate_jtag_enable(int fd) while (!done) { ret = buspirate_serial_read(fd, tmp, 4); if (ret != 4) { - LOG_ERROR("Buspirate error. Is is binary/" + LOG_ERROR("Buspirate error. Is binary" "/OpenOCD support enabled?"); exit(-1); } if (strncmp(tmp, "BBIO", 4) == 0) { ret = buspirate_serial_read(fd, tmp, 1); if (ret != 1) { - LOG_ERROR("Buspirate did not correctly! " + 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 correctly! " + LOG_ERROR("Buspirate did not answer correctly! " "Do you have correct firmware?"); exit(-1); } @@ -752,13 +742,13 @@ 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); @@ -789,7 +779,7 @@ static void buspirate_jtag_set_speed(int fd, char speed) exit(-1); } if ((tmp[0] != CMD_UART_SPEED) || (tmp[1] != speed)) { - LOG_ERROR("Buspirate didn't reply as expected"); + LOG_ERROR("Buspirate did not reply as expected"); exit(-1); } LOG_INFO("Buspirate switched to %s mode", @@ -974,8 +964,6 @@ static void buspirate_print_buffer(char *buf, int size) } } - if (line[0] != 0) { + if (line[0] != 0) LOG_DEBUG("%s", line); - } } -