12 #include "remote_bitbang.h"
20 /////////// remote_bitbang_t
22 remote_bitbang_t::remote_bitbang_t(uint16_t port
, jtag_dtm_t
*tap
) :
27 socket_fd
= socket(AF_INET
, SOCK_STREAM
, 0);
28 if (socket_fd
== -1) {
29 fprintf(stderr
, "remote_bitbang failed to make socket: %s (%d)\n",
30 strerror(errno
), errno
);
34 fcntl(socket_fd
, F_SETFL
, O_NONBLOCK
);
36 if (setsockopt(socket_fd
, SOL_SOCKET
, SO_REUSEADDR
, &reuseaddr
,
38 fprintf(stderr
, "remote_bitbang failed setsockopt: %s (%d)\n",
39 strerror(errno
), errno
);
43 struct sockaddr_in addr
;
44 memset(&addr
, 0, sizeof(addr
));
45 addr
.sin_family
= AF_INET
;
46 addr
.sin_addr
.s_addr
= INADDR_ANY
;
47 addr
.sin_port
= htons(port
);
49 if (bind(socket_fd
, (struct sockaddr
*) &addr
, sizeof(addr
)) == -1) {
50 fprintf(stderr
, "remote_bitbang failed to bind socket: %s (%d)\n",
51 strerror(errno
), errno
);
55 if (listen(socket_fd
, 1) == -1) {
56 fprintf(stderr
, "remote_bitbang failed to listen on socket: %s (%d)\n",
57 strerror(errno
), errno
);
61 socklen_t addrlen
= sizeof(addr
);
62 if (getsockname(socket_fd
, (struct sockaddr
*) &addr
, &addrlen
) == -1) {
63 fprintf(stderr
, "remote_bitbang getsockname failed: %s (%d)\n",
64 strerror(errno
), errno
);
68 printf("Listening for remote bitbang connection on port %d.\n",
69 ntohs(addr
.sin_port
));
73 void remote_bitbang_t::accept()
75 client_fd
= ::accept(socket_fd
, NULL
, NULL
);
76 if (client_fd
== -1) {
77 if (errno
== EAGAIN
) {
78 // No client waiting to connect right now.
80 fprintf(stderr
, "failed to accept on socket: %s (%d)\n", strerror(errno
),
85 fcntl(client_fd
, F_SETFL
, O_NONBLOCK
);
89 void remote_bitbang_t::tick()
98 void remote_bitbang_t::execute_commands()
100 const unsigned buf_size
= 64 * 1024;
101 static char recv_buf
[buf_size
];
102 static char send_buf
[buf_size
];
103 unsigned total_received
= 0;
104 ssize_t bytes
= read(client_fd
, recv_buf
, buf_size
);
107 total_received
+= bytes
;
108 unsigned send_offset
= 0;
109 for (unsigned i
= 0; i
< bytes
; i
++) {
110 uint8_t command
= recv_buf
[i
];
113 case 'B': /* fprintf(stderr, "*BLINK*\n"); */ break;
114 case 'b': /* fprintf(stderr, "_______\n"); */ break;
115 case 'r': tap
->reset(); break;
116 case '0': tap
->set_pins(0, 0, 0); break;
117 case '1': tap
->set_pins(0, 0, 1); break;
118 case '2': tap
->set_pins(0, 1, 0); break;
119 case '3': tap
->set_pins(0, 1, 1); break;
120 case '4': tap
->set_pins(1, 0, 0); break;
121 case '5': tap
->set_pins(1, 0, 1); break;
122 case '6': tap
->set_pins(1, 1, 0); break;
123 case '7': tap
->set_pins(1, 1, 1); break;
124 case 'R': send_buf
[send_offset
++] = tap
->tdo() ? '1' : '0'; break;
125 case 'Q': quit
= true; break;
127 fprintf(stderr
, "remote_bitbang got unsupported command '%c'\n",
132 while (sent
< send_offset
) {
133 bytes
= write(client_fd
, send_buf
+ sent
, send_offset
);
135 fprintf(stderr
, "failed to write to socket: %s (%d)\n", strerror(errno
), errno
);
141 if (total_received
> buf_size
|| quit
) {
142 // Don't go forever, because that could starve the main simulation.
145 bytes
= read(client_fd
, recv_buf
, buf_size
);
149 if (errno
== EAGAIN
) {
150 // We'll try again the next call.
152 fprintf(stderr
, "remote_bitbang failed to read on socket: %s (%d)\n",
153 strerror(errno
), errno
);
157 if (bytes
== 0 || quit
) {
158 // The remote disconnected.