summaryrefslogtreecommitdiff
path: root/ao-tools/ao-eeprom/ao-eeprom.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-09-04 15:01:32 -0700
committerKeith Packard <keithp@keithp.com>2009-09-04 15:01:32 -0700
commit332b056459b1352e233a8bf5f08498df12d32160 (patch)
tree092c78a014572920ac8d382f4a6d41033fd7b9f5 /ao-tools/ao-eeprom/ao-eeprom.c
parentdf88ae4c5f229efcc0ea5cb0a81fc2bb8f96fea2 (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.c20
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);