10 #include <sys/socket.h>
11 #include <netinet/in.h>
13 /* XXX Make that some parameter */
14 #define TCP_PORT 13245
17 #define vhpi0 2 /* forcing 0 */
18 #define vhpi1 3 /* forcing 1 */
20 static void to_std_logic_vector(unsigned long val
, unsigned char *p
,
24 fprintf(stderr
, "%s: invalid length %lu\n", __func__
, len
);
28 for (unsigned long i
= 0; i
< len
; i
++) {
29 if ((val
>> (len
-1-i
) & 1))
38 static uint64_t from_std_logic_vector(unsigned char *p
, unsigned long len
)
40 unsigned long ret
= 0;
43 fprintf(stderr
, "%s: invalid length %lu\n", __func__
, len
);
47 for (unsigned long i
= 0; i
< len
; i
++) {
52 } else if (*p
== vhpi1
) {
55 fprintf(stderr
, "%s: bad bit %d\n", __func__
, *p
);
59 ret
= (ret
<< 1) | bit
;
69 static void open_socket(void)
71 struct sockaddr_in addr
;
74 if (fd
>= 0 || fd
< -1)
77 signal(SIGPIPE
, SIG_IGN
);
78 fd
= socket(AF_INET
, SOCK_STREAM
, 0);
80 fprintf(stderr
, "Failed to open debug socket !\r\n");
85 flags
= fcntl(fd
, F_GETFL
);
87 rc
= fcntl(fd
, F_SETFL
, flags
| O_NONBLOCK
);
88 if (flags
< 0 || rc
< 0) {
89 fprintf(stderr
, "Failed to configure debug socket !\r\n");
92 memset(&addr
, 0, sizeof(addr
));
93 addr
.sin_family
= AF_INET
;
94 addr
.sin_port
= htons(TCP_PORT
);
95 addr
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
97 setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, &opt
, sizeof(opt
));
98 rc
= bind(fd
, (struct sockaddr
*)&addr
, sizeof(addr
));
100 fprintf(stderr
, "Failed to bind debug socket !\r\n");
105 fprintf(stderr
, "Failed to listen to debug socket !\r\n");
108 fprintf(stdout
, "Debug socket ready\r\n");
116 static void check_connection(void)
118 struct sockaddr_in addr
;
119 socklen_t addr_len
= sizeof(addr
);
121 cfd
= accept(fd
, (struct sockaddr
*)&addr
, &addr_len
);
124 fprintf(stdout
, "Debug client connected !\r\n");
127 void sim_jtag_read_msg(unsigned char *out_msg
, unsigned char *out_size
)
129 unsigned char data
[MAX_PACKET
];
130 unsigned char size
= 0;
131 struct pollfd fdset
[1];
143 memset(fdset
, 0, sizeof(fdset
));
145 fdset
[0].events
= POLLIN
;
146 rc
= poll(fdset
, 1, 0);
149 rc
= read(cfd
, data
, MAX_PACKET
);
151 fprintf(stderr
, "Debug read error, assuming client disconnected !\r\n");
153 fprintf(stdout
, "Debug client disconnected !\r\n");
161 fprintf(stderr
, "Got message:\n\r");
164 fprintf(stderr
, "%02x ", data
[i
]);
165 fprintf(stderr
, "\n\r");
168 size
= data
[0]; /* Size in bits */
172 /* JTAG reset, message to translate */
176 if (((rc
- 1) * 8) < size
) {
177 fprintf(stderr
, "Debug short read: %d bytes for %d bits, truncating\r\n",
182 for (i
= 0; i
< size
; i
++) {
184 int bit
= 1 << (i
& 7);
185 out_msg
[i
] = (data
[byte
+1] & bit
) ? vhpi1
: vhpi0
;
188 to_std_logic_vector(size
, out_size
, 8);
191 void sim_jtag_write_msg(unsigned char *in_msg
, unsigned char *in_size
)
193 unsigned char data
[MAX_PACKET
];
197 size
= from_std_logic_vector(in_size
, 8);
199 for (i
= 0; i
< size
; i
++) {
201 int bit
= 1 << (i
& 7);
202 if (in_msg
[i
] == vhpi1
)
205 data
[byte
+1] &= ~bit
;
210 fprintf(stderr
, "Sending response:\n\r");
213 fprintf(stderr
, "%02x ", data
[i
]);
214 fprintf(stderr
, "\n\r");
218 rc
= write(cfd
, data
, rc
);
220 fprintf(stderr
, "Debug write error, ignoring\r\n");