73dd45bb2d4b31d595bc89b487aabd4b546e886b
5 #include <sys/select.h>
6 #include <netinet/in.h>
16 /* reads from a socket if it is ready (a single byte) and returns 1 if success
18 int read_handler(int fdread
, char *buffer
)
24 FD_SET(fdread
, &read_fds
);
30 status
= select(fdread
+1, &read_fds
, NULL
, NULL
, &tv
);
34 exit(status
); // error
37 return 0; // timeout (nothing read)
39 return read(fdread
, buffer
, 1);
43 /* nothing sophisticated: wait for an incoming connection
47 int listenfd
= 0, connfd
= 0;
48 struct sockaddr_in serv_addr
;
50 listenfd
= socket(AF_INET
, SOCK_STREAM
, 0);
51 memset(&serv_addr
, '0', sizeof(serv_addr
));
53 serv_addr
.sin_family
= AF_INET
;
54 serv_addr
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
55 serv_addr
.sin_port
= htons(5000);
57 bind(listenfd
, (struct sockaddr
*)&serv_addr
, sizeof(serv_addr
));
61 connfd
= accept(listenfd
, (struct sockaddr
*)NULL
, NULL
);
69 static void accept_conn_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *address, int socklen, void *ctx)
71 struct session_s *s = (struct session_s*)ctx;
72 struct timeval tv = {1, 0};
75 s->ev = event_new(base, fd, EV_READ | EV_PERSIST , event_handler, s);
76 event_add(s->ev, &tv);
79 static int jtagremote_new(void **sess, char *args)
82 struct session_s *s = NULL;
85 struct evconnlistener *listener;
86 struct sockaddr_in sin;
93 ret = litex_sim_module_get_args(args, "port", &cport);
97 printf("Found port %s\n", cport);
98 sscanf(cport, "%d", &port);
102 fprintf(stderr, "Invalid port selected!\n");
106 s=(struct session_s*)malloc(sizeof(struct session_s));
111 memset(s, 0, sizeof(struct session_s));
113 memset(&sin, 0, sizeof(sin));
114 sin.sin_family = AF_INET;
115 sin.sin_addr.s_addr = htonl(0);
116 sin.sin_port = htons(port);
117 listener = evconnlistener_new_bind(base, accept_conn_cb, s, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1, (struct sockaddr*)&sin, sizeof(sin));
120 eprintf("Can't bind port %d\n!\n", port);
123 evconnlistener_set_error_cb(listener, accept_error_cb);
132 c = s->databuf[s->data_start];
134 if((c >= '0') && (c <= '7')){
135 *s->tck = ((c - '0') >> 2) & 1;
136 *s->tms = ((c - '0') >> 1) & 1;
137 *s->tdi = (c - '0') & 1;
141 if(-1 == write(s->fd, &val, 1)) {
142 eprintf("Error writing on socket\n");
147 s->data_start = (s->data_start + 1) % 2048;
159 cxxrtl_design::p_add top
;
164 for(int cycle
=0;cycle
<1000;++cycle
){
166 top
.p_clk
.set
<bool>(false);
168 top
.p_clk
.set
<bool>(true);
171 // check that the output is correct
173 top.p_a.set<uint8_t>(5);
174 top.p_b.set<uint8_t>(3);
175 uint32_t f = top.p_f.get<uint32_t>();
177 cout << "f " << f << endl;