6 #include <event2/listener.h>
7 #include <event2/util.h>
8 #include <event2/event.h>
10 #include <json-c/json.h>
27 struct event_base
*base
;
29 int litex_sim_module_get_args( char *args
, char *arg
, char **val
)
32 json_object
*jsobj
= NULL
;
33 json_object
*obj
= NULL
;
37 jsobj
= json_tokener_parse(args
);
39 fprintf(stderr
, "Error parsing json arg: %s \n", args
);
43 if(!json_object_is_type(jsobj
, json_type_object
)) {
44 fprintf(stderr
, "Arg must be type object! : %s \n", args
);
49 r
= json_object_object_get_ex(jsobj
, arg
, &obj
);
51 fprintf(stderr
, "Could not find object: \"%s\" (%s)\n", arg
, args
);
55 value
=strdup(json_object_get_string(obj
));
62 static int litex_sim_module_pads_get( struct pad_s
*pads
, char *name
, void **signal
)
68 if(!pads
|| !name
|| !signal
) {
75 if(!strcmp(pads
[i
].name
, name
)) {
76 sig
= (void*)pads
[i
].signal
;
87 static int jtagremote_start(void *b
)
89 base
= (struct event_base
*)b
;
90 printf("[jtagremote] loaded (%p)\n", base
);
94 void read_handler(int fd
, short event
, void *arg
)
96 struct session_s
*s
= (struct session_s
*)arg
;
102 read_len
= read(fd
, buffer
, 1024);
103 for(i
= 0; i
< read_len
; i
++)
105 s
->databuf
[(s
->data_start
+ s
->datalen
) % 2048] = buffer
[i
];
110 static void event_handler(int fd
, short event
, void *arg
)
113 read_handler(fd
, event
, arg
);
116 static void accept_conn_cb(struct evconnlistener
*listener
, evutil_socket_t fd
, struct sockaddr
*address
, int socklen
, void *ctx
)
118 struct session_s
*s
= (struct session_s
*)ctx
;
119 struct timeval tv
= {1, 0};
122 s
->ev
= event_new(base
, fd
, EV_READ
| EV_PERSIST
, event_handler
, s
);
123 event_add(s
->ev
, &tv
);
127 accept_error_cb(struct evconnlistener
*listener
, void *ctx
)
129 struct event_base
*base
= evconnlistener_get_base(listener
);
132 event_base_loopexit(base
, NULL
);
135 static int jtagremote_new(void **sess
, char *args
)
138 struct session_s
*s
= NULL
;
141 struct evconnlistener
*listener
;
142 struct sockaddr_in sin
;
149 ret
= litex_sim_module_get_args(args
, "port", &cport
);
153 printf("Found port %s\n", cport
);
154 sscanf(cport
, "%d", &port
);
158 fprintf(stderr
, "Invalid port selected!\n");
162 s
=(struct session_s
*)malloc(sizeof(struct session_s
));
167 memset(s
, 0, sizeof(struct session_s
));
169 memset(&sin
, 0, sizeof(sin
));
170 sin
.sin_family
= AF_INET
;
171 sin
.sin_addr
.s_addr
= htonl(0);
172 sin
.sin_port
= htons(port
);
173 listener
= evconnlistener_new_bind(base
, accept_conn_cb
, s
, LEV_OPT_CLOSE_ON_FREE
|LEV_OPT_REUSEABLE
, -1, (struct sockaddr
*)&sin
, sizeof(sin
));
176 eprintf("Can't bind port %d\n!\n", port
);
179 evconnlistener_set_error_cb(listener
, accept_error_cb
);
186 static int jtagremote_add_pads(void *sess
, struct pad_list_s
*plist
)
189 struct session_s
*s
=(struct session_s
*)sess
;
191 if(!sess
|| !plist
) {
196 printf("plist name: %s\n", plist
->name
);
197 if(!strcmp(plist
->name
, "jtag")) {
198 litex_sim_module_pads_get(pads
, "tck", (void**)&s
->tck
);
199 litex_sim_module_pads_get(pads
, "tdi", (void**)&s
->tdi
);
200 litex_sim_module_pads_get(pads
, "tdo", (void**)&s
->tdo
);
201 litex_sim_module_pads_get(pads
, "tms", (void**)&s
->tms
);
204 if(!strcmp(plist
->name
, "sys_clk"))
205 litex_sim_module_pads_get(pads
, "sys_clk", (void**)&s
->sys_clk
);
211 static int jtagremote_tick(void *sess
, uint64_t time_ps
)
213 static struct clk_edge_t edge
;
217 struct session_s
*s
= (struct session_s
*)sess
;
218 if(!clk_pos_edge(&edge
, *s
->sys_clk
)) {
228 c
= s
->databuf
[s
->data_start
];
230 if((c
>= '0') && (c
<= '7')){
231 *s
->tck
= ((c
- '0') >> 2) & 1;
232 *s
->tms
= ((c
- '0') >> 1) & 1;
233 *s
->tdi
= (c
- '0') & 1;
237 if(-1 == write(s
->fd
, &val
, 1)) {
238 eprintf("Error writing on socket\n");
243 s
->data_start
= (s
->data_start
+ 1) % 2048;
251 static struct ext_module_s ext_mod
= {
260 int litex_sim_ext_module_init(int (*register_module
)(struct ext_module_s
*))
263 ret
= register_module(&ext_mod
);