6 #include <event2/listener.h>
7 #include <event2/util.h>
8 #include <event2/event.h>
10 #include <json-c/json.h>
28 struct event_base
*base
;
30 int litex_sim_module_get_args( char *args
, char *arg
, char **val
)
33 json_object
*jsobj
= NULL
;
34 json_object
*obj
= NULL
;
38 jsobj
= json_tokener_parse(args
);
40 fprintf(stderr
, "Error parsing json arg: %s \n", args
);
44 if(!json_object_is_type(jsobj
, json_type_object
)) {
45 fprintf(stderr
, "Arg must be type object! : %s \n", args
);
50 r
= json_object_object_get_ex(jsobj
, arg
, &obj
);
52 fprintf(stderr
, "Could not find object: \"%s\" (%s)\n", arg
, args
);
56 value
=strdup(json_object_get_string(obj
));
63 static int litex_sim_module_pads_get( struct pad_s
*pads
, char *name
, void **signal
)
69 if(!pads
|| !name
|| !signal
) {
76 if(!strcmp(pads
[i
].name
, name
)) {
77 sig
= (void*)pads
[i
].signal
;
88 static int serial2tcp_start(void *b
)
90 base
= (struct event_base
*)b
;
91 printf("[serial2tcp] loaded (%p)\n", base
);
95 void read_handler(int fd
, short event
, void *arg
)
97 struct session_s
*s
= (struct session_s
*)arg
;
103 read_len
= read(fd
, buffer
, 1024);
104 for(i
= 0; i
< read_len
; i
++)
106 s
->databuf
[(s
->data_start
+ s
->datalen
) % 2048] = buffer
[i
];
111 static void event_handler(int fd
, short event
, void *arg
)
114 read_handler(fd
, event
, arg
);
117 static void accept_conn_cb(struct evconnlistener
*listener
, evutil_socket_t fd
, struct sockaddr
*address
, int socklen
, void *ctx
)
119 struct session_s
*s
= (struct session_s
*)ctx
;
120 struct timeval tv
= {1, 0};
123 s
->ev
= event_new(base
, fd
, EV_READ
| EV_PERSIST
, event_handler
, s
);
124 event_add(s
->ev
, &tv
);
128 accept_error_cb(struct evconnlistener
*listener
, void *ctx
)
130 struct event_base
*base
= evconnlistener_get_base(listener
);
133 event_base_loopexit(base
, NULL
);
136 static int serial2tcp_new(void **sess
, char *args
)
139 struct session_s
*s
= NULL
;
142 struct evconnlistener
*listener
;
143 struct sockaddr_in sin
;
150 ret
= litex_sim_module_get_args(args
, "port", &cport
);
154 printf("Found port %s\n", cport
);
155 sscanf(cport
, "%d", &port
);
159 fprintf(stderr
, "Invalid port selected!\n");
163 s
=(struct session_s
*)malloc(sizeof(struct session_s
));
168 memset(s
, 0, sizeof(struct session_s
));
170 memset(&sin
, 0, sizeof(sin
));
171 sin
.sin_family
= AF_INET
;
172 sin
.sin_addr
.s_addr
= htonl(0);
173 sin
.sin_port
= htons(port
);
174 listener
= evconnlistener_new_bind(base
, accept_conn_cb
, s
, LEV_OPT_CLOSE_ON_FREE
|LEV_OPT_REUSEABLE
, -1, (struct sockaddr
*)&sin
, sizeof(sin
));
177 eprintf("Can't bind port %d\n!\n", port
);
180 evconnlistener_set_error_cb(listener
, accept_error_cb
);
187 static int serial2tcp_add_pads(void *sess
, struct pad_list_s
*plist
)
190 struct session_s
*s
=(struct session_s
*)sess
;
192 if(!sess
|| !plist
) {
197 if(!strcmp(plist
->name
, "serial")) {
198 litex_sim_module_pads_get(pads
, "sink_data", (void**)&s
->rx
);
199 litex_sim_module_pads_get(pads
, "sink_valid", (void**)&s
->rx_valid
);
200 litex_sim_module_pads_get(pads
, "sink_ready", (void**)&s
->rx_ready
);
201 litex_sim_module_pads_get(pads
, "source_data", (void**)&s
->tx
);
202 litex_sim_module_pads_get(pads
, "source_valid", (void**)&s
->tx_valid
);
203 litex_sim_module_pads_get(pads
, "source_ready", (void**)&s
->tx_ready
);
206 if(!strcmp(plist
->name
, "sys_clk"))
207 litex_sim_module_pads_get(pads
, "sys_clk", (void**)&s
->sys_clk
);
213 static int serial2tcp_tick(void *sess
, uint64_t time_ps
)
215 static struct clk_edge_t edge
;
219 struct session_s
*s
= (struct session_s
*)sess
;
220 if(!clk_pos_edge(&edge
, *s
->sys_clk
)) {
225 if(s
->fd
&& *s
->tx_valid
) {
227 if(-1 ==write(s
->fd
, &c
, 1)) {
228 eprintf("Error writing on socket\n");
236 *s
->rx
=s
->databuf
[s
->data_start
];
237 s
->data_start
= (s
->data_start
+ 1) % 2048;
246 static struct ext_module_s ext_mod
= {
255 int litex_sim_ext_module_init(int (*register_module
)(struct ext_module_s
*))
258 ret
= register_module(&ext_mod
);