diff options
author | Keith Packard <keithp@keithp.com> | 2009-09-04 15:01:32 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2009-09-04 15:01:32 -0700 |
commit | 332b056459b1352e233a8bf5f08498df12d32160 (patch) | |
tree | 092c78a014572920ac8d382f4a6d41033fd7b9f5 /ao-tools/ao-eeprom/ao-eeprom.c | |
parent | df88ae4c5f229efcc0ea5cb0a81fc2bb8f96fea2 (diff) |
'fix' ao-eeprom to read two blocks at once. Work around kernel bugs.
The kernel appears to leave serial data undelivered at times. Reading
two blocks at once appears to make it relinquish the queued data.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools/ao-eeprom/ao-eeprom.c')
-rw-r--r-- | ao-tools/ao-eeprom/ao-eeprom.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/ao-tools/ao-eeprom/ao-eeprom.c b/ao-tools/ao-eeprom/ao-eeprom.c index 726cc22c..b865e298 100644 --- a/ao-tools/ao-eeprom/ao-eeprom.c +++ b/ao-tools/ao-eeprom/ao-eeprom.c @@ -21,17 +21,19 @@ #include <unistd.h> #include <getopt.h> #include "cc-usb.h" +#include "cc.h" #define NUM_BLOCK 512 static const struct option options[] = { { .name = "tty", .has_arg = 1, .val = 'T' }, + { .name = "device", .has_arg = 1, .val = 'D' }, { 0, 0, 0, 0}, }; static void usage(char *program) { - fprintf(stderr, "usage: %s [--tty <tty-name>]\n", program); + fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>\n", program); exit(1); } @@ -40,35 +42,41 @@ main (int argc, char **argv) { struct cc_usb *cc; int block; - uint8_t bytes[32 * (2 + 8)]; + uint8_t bytes[2 * 32 * (2 + 8)]; uint8_t *b; int i, j; uint32_t addr; char *tty = NULL; + char *device = NULL; int c; - while ((c = getopt_long(argc, argv, "T:", options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "T:D:", options, NULL)) != -1) { switch (c) { case 'T': tty = optarg; break; + case 'D': + device = optarg; + break; default: usage(argv[0]); break; } } if (!tty) + tty = cc_usbdevs_find_by_arg(device, "TeleMetrum"); + if (!tty) tty = getenv("ALTOS_TTY"); if (!tty) tty="/dev/ttyACM0"; cc = cc_usb_open(tty); if (!cc) exit(1); - for (block = 0; block < NUM_BLOCK; block++) { + for (block = 0; block < NUM_BLOCK; block += 2) { cc_queue_read(cc, bytes, sizeof (bytes)); - cc_usb_printf(cc, "e %x\n", block); + cc_usb_printf(cc, "e %x\ne %x\n", block, block + 1); cc_usb_sync(cc); - for (i = 0; i < 32; i++) { + for (i = 0; i < 32 * 2; i++) { b = bytes + (i * 10); addr = block * 256 + i * 8; printf ("%06x", addr); |