10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include "sim_vhpi_c.h"
14 /* XXX Make that some parameter */
15 #define TCP_PORT 13245
21 static void open_socket(void)
23 struct sockaddr_in addr
;
26 if (fd
>= 0 || fd
< -1)
29 signal(SIGPIPE
, SIG_IGN
);
30 fd
= socket(AF_INET
, SOCK_STREAM
, 0);
32 fprintf(stderr
, "Failed to open debug socket !\r\n");
37 flags
= fcntl(fd
, F_GETFL
);
39 rc
= fcntl(fd
, F_SETFL
, flags
| O_NONBLOCK
);
40 if (flags
< 0 || rc
< 0) {
41 fprintf(stderr
, "Failed to configure debug socket !\r\n");
44 memset(&addr
, 0, sizeof(addr
));
45 addr
.sin_family
= AF_INET
;
46 addr
.sin_port
= htons(TCP_PORT
);
47 addr
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
49 setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
));
50 rc
= bind(fd
, (struct sockaddr
*)&addr
, sizeof(addr
));
52 fprintf(stderr
, "Failed to bind debug socket !\r\n");
57 fprintf(stderr
, "Failed to listen to debug socket !\r\n");
60 fprintf(stdout
, "Debug socket ready\r\n");
68 static void check_connection(void)
70 struct sockaddr_in addr
;
71 socklen_t addr_len
= sizeof(addr
);
73 cfd
= accept(fd
, (struct sockaddr
*)&addr
, &addr_len
);
76 fprintf(stdout
, "Debug client connected !\r\n");
79 void sim_jtag_read_msg(unsigned char *out_msg
, unsigned char *out_size
)
81 unsigned char data
[MAX_PACKET
];
82 unsigned char size
= 0;
83 struct pollfd fdset
[1];
95 memset(fdset
, 0, sizeof(fdset
));
97 fdset
[0].events
= POLLIN
;
98 rc
= poll(fdset
, 1, 0);
101 rc
= read(cfd
, data
, MAX_PACKET
);
103 fprintf(stderr
, "Debug read error, assuming client disconnected !\r\n");
105 fprintf(stdout
, "Debug client disconnected !\r\n");
113 fprintf(stderr
, "Got message:\n\r");
116 fprintf(stderr
, "%02x ", data
[i
]);
117 fprintf(stderr
, "\n\r");
120 size
= data
[0]; /* Size in bits */
124 /* JTAG reset, message to translate */
128 if (((rc
- 1) * 8) < size
) {
129 fprintf(stderr
, "Debug short read: %d bytes for %d bits, truncating\r\n",
134 for (i
= 0; i
< size
; i
++) {
136 int bit
= 1 << (i
& 7);
137 out_msg
[i
] = (data
[byte
+1] & bit
) ? vhpi1
: vhpi0
;
140 to_std_logic_vector(size
, out_size
, 8);
143 void sim_jtag_write_msg(unsigned char *in_msg
, unsigned char *in_size
)
145 unsigned char data
[MAX_PACKET
];
149 size
= from_std_logic_vector(in_size
, 8);
151 for (i
= 0; i
< size
; i
++) {
153 int bit
= 1 << (i
& 7);
154 if (in_msg
[i
] == vhpi1
)
157 data
[byte
+1] &= ~bit
;
162 fprintf(stderr
, "Sending response:\n\r");
165 fprintf(stderr
, "%02x ", data
[i
]);
166 fprintf(stderr
, "\n\r");
170 rc
= write(cfd
, data
, rc
);
172 fprintf(stderr
, "Debug write error, ignoring\r\n");