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
);
62 void remote_bitbang_t::accept()
64 client_fd
= ::accept(socket_fd
, NULL
, NULL
);
65 if (client_fd
== -1) {
66 if (errno
== EAGAIN
) {
67 // No client waiting to connect right now.
69 fprintf(stderr
, "failed to accept on socket: %s (%d)\n", strerror(errno
),
74 fcntl(client_fd
, F_SETFL
, O_NONBLOCK
);
78 void remote_bitbang_t::tick()
87 void remote_bitbang_t::execute_commands()
89 const unsigned buf_size
= 64 * 1024;
90 char recv_buf
[buf_size
];
91 char send_buf
[buf_size
];
92 unsigned total_received
= 0;
93 ssize_t bytes
= read(client_fd
, recv_buf
, buf_size
);
96 total_received
+= bytes
;
97 unsigned send_offset
= 0;
98 for (unsigned i
= 0; i
< bytes
; i
++) {
99 uint8_t command
= recv_buf
[i
];
102 case 'B': /* fprintf(stderr, "*BLINK*\n"); */ break;
103 case 'b': /* fprintf(stderr, "_______\n"); */ break;
104 case 'r': tap
->reset(); break;
105 case '0': tap
->set_pins(0, 0, 0); break;
106 case '1': tap
->set_pins(0, 0, 1); break;
107 case '2': tap
->set_pins(0, 1, 0); break;
108 case '3': tap
->set_pins(0, 1, 1); break;
109 case '4': tap
->set_pins(1, 0, 0); break;
110 case '5': tap
->set_pins(1, 0, 1); break;
111 case '6': tap
->set_pins(1, 1, 0); break;
112 case '7': tap
->set_pins(1, 1, 1); break;
113 case 'R': send_buf
[send_offset
++] = tap
->tdo() ? '1' : '0'; break;
114 case 'Q': quit
= true; break;
116 fprintf(stderr
, "remote_bitbang got unsupported command '%c'\n",
121 while (sent
< send_offset
) {
122 bytes
= write(client_fd
, send_buf
+ sent
, send_offset
);
124 fprintf(stderr
, "failed to write to socket: %s (%d)\n", strerror(errno
), errno
);
130 if (total_received
> buf_size
|| quit
) {
131 // Don't go forever, because that could starve the main simulation.
134 bytes
= read(client_fd
, recv_buf
, buf_size
);
138 if (errno
== EAGAIN
) {
139 // We'll try again the next call.
141 fprintf(stderr
, "remote_bitbang failed to read on socket: %s (%d)\n",
142 strerror(errno
), errno
);
146 if (bytes
== 0 || quit
) {
147 // The remote disconnected.