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
#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 */
SERIAL_FAST = 1
};
-
static int buspirate_fd = -1;
static int buspirate_pinmode = MODE_JTAG_OD;
static int buspirate_baudrate = SERIAL_NORMAL;
static int buspirate_pullup;
static char *buspirate_port;
-
/* TAP interface */
static void buspirate_tap_init(void);
static int buspirate_tap_execute(void);
static void buspirate_jtag_get_adcs(int);
/* low level HW communication interface */
-static int buspirate_serial_setspeed(int fd, speed_t speed);
+static int buspirate_serial_open(char *port);
+static int buspirate_serial_setspeed(int fd, char speed);
static int buspirate_serial_write(int fd, char *buf, int size);
static int buspirate_serial_read(int fd, char *buf, int size);
static void buspirate_serial_close(int fd);
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 = open(buspirate_port, O_RDWR | O_NOCTTY);
+ 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;
}
- buspirate_serial_setspeed(buspirate_fd, B115200);
+ buspirate_serial_setspeed(buspirate_fd, SERIAL_NORMAL);
buspirate_jtag_enable(buspirate_fd);
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);
/* 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;
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;
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;
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;
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;
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;
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;
},
{
.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",
}
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 */
tap_chain_index++;
} else
- LOG_ERROR("tap_chain overflow, Bad things will happen");
+ LOG_ERROR("tap_chain overflow, bad things will happen");
}
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);
}
}
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)
int ret;
char tmp[2];
char ack[2];
- speed_t baudrate = B115200;
ack[0] = 0xAA;
ack[1] = 0x55;
buspirate_jtag_command(fd, tmp, 2);
/* here the adapter changes speed, we need follow */
- if (speed == SERIAL_FAST)
- baudrate = B1000000;
-
- buspirate_serial_setspeed(fd, baudrate);
+ buspirate_serial_setspeed(fd, 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",
/* low level serial port */
/* TODO add support for WIN32 and others ! */
-static int buspirate_serial_setspeed(int fd, speed_t speed)
+static int buspirate_serial_open(char *port)
+{
+ int fd;
+ fd = open(buspirate_port, O_RDWR | O_NOCTTY | O_NDELAY);
+ return fd;
+}
+
+static int buspirate_serial_setspeed(int fd, char speed)
{
struct termios t_opt;
+ speed_t baud = (speed == SERIAL_FAST) ? B1000000 : B115200;
/* set the serial port parameters */
fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &t_opt);
- cfsetispeed(&t_opt, speed);
- cfsetospeed(&t_opt, speed);
+ cfsetispeed(&t_opt, baud);
+ cfsetospeed(&t_opt, baud);
t_opt.c_cflag |= (CLOCAL | CREAD);
t_opt.c_cflag &= ~PARENB;
t_opt.c_cflag &= ~CSTOPB;
buspirate_print_buffer(buf, len);
if (len != size)
- LOG_ERROR("Error sending data");
+ LOG_ERROR("Error reading data");
return len;
}
}
}
- if (line[0] != 0) {
+ if (line[0] != 0)
LOG_DEBUG("%s", line);
- }
}
-