1 Index: target_bfin_new.c
2 ===================================================================
3 --- target_bfin_new.c (revision 2656)
4 +++ target_bfin_new.c (working copy)
7 #endif /* HAVE_CONFIG_H */
25 @@ -4672,6 +4676,177 @@ bfin_out_treg (char *in, unsigned int re
26 return bfin_out_treg_value (in, reg_no, value);
29 +#define DR_OUT (cpu->chain->parts->parts[cpu->chain->active_part]->active_instruction->data_register->out)
30 +#define DR_IN (cpu->chain->parts->parts[cpu->chain->active_part]->active_instruction->data_register->in)
32 +static unsigned int btc_port = 2001;
33 +static int btc_listen_sock = -1;
35 +static pthread_t btc_thread;
37 +static char *btc_read_buff = NULL;
38 +static size_t btc_read_len = 0;
39 +static inline void btc_read_maybe_queue(void)
41 + if (DR_OUT->data[40 - 1 - 7] == 0)
46 + for (i = 0; i < 32; ++i)
47 + data |= DR_OUT->data[i] << (32 - 1 - i);
49 + printf("got from Blackfin: 0x%08x\n", data);
51 + btc_read_buff = realloc(btc_read_buff, btc_read_len + 4);
52 + memcpy(btc_read_buff + btc_read_len, &data, 4);
56 +static inline int jtag_strdup_parse_line(char *buf)
60 + ret = jtag_parse_line(cpu->chain, buf);
65 +static size_t btc_write(size_t length, void *data)
69 + char dr_cmd[] = "dr 0000000000000000000000000000000000000000"; /* need 40bits */
71 + /* in full duplex, we need to look at 7th bit
72 + * to see if Blackfin is sending to us
74 + for (i = 0; i < length; i += 4) {
75 + dr_cmd[3 + 6] = '0';
76 + jtag_strdup_parse_line(dr_cmd);
78 + jtag_strdup_parse_line("shift dr");
79 + //jtag_strdup_parse_line("dr");
80 + //printf("{ in:%s\n out:%s}\n", register_get_string(DR_IN), register_get_string(DR_OUT));
82 + btc_read_maybe_queue();
84 + if (DR_OUT->data[40 - 1 - 6] == 0)
88 + dr_cmd[3 + 6] = '1';
89 + for (j = 0; j < 4; ++j) {
90 + //printf("byte: %c (0x%02x): 0y", buf[i+j], buf[i+j]);
91 + for (b = 0; b < 8; ++b) {
92 + char bit = ((buf[i+j] >> b) & 0x1) + '0';
93 + dr_cmd[3 + 8 + 8*j + b] = bit;
94 + //printf("%c", bit);
98 + //printf("dr_cmd: %s\n", dr_cmd);
99 + jtag_strdup_parse_line(dr_cmd);
100 + jtag_strdup_parse_line("shift dr");
101 + btc_read_maybe_queue();
107 +static void *btc_thread_main(void *arg)
114 + int fd = open("/dev/null", O_WRONLY);
115 + dup2(fd, STDOUT_FILENO);
120 + btc_sock = sock_accept(btc_listen_sock);
121 + fcntl(btc_sock, F_SETFL, fcntl(btc_sock, F_GETFL) | O_NONBLOCK);
122 +// dup2(btc_sock, STDOUT_FILENO);
124 + jtag_strdup_parse_line("instruction EMUDAT_40_SCAN");
125 + jtag_strdup_parse_line("shift ir");
129 + memset(buf, 'a', sizeof(buf));
130 + io_ret = read(btc_sock, buf, sizeof(buf)-1);
134 + if (buf[io_ret-1] == '\n' || buf[io_ret-1] == '\r')
140 + buf[io_ret] = '\0';
141 + printf("SOCKET: '%s'\n", buf);
144 + printf("jtag_parse_line: %i\n", jtag_parse_line(cpu->chain, buf+1));
146 + btc_write(io_ret, buf);
149 + io_ret = read(btc_sock, &byte, 1);
150 + if (io_ret == 0 || (io_ret == -1 && errno != EAGAIN))
154 + btc_write(1, &byte);
156 + jtag_strdup_parse_line("dr 0000000000000000000000000000000000000000");
157 + jtag_strdup_parse_line("shift dr");
158 + btc_read_maybe_queue();
161 + if (btc_read_len) {
162 + write(btc_sock, btc_read_buff, 1);
174 +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
175 +static void bfin_btc_init(void)
178 + char *btc_command_init[] = {
179 + /* declare a 40bit version of emudat */
180 + "register EMUDAT_40 40",
181 + "instruction EMUDAT_40_SCAN 10100 EMUDAT_40",
183 + /* set emudat to 40bits */
184 + "instruction DBGCTL_SCAN",
187 + "dr 0000000100000000",
191 + btc_listen_sock = listen_sock_open(&btc_port);
192 + if (btc_listen_sock == -1)
195 + pthread_create(&btc_thread, NULL, btc_thread_main, NULL);
196 + for (i = 0; i < ARRAY_SIZE(btc_command_init); ++i)
197 + jtag_strdup_parse_line(btc_command_init[i]);
203 @@ -5208,6 +5383,8 @@ bfin_open (int argc,
204 cpu->cores[0].name = "Core";
209 return RP_VAL_TARGETRET_OK;
213 ===================================================================
214 --- rpmisc.c (revision 2656)
215 +++ rpmisc.c (working copy)
222 +# undef INVALID_SOCKET
223 +# define INVALID_SOCKET -1
224 +# undef SOCKET_ERROR
225 +# define SOCKET_ERROR -1
227 static int dbg_sock = INVALID_SOCKET;
228 static int dbg_listen_sock = INVALID_SOCKET;
230 -static int dbg_sock = -1;
231 -static int dbg_listen_sock = -1;
235 static void rp_log_local(int level, const char *fmt, ...);
236 @@ -140,29 +141,21 @@ void dbg_sock_cleanup(void)
239 /* Open listen socket in a mode expected by gdb */
240 -int dbg_listen_sock_open(unsigned int *port)
241 +int listen_sock_open(unsigned int *port)
243 struct sockaddr_in sa;
249 assert(port == NULL || *port < 0x10000);
252 - assert(dbg_sock == INVALID_SOCKET && dbg_listen_sock == INVALID_SOCKET);
254 - if ((dbg_listen_sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
257 - assert(dbg_sock == -1 && dbg_listen_sock == -1);
259 - if ((dbg_listen_sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
262 + if ((sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
263 + return INVALID_SOCKET;
266 - setsockopt(dbg_listen_sock,
271 @@ -178,13 +171,8 @@ int dbg_listen_sock_open(unsigned int *p
273 sa.sin_port = htons((unsigned short int) *port);
276 - if ((ret = bind(dbg_listen_sock, (struct sockaddr *) &sa, sizeof (sa))) == SOCKET_ERROR)
279 - if ((ret = bind(dbg_listen_sock, (struct sockaddr *) &sa, sizeof (sa))) != 0)
282 + if ((ret = bind(sock, (struct sockaddr *) &sa, sizeof (sa))) == SOCKET_ERROR)
283 + return INVALID_SOCKET;
287 @@ -194,79 +182,68 @@ int dbg_listen_sock_open(unsigned int *p
289 sa.sin_port = htons(p);
292 - if ((ret = bind(dbg_listen_sock, (struct sockaddr *) &sa, sizeof (sa))) != SOCKET_ERROR)
293 + if ((ret = bind(sock, (struct sockaddr *) &sa, sizeof (sa))) != SOCKET_ERROR)
296 - if ((ret = bind(dbg_listen_sock, (struct sockaddr *) &sa, sizeof (sa))) == 0)
303 /* No sockets available */
305 + return INVALID_SOCKET;
312 - assert(dbg_listen_sock != INVALID_SOCKET);
313 + assert(sock != INVALID_SOCKET);
315 - if ((ret = listen(dbg_listen_sock, 1)) == SOCKET_ERROR)
318 - assert(dbg_listen_sock >= 0);
319 + if ((ret = listen(sock, 1)) == SOCKET_ERROR)
320 + return INVALID_SOCKET;
322 - if ((ret = listen(dbg_listen_sock, 1)) != 0)
327 +int dbg_listen_sock_open(unsigned int *port)
329 + assert(dbg_sock == INVALID_SOCKET && dbg_listen_sock == INVALID_SOCKET);
332 + dbg_listen_sock = listen_sock_open(port);
334 + return (dbg_listen_sock == INVALID_SOCKET ? FALSE : TRUE);
337 /* Accept incoming connection and set mode expected by gdb */
338 -int dbg_sock_accept(void)
339 +int sock_accept(int listen_sock)
342 struct sockaddr_in sa;
346 - assert(dbg_sock == INVALID_SOCKET);
347 - assert(dbg_listen_sock != INVALID_SOCKET);
351 - if ((dbg_sock = accept(dbg_listen_sock, (struct sockaddr *) &sa, &tmp))
352 + if ((sock = accept(listen_sock, (struct sockaddr *) &sa, &tmp))
356 + return INVALID_SOCKET;
359 if ((pe = getprotobyname("tcp")) == NULL)
362 - assert(dbg_sock < 0);
363 - assert(dbg_listen_sock >= 0);
366 - if ((dbg_sock = accept(dbg_listen_sock, (struct sockaddr *) &sa, &tmp)) < 0)
369 - if ((pe = getprotobyname("tcp")) == NULL)
372 + return INVALID_SOCKET;
375 - setsockopt(dbg_sock,
385 +int dbg_sock_accept(void)
387 + assert(dbg_sock == INVALID_SOCKET);
388 + assert(dbg_listen_sock != INVALID_SOCKET);
389 + dbg_sock = sock_accept(dbg_listen_sock);
390 + return (dbg_sock == INVALID_SOCKET ? FALSE : TRUE);
393 /* Close connection to debugger side */
395 ===================================================================
396 --- rpmisc.h (revision 2656)
397 +++ rpmisc.h (working copy)
398 @@ -39,6 +39,9 @@ int dbg_sock_accept(void);
399 int dbg_sock_readchar(int ms);
400 int dbg_listen_sock_open(unsigned int *port);
402 +int listen_sock_open(unsigned int *port);
403 +int sock_accept(int listen_sock);
405 /* Return values for readchar: either character
406 code or one of the following*/
407 #define RP_VAL_MISCREADCHARRET_TMOUT (-2)