# HG changeset patch # User John Tsiombikas # Date 1489355001 -7200 # Node ID c8d3d23ccd1f33024279fdda685911f1694c14ac # Parent e6d499a8eb1d2835ff35116a7591d763b04e7afd works diff -r e6d499a8eb1d -r c8d3d23ccd1f .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sun Mar 12 23:43:21 2017 +0200 @@ -0,0 +1,4 @@ +\.o$ +\.swp$ +\.d$ +^mdcart$ diff -r e6d499a8eb1d -r c8d3d23ccd1f src/main.c --- a/src/main.c Sun Mar 12 06:20:22 2017 +0200 +++ b/src/main.c Sun Mar 12 23:43:21 2017 +0200 @@ -7,6 +7,7 @@ #include #include #include +#include enum { OP_NONE, @@ -19,12 +20,14 @@ int op_read(FILE *dev, FILE *fp); int op_reset(FILE *dev); int parse_args(int argc, char **argv); +void print_progress(int p); int op, verify = 0; const char *devname = "/dev/ttyUSB0"; char *fname = 0; uint32_t start_addr; int read_size = 128 * 1024; +int quiet; int main(int argc, char **argv) { @@ -48,8 +51,8 @@ term.c_iflag &= ~(IXON | IXOFF); term.c_lflag = 0; - cfsetispeed(&term, B38400); - cfsetospeed(&term, B38400); + cfsetispeed(&term, B115200); + cfsetospeed(&term, B115200); if(tcsetattr(dev, TCSANOW, &term) == -1) { fprintf(stderr, "failed to set terminal attributes for %s: %s\n", devname, strerror(errno)); @@ -101,22 +104,86 @@ return 0; } -#define RET_IF_FAIL(x) \ - if(!fgets(buf, sizeof buf, dev) || buf[0] != 'O') return x +#define RET_IF_FAIL(x) if(!fgets(buf, sizeof buf, dev) || buf[0] != 'O') return x +/*#define RET_IF_FAIL(x) \ + do { \ + if(!fgets(buf, sizeof buf, dev)) return x; \ + printf("--> %s", buf); \ + if(buf[0] != 'O') return x; \ + } while(0) + */ int op_write(FILE *dev, FILE *fp) { char buf[128]; - int c; + int c, prev_progr = -1, written = 0; + struct stat st; + + fstat(fileno(fp), &st); fprintf(dev, "p\n"); RET_IF_FAIL(-1); fprintf(dev, "a%d\n", start_addr); RET_IF_FAIL(-1); + if(!quiet) { + printf("writing %d bytes starting from %xh\n", (int)st.st_size, start_addr); + } + while((c = fgetc(fp)) != -1) { + int p; fprintf(dev, "w%d\n", c); RET_IF_FAIL(-1); + + if(!quiet) { + p = 100 * ++written / st.st_size; + if(p != prev_progr) { + prev_progr = p; + print_progress(p); + } + } + } + if(!quiet) { + putchar('\n'); + } + + if(verify) { + int verified = 0; + + rewind(fp); + fprintf(dev, "a%d\n", start_addr); + RET_IF_FAIL(-1); + + if(!quiet) { + printf("verifying %d bytes starting from %xh\n", (int)st.st_size, start_addr); + } + + while((c = fgetc(fp)) != -1) { + int p, val; + fprintf(dev, "r\n"); + + if(!fgets(buf, sizeof buf, dev) || buf[0] != 'O') { + fprintf(stderr, "\rread error after %d bytes\n", verified); + break; + } + + if((val = atoi(buf + 3)) != c) { /* skip 'O', 'K', ' ' */ + fprintf(stderr, "\rverification error at byte %d\n", verified); + fprintf(stderr, "expected %d (%xh), got %d (%xh)\n", c, c, val, val); + break; + } + + if(!quiet) { + p = 100 * ++verified / st.st_size; + if(p != prev_progr) { + prev_progr = p; + print_progress(p); + } + } + } + if(!quiet) { + putchar('\n'); + } } fprintf(dev, "b\n"); @@ -127,21 +194,38 @@ int op_read(FILE *dev, FILE *fp) { char buf[128]; - int i, val; + int i, val, prev_progr = -1; fprintf(dev, "p\n"); RET_IF_FAIL(-1); fprintf(dev, "a%d\n", start_addr); RET_IF_FAIL(-1); + if(!quiet) { + printf("reading %d bytes starting from %xh\n", read_size, start_addr); + } + for(i=0; i: serial device (eg /dev/ttyUSB0)\n"); printf(" -h|-help: print usage and exit\n"); return 0; @@ -226,3 +314,18 @@ } return 0; } + +void print_progress(int p) +{ + int i, num = p / 2; + printf("\rprogress: ["); + for(i=0; i<50; i++) { + if(i == num) { + putchar('>'); + } else { + putchar(i < num ? '=' : ' '); + } + } + printf("] %3d%%", p); + fflush(stdout); +}