buspirate: change handling of communication speed setting + create serial port open...
[openocd.git] / src / jtag / drivers / buspirate.c
index 99210d26f03db4476fa59f54f788edfc06e81748..13819ba8a29a43b5d16cc99f19eaf9eadc1ff055 100644 (file)
@@ -108,9 +108,11 @@ static void buspirate_jtag_set_feature(int, char, char);
 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 void buspirate_print_buffer(char *buf, int size);
 
 static int buspirate_speed(int speed)
@@ -146,7 +148,7 @@ static int buspirate_execute_queue(void)
                        buspirate_runtest(cmd->cmd.runtest
                                        ->num_cycles);
                        break;
-               case JTAG_STATEMOVE:
+               case JTAG_TLR_RESET:
                        DEBUG_JTAG_IO("statemove end in %s",
                                tap_state_name(cmd->cmd.statemove
                                                ->end_state));
@@ -214,13 +216,13 @@ static int buspirate_init(void)
                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.");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       buspirate_serial_setspeed(buspirate_fd, B115200);
+       buspirate_serial_setspeed(buspirate_fd, SERIAL_NORMAL);
 
        buspirate_jtag_enable(buspirate_fd);
 
@@ -247,6 +249,9 @@ static int buspirate_quit(void)
 
        buspirate_jtag_set_speed(buspirate_fd, SERIAL_NORMAL);
        buspirate_jtag_reset(buspirate_fd);
+
+       buspirate_serial_close(buspirate_fd);
+
        if (buspirate_port) {
                free(buspirate_port);
                buspirate_port = NULL;
@@ -633,24 +638,24 @@ static void buspirate_tap_make_space(int scans, int bits)
 
 static void buspirate_tap_append(int tms, int tdi)
 {
-       int index;
+       int chain_index;
 
        buspirate_tap_make_space(0, 1);
-       index = tap_chain_index / 8;
+       chain_index = tap_chain_index / 8;
 
-       if (index < BUSPIRATE_BUFFER_SIZE) {
+       if (chain_index < BUSPIRATE_BUFFER_SIZE) {
                int bit_index = tap_chain_index % 8;
                uint8_t bit = 1 << bit_index;
 
                if (tms)
-                       tms_chain[index] |= bit;
+                       tms_chain[chain_index] |= bit;
                else
-                       tms_chain[index] &= ~bit;
+                       tms_chain[chain_index] &= ~bit;
 
                if (tdi)
-                       tdi_chain[index] |= bit;
+                       tdi_chain[chain_index] |= bit;
                else
-                       tdi_chain[index] &= ~bit;
+                       tdi_chain[chain_index] &= ~bit;
 
                tap_chain_index++;
        } else
@@ -766,7 +771,6 @@ 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;
@@ -776,10 +780,7 @@ static void buspirate_jtag_set_speed(int fd, char speed)
        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);
@@ -832,13 +833,13 @@ static void buspirate_jtag_get_adcs(int fd)
                ((float)c)/155.1515, ((float)d)/155.1515);
 }
 
-static unsigned char buspirate_jtag_command(int buspirate_fd,
+static unsigned char buspirate_jtag_command(int fd,
                char *cmd, int cmdlen)
 {
        int res;
        int len = 0;
 
-       res = buspirate_serial_write(buspirate_fd, cmd, cmdlen);
+       res = buspirate_serial_write(fd, cmd, cmdlen);
 
        if ((cmd[0] == CMD_UART_SPEED)
                                || (cmd[0] == CMD_PORT_MODE)
@@ -857,7 +858,7 @@ static unsigned char buspirate_jtag_command(int buspirate_fd,
                default:
                        LOG_INFO("Wrong !");
                }
-               res =  buspirate_serial_read(buspirate_fd, cmd, len);
+               res =  buspirate_serial_read(fd, cmd, len);
                if (res > 0)
                        return (unsigned char)cmd[1];
                else
@@ -869,15 +870,23 @@ static unsigned char buspirate_jtag_command(int buspirate_fd,
 
 /* 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(buspirate_fd, F_SETFL, 0);
-       tcgetattr(buspirate_fd, &t_opt);
-       cfsetispeed(&t_opt, speed);
-       cfsetospeed(&t_opt, speed);
+       fcntl(fd, F_SETFL, 0);
+       tcgetattr(fd, &t_opt);
+       cfsetispeed(&t_opt, baud);
+       cfsetospeed(&t_opt, baud);
        t_opt.c_cflag |= (CLOCAL | CREAD);
        t_opt.c_cflag &= ~PARENB;
        t_opt.c_cflag &= ~CSTOPB;
@@ -888,8 +897,8 @@ static int buspirate_serial_setspeed(int fd, speed_t speed)
        t_opt.c_oflag &= ~OPOST;
        t_opt.c_cc[VMIN] = 0;
        t_opt.c_cc[VTIME] = 10;
-       tcflush(buspirate_fd, TCIFLUSH);
-       tcsetattr(buspirate_fd, TCSANOW, &t_opt);
+       tcflush(fd, TCIFLUSH);
+       tcsetattr(fd, TCSANOW, &t_opt);
 
        return 0;
 }
@@ -941,6 +950,11 @@ static int buspirate_serial_read(int fd, char *buf, int size)
        return len;
 }
 
+static void buspirate_serial_close(int fd)
+{
+       close(fd);
+}
+
 #define LINE_SIZE      81
 #define BYTES_PER_LINE 16
 static void buspirate_print_buffer(char *buf, int size)

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)