5 #include <sys/select.h>
6 #include <sys/types.h> /* See NOTES */
7 #include <sys/socket.h>
8 #include <netinet/in.h>
10 #include <sys/fcntl.h>
11 #include <netinet/in.h>
12 #include <netinet/tcp.h>
21 /* reads from a socket if it is ready (a single byte) and returns 1 if success
23 int read_handler(int fdread
, char *buffer
)
29 FD_SET(fdread
, &read_fds
);
35 status
= select(fdread
+1, &read_fds
, NULL
, NULL
, &tv
);
39 printf("Error reading on socket\n");
40 exit(status
); // error
43 return 0; // timeout (nothing read)
45 return read(fdread
, buffer
, 1);
49 /* nothing sophisticated: wait for an incoming connection
53 int listenfd
= 0, connfd
= 0;
55 struct sockaddr_in serv_addr
;
57 listenfd
= socket(AF_INET
, SOCK_STREAM
, 0);
58 memset(&serv_addr
, '0', sizeof(serv_addr
));
60 serv_addr
.sin_family
= AF_INET
;
61 serv_addr
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
62 serv_addr
.sin_port
= htons(5000);
64 bind(listenfd
, (struct sockaddr
*)&serv_addr
, sizeof(serv_addr
));
68 connfd
= accept(listenfd
, (struct sockaddr
*)NULL
, NULL
);
71 setsockopt(connfd
, IPPROTO_TCP
, TCP_NODELAY
, (char *) &flag
, sizeof(int));
77 static void accept_conn_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *address, int socklen, void *ctx)
79 struct session_s *s = (struct session_s*)ctx;
80 struct timeval tv = {1, 0};
83 s->ev = event_new(base, fd, EV_READ | EV_PERSIST , event_handler, s);
84 event_add(s->ev, &tv);
87 static int jtagremote_new(void **sess, char *args)
90 struct session_s *s = NULL;
93 struct evconnlistener *listener;
94 struct sockaddr_in sin;
101 ret = litex_sim_module_get_args(args, "port", &cport);
105 printf("Found port %s\n", cport);
106 sscanf(cport, "%d", &port);
110 fprintf(stderr, "Invalid port selected!\n");
114 s=(struct session_s*)malloc(sizeof(struct session_s));
119 memset(s, 0, sizeof(struct session_s));
121 memset(&sin, 0, sizeof(sin));
122 sin.sin_family = AF_INET;
123 sin.sin_addr.s_addr = htonl(0);
124 sin.sin_port = htons(port);
125 listener = evconnlistener_new_bind(base, accept_conn_cb, s, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1, (struct sockaddr*)&sin, sizeof(sin));
128 eprintf("Can't bind port %d\n!\n", port);
131 evconnlistener_set_error_cb(listener, accept_error_cb);
142 void read_openocd_jtagremote(cxxrtl_design::p_add
&top
, int sock
)
145 if (read_handler(sock
, &c
) != 1) {
148 printf ("read %c\n", c
);
149 if ((c
>= '0') && (c
<= '7'))
151 top
.p_tck
.set
<bool>(((c
- '0') >> 2) & 1);
152 top
.p_tms
.set
<bool>(((c
- '0') >> 1) & 1);
153 top
.p_tdi
.set
<bool>((c
- '0') & 1);
157 uint8_t val
= top
.p_tdo
.get
<uint8_t>() + '0';
158 if(-1 == write(sock
, &val
, 1))
160 printf("Error writing on socket\n");
165 printf("disconnect request\n");
172 cxxrtl_design::p_add top
;
174 int sock
= get_connection();
179 top
.p_clk
.set
<bool>(false);
181 top
.p_clk
.set
<bool>(true);
184 /* read and process incoming jtag */
185 read_openocd_jtagremote(top
, sock
);
187 // check that the output is correct
189 top.p_a.set<uint8_t>(5);
190 top.p_b.set<uint8_t>(3);
191 uint32_t f = top.p_f.get<uint32_t>();
193 cout << "f " << f << endl;