X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fjtag_vpi.c;h=35c70312d6d507b13e352dbbd54d1526f59580f5;hp=d962ecfc7bf770aa1c1d2fc65722ec14f450b854;hb=eb8dfd5ca8af6f2d784f6b1d30c96b40c52ae0ce;hpb=1211b8ea481b9185b04563a741ac0c41da274bc9
diff --git a/src/jtag/drivers/jtag_vpi.c b/src/jtag/drivers/jtag_vpi.c
index d962ecfc7b..35c70312d6 100644
--- a/src/jtag/drivers/jtag_vpi.c
+++ b/src/jtag/drivers/jtag_vpi.c
@@ -16,6 +16,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
@@ -23,7 +25,13 @@
#endif
#include
+#ifdef HAVE_ARPA_INET_H
#include
+#endif
+
+#ifndef _WIN32
+#include
+#endif
#define NO_TAP_SHIFT 0
#define TAP_SHIFT 1
@@ -40,6 +48,7 @@
#define CMD_STOP_SIMU 4
int server_port = SERVER_PORT;
+char *server_address;
int sockfd;
struct sockaddr_in serv_addr;
@@ -54,7 +63,7 @@ struct vpi_cmd {
static int jtag_vpi_send_cmd(struct vpi_cmd *vpi)
{
- int retval = write(sockfd, vpi, sizeof(struct vpi_cmd));
+ int retval = write_socket(sockfd, vpi, sizeof(struct vpi_cmd));
if (retval <= 0)
return ERROR_FAIL;
@@ -63,7 +72,7 @@ static int jtag_vpi_send_cmd(struct vpi_cmd *vpi)
static int jtag_vpi_receive_cmd(struct vpi_cmd *vpi)
{
- int retval = read(sockfd, vpi, sizeof(struct vpi_cmd));
+ int retval = read_socket(sockfd, vpi, sizeof(struct vpi_cmd));
if (retval < (int)sizeof(struct vpi_cmd))
return ERROR_FAIL;
@@ -199,23 +208,20 @@ static int jtag_vpi_queue_tdi_xfer(uint8_t *bits, int nb_bits, int tap_shift)
static int jtag_vpi_queue_tdi(uint8_t *bits, int nb_bits, int tap_shift)
{
int nb_xfer = DIV_ROUND_UP(nb_bits, XFERT_MAX_SIZE * 8);
- uint8_t *xmit_buffer = bits;
- int xmit_nb_bits = nb_bits;
- int i = 0;
int retval;
while (nb_xfer) {
-
if (nb_xfer == 1) {
- retval = jtag_vpi_queue_tdi_xfer(&xmit_buffer[i], xmit_nb_bits, tap_shift);
+ retval = jtag_vpi_queue_tdi_xfer(bits, nb_bits, tap_shift);
if (retval != ERROR_OK)
return retval;
} else {
- retval = jtag_vpi_queue_tdi_xfer(&xmit_buffer[i], XFERT_MAX_SIZE * 8, NO_TAP_SHIFT);
+ retval = jtag_vpi_queue_tdi_xfer(bits, XFERT_MAX_SIZE * 8, NO_TAP_SHIFT);
if (retval != ERROR_OK)
return retval;
- xmit_nb_bits -= XFERT_MAX_SIZE * 8;
- i += XFERT_MAX_SIZE;
+ nb_bits -= XFERT_MAX_SIZE * 8;
+ if (bits)
+ bits += XFERT_MAX_SIZE;
}
nb_xfer--;
@@ -366,6 +372,8 @@ static int jtag_vpi_execute_queue(void)
static int jtag_vpi_init(void)
{
+ int flag = 1;
+
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
LOG_ERROR("Could not create socket");
@@ -377,24 +385,37 @@ static int jtag_vpi_init(void)
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(server_port);
- if (inet_pton(AF_INET, SERVER_ADDRESS, &serv_addr.sin_addr) <= 0) {
- LOG_ERROR("inet_pton error occured");
+ if (!server_address)
+ server_address = strdup(SERVER_ADDRESS);
+
+ serv_addr.sin_addr.s_addr = inet_addr(server_address);
+
+ if (serv_addr.sin_addr.s_addr == INADDR_NONE) {
+ LOG_ERROR("inet_addr error occured");
return ERROR_FAIL;
}
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
close(sockfd);
- LOG_ERROR("Can't connect to %s : %u", SERVER_ADDRESS, server_port);
+ LOG_ERROR("Can't connect to %s : %u", server_address, server_port);
return ERROR_COMMAND_CLOSE_CONNECTION;
}
- LOG_INFO("Connection to %s : %u succeed", SERVER_ADDRESS, server_port);
+ if (serv_addr.sin_addr.s_addr == htonl(INADDR_LOOPBACK)) {
+ /* This increases performance drematically for local
+ * connections, which is the most likely arrangement
+ * for a VPI connection. */
+ setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));
+ }
+
+ LOG_INFO("Connection to %s : %u succeed", server_address, server_port);
return ERROR_OK;
}
static int jtag_vpi_quit(void)
{
+ free(server_address);
return close(sockfd);
}
@@ -410,6 +431,20 @@ COMMAND_HANDLER(jtag_vpi_set_port)
return ERROR_OK;
}
+COMMAND_HANDLER(jtag_vpi_set_address)
+{
+ free(server_address);
+
+ if (CMD_ARGC == 0) {
+ LOG_WARNING("You need to set an address");
+ server_address = strdup(SERVER_ADDRESS);
+ } else
+ server_address = strdup(CMD_ARGV[0]);
+
+ LOG_INFO("Set server address to %s", server_address);
+
+ return ERROR_OK;
+}
static const struct command_registration jtag_vpi_command_handlers[] = {
{
@@ -419,6 +454,13 @@ static const struct command_registration jtag_vpi_command_handlers[] = {
.help = "set the port of the VPI server",
.usage = "description_string",
},
+ {
+ .name = "jtag_vpi_set_address",
+ .handler = &jtag_vpi_set_address,
+ .mode = COMMAND_CONFIG,
+ .help = "set the address of the VPI server",
+ .usage = "description_string",
+ },
COMMAND_REGISTRATION_DONE
};