`define IN_CLK 8388608
-`define OUT_CLK 57600
+`define OUT_CLK 19200
`define CLK_DIV `IN_CLK / `OUT_CLK
`define DATA_ADDR 16'hFF52
`define STAT_ADDR 16'hFF53
reg rx_hasdata = 0;
reg [15:0] rx_clkdiv = 0;
reg [3:0] rx_state = 4'b0000;
- reg [7:0] rx_data;
+ reg [7:0] rx_data, rx_data_tmp;
assign data = (stat_latch) ? {6'b0, rx_hasdata, tx_busy} :
(data_latch) ? rx_data :
rx_state <= 0;
case (rx_state)
4'b0001: begin end /* Twiddle thumbs -- this is the end of the half bit. */
- 4'b0010: rx_data[0] <= serialrx;
- 4'b0011: rx_data[1] <= serialrx;
- 4'b0100: rx_data[2] <= serialrx;
- 4'b0101: rx_data[3] <= serialrx;
- 4'b0110: rx_data[4] <= serialrx;
- 4'b0111: rx_data[5] <= serialrx;
- 4'b1000: rx_data[6] <= serialrx;
- 4'b1001: rx_data[7] <= serialrx;
- 4'b1010: begin end /* Expect a 1 */
+ 4'b0010: rx_data_tmp[0] <= serialrx;
+ 4'b0011: rx_data_tmp[1] <= serialrx;
+ 4'b0100: rx_data_tmp[2] <= serialrx;
+ 4'b0101: rx_data_tmp[3] <= serialrx;
+ 4'b0110: rx_data_tmp[4] <= serialrx;
+ 4'b0111: rx_data_tmp[5] <= serialrx;
+ 4'b1000: rx_data_tmp[6] <= serialrx;
+ 4'b1001: rx_data_tmp[7] <= serialrx;
+ 4'b1010: if (serialrx == 1) begin
+ rx_data <= rx_data_tmp; /* Expect a 1 */
+ rx_hasdata <= 1;
+ end
endcase
end
- rx_hasdata <= (rx_hasdata && ~(rd && data_decode)) || ((rx_state == 4'b1010) && (tx_clkdiv == 0));
+ if (rd && data_decode)
+ rx_hasdata <= 0;
if(tx_newdata || (tx_clkdiv == `CLK_DIV))
tx_clkdiv <= 0;
#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <poll.h>
void dowrite(char *s, int len)
{
}
}
-void main()
+int waitchar(int timeout)
{
- char buf[259];
+ struct pollfd pfd;
+
+ pfd.fd = 0;
+ pfd.events = POLLIN;
+ return poll(&pfd, 1, timeout) == 1;
+}
+
+void expect(char *s, int len)
+{
+ int i;
+ char c;
+ for (i=0; i < len; i++)
+ {
+ if (waitchar(100) == 0)
+ {
+ fprintf(stderr, "Timeout reached in expect (expected %c)\n", s[i]);
+ return;
+ }
+ while (read(0, &c, 1) == 0)
+ fprintf(stderr, "Short read...\n");
+ if (c != s[i])
+ fprintf(stderr, "Expect failed: expected %d, got %d (pos %d)\n", s[i], c, i);
+ }
+}
+
+void expect_no_chars()
+{
+ int cs = 0;
+
+ while (waitchar(10) == 1)
+ {
+ char c;
+ if (read(0, &c, 1) == 0)
+ fprintf(stderr, "enc Short read...\n");
+ cs++;
+ fprintf(stderr, "Warning: expected no chars, got %d\n", c);
+ }
+ if (cs)
+ fprintf(stderr, "Expect no chars failed: got %d chars\n", cs);
+
+
+}
+
+void main(int argc, char **argv)
+{
+ unsigned char buf[259];
int sz;
+ int rfd;
+
+ if (argc < 2)
+ {
+ fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
+ exit(1);
+ }
+ rfd = open(argv[1], O_RDONLY);
+ if (rfd < 0)
+ {
+ perror("open");
+ exit(1);
+ }
+
dowrite("\x1B" "A\x00\x00\x00...", 8);
fprintf(stderr, "Address sent\n");
- while ((sz = read(0, buf+3, 128)) > 0)
+ expect("A...", 4);
+ while ((sz = read(rfd, buf+3, 128)) > 0)
{
buf[0] = 0x1B;
buf[1] = 'D';
- buf[2] = sz - 1;
+ buf[2] = sz+1;
dowrite(buf, sz + 3);
- dowrite(".", 1);
fprintf(stderr, "Data sent\n");
- usleep(100000);
+ expect("D", 1);
+ expect_no_chars();
}
+ exit(0);
}
\ No newline at end of file