X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/2bcaaabf0bbbb0232fe8ffe0a8943a14159852ab..d1b404569fd0bdc74a3397c4ef0a5c2e5f95c835:/binwire.c diff --git a/binwire.c b/binwire.c index 9322ef1..101b5c1 100644 --- a/binwire.c +++ b/binwire.c @@ -1,4 +1,9 @@ #include +#include +#include +#include +#include +#include void dowrite(char *s, int len) { @@ -9,20 +14,104 @@ 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; +} + +int expect(char *s, int len) +{ + int i; + char c; + for (i=0; i < len; i++) + { + if (waitchar(1000) == 0) + { + fprintf(stderr, "Timeout reached in expect (expected %c)\n", s[i]); + return 1; + } + 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); + return 1; + } + } + return 0; +} + +void expect_no_chars() +{ + int cs = 0; + + while (waitchar(100) == 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; - dowrite("\x1B" "A\x00\x00\x00...", 8); + int rfd; + int tc = 0; + + 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", 5); fprintf(stderr, "Address sent\n"); - while ((sz = read(0, buf+3, 128)) > 0) + expect("A", 1); + expect_no_chars(); + while ((sz = read(rfd, buf+3, 255)) > 0) { + int rv; + char abuf[5]; buf[0] = 0x1B; buf[1] = 'D'; - buf[2] = sz - 1; + buf[2] = sz+1; + abuf[0] = 0x1B; + abuf[1] = 'A'; + abuf[2] = (tc >> 16) & 0xFF; + abuf[3] = (tc >> 8) & 0xFF; + abuf[4] = tc & 0xFF; + tc += sz; + retry: + dowrite(abuf, 5); + rv = expect("A", 1); dowrite(buf, sz + 3); - dowrite(".", 1); - fprintf(stderr, "Data sent\n"); - usleep(100000); + fprintf(stderr, "Data sent (%d)\n", tc); + rv |= expect("D", 1); + expect_no_chars(); + if (rv) + { + printf("Failure to ack... retrying\n"); + dowrite("...", 3); + rv = expect("...", 3); + expect_no_chars(); + goto retry; + } } + exit(0); } \ No newline at end of file