12 #include "remote_bitbang.h"
20 /////////// remote_bitbang_t
22 remote_bitbang_t::remote_bitbang_t(uint16_t port
, jtag_dtm_t
*tap
) :
29 socket_fd
= socket(AF_INET
, SOCK_STREAM
, 0);
30 if (socket_fd
== -1) {
31 fprintf(stderr
, "remote_bitbang failed to make socket: %s (%d)\n",
32 strerror(errno
), errno
);
36 fcntl(socket_fd
, F_SETFL
, O_NONBLOCK
);
38 if (setsockopt(socket_fd
, SOL_SOCKET
, SO_REUSEADDR
, &reuseaddr
,
40 fprintf(stderr
, "remote_bitbang failed setsockopt: %s (%d)\n",
41 strerror(errno
), errno
);
45 struct sockaddr_in addr
;
46 memset(&addr
, 0, sizeof(addr
));
47 addr
.sin_family
= AF_INET
;
48 addr
.sin_addr
.s_addr
= INADDR_ANY
;
49 addr
.sin_port
= htons(port
);
51 if (bind(socket_fd
, (struct sockaddr
*) &addr
, sizeof(addr
)) == -1) {
52 fprintf(stderr
, "remote_bitbang failed to bind socket: %s (%d)\n",
53 strerror(errno
), errno
);
57 if (listen(socket_fd
, 1) == -1) {
58 fprintf(stderr
, "remote_bitbang failed to listen on socket: %s (%d)\n",
59 strerror(errno
), errno
);
63 socklen_t addrlen
= sizeof(addr
);
64 if (getsockname(socket_fd
, (struct sockaddr
*) &addr
, &addrlen
) == -1) {
65 fprintf(stderr
, "remote_bitbang getsockname failed: %s (%d)\n",
66 strerror(errno
), errno
);
70 printf("Listening for remote bitbang connection on port %d.\n",
71 ntohs(addr
.sin_port
));
75 void remote_bitbang_t::accept()
77 client_fd
= ::accept(socket_fd
, NULL
, NULL
);
78 if (client_fd
== -1) {
79 if (errno
== EAGAIN
) {
80 // No client waiting to connect right now.
82 fprintf(stderr
, "failed to accept on socket: %s (%d)\n", strerror(errno
),
87 fcntl(client_fd
, F_SETFL
, O_NONBLOCK
);
91 void remote_bitbang_t::tick()
100 void remote_bitbang_t::execute_commands()
102 static char send_buf
[buf_size
];
103 unsigned total_processed
= 0;
105 bool in_rti
= tap
->state() == RUN_TEST_IDLE
;
106 bool entered_rti
= false;
108 if (recv_start
< recv_end
) {
109 unsigned send_offset
= 0;
110 while (recv_start
< recv_end
) {
111 uint8_t command
= recv_buf
[recv_start
];
114 case 'B': /* fprintf(stderr, "*BLINK*\n"); */ break;
115 case 'b': /* fprintf(stderr, "_______\n"); */ break;
116 case 'r': tap
->reset(); break;
117 case '0': tap
->set_pins(0, 0, 0); break;
118 case '1': tap
->set_pins(0, 0, 1); break;
119 case '2': tap
->set_pins(0, 1, 0); break;
120 case '3': tap
->set_pins(0, 1, 1); break;
121 case '4': tap
->set_pins(1, 0, 0); break;
122 case '5': tap
->set_pins(1, 0, 1); break;
123 case '6': tap
->set_pins(1, 1, 0); break;
124 case '7': tap
->set_pins(1, 1, 1); break;
125 case 'R': send_buf
[send_offset
++] = tap
->tdo() ? '1' : '0'; break;
126 case 'Q': quit
= true; break;
128 fprintf(stderr
, "remote_bitbang got unsupported command '%c'\n",
133 if (!in_rti
&& tap
->state() == RUN_TEST_IDLE
) {
140 while (sent
< send_offset
) {
141 ssize_t bytes
= write(client_fd
, send_buf
+ sent
, send_offset
);
143 fprintf(stderr
, "failed to write to socket: %s (%d)\n", strerror(errno
), errno
);
150 if (total_processed
> buf_size
|| quit
|| entered_rti
) {
151 // Don't go forever, because that could starve the main simulation.
156 recv_end
= read(client_fd
, recv_buf
, buf_size
);
158 if (recv_end
== -1) {
159 if (errno
== EAGAIN
) {
162 fprintf(stderr
, "remote_bitbang failed to read on socket: %s (%d)\n",
163 strerror(errno
), errno
);
169 fprintf(stderr
, "Remote Bitbang received 'Q'\n");
172 if (recv_end
== 0 || quit
) {
173 // The remote disconnected.
174 fprintf(stderr
, "Received nothing. Quitting.\n");