summaryrefslogtreecommitdiff
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
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>
-rw-r--r--ao-tools/Makefile.am2
-rw-r--r--ao-tools/ao-eeprom/ao-eeprom.c20
-rw-r--r--ao-tools/lib/cc-usb.c12
-rw-r--r--ao-tools/lib/cc-usb.h2
4 files changed, 25 insertions, 11 deletions
diff --git a/ao-tools/Makefile.am b/ao-tools/Makefile.am
index 02b4785e..28e77b08 100644
--- a/ao-tools/Makefile.am
+++ b/ao-tools/Makefile.am
@@ -1 +1 @@
-SUBDIRS=lib ao-rawload ao-dbg ao-bitbang ao-eeprom ao-load ao-view
+SUBDIRS=lib ao-rawload ao-dbg ao-bitbang ao-eeprom ao-list ao-load ao-view
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);
diff --git a/ao-tools/lib/cc-usb.c b/ao-tools/lib/cc-usb.c
index 81309983..17f05911 100644
--- a/ao-tools/lib/cc-usb.c
+++ b/ao-tools/lib/cc-usb.c
@@ -157,7 +157,8 @@ cc_usb_dbg(int indent, uint8_t *bytes, int len)
/*
* Flush pending writes, fill pending reads
*/
-void
+
+int
cc_usb_sync(struct cc_usb *cc)
{
int ret;
@@ -167,7 +168,7 @@ cc_usb_sync(struct cc_usb *cc)
fds.fd = cc->fd;
for (;;) {
if (cc->read_count || cc->out_count)
- timeout = -1;
+ timeout = 5000;
else
timeout = 0;
fds.events = 0;
@@ -176,8 +177,13 @@ cc_usb_sync(struct cc_usb *cc)
if (cc->out_count)
fds.events |= POLLOUT;
ret = poll(&fds, 1, timeout);
- if (ret == 0)
+ if (ret == 0) {
+ if (timeout) {
+ fprintf(stderr, "USB link timeout\n");
+ exit(1);
+ }
break;
+ }
if (ret < 0) {
perror("poll");
break;
diff --git a/ao-tools/lib/cc-usb.h b/ao-tools/lib/cc-usb.h
index d7acfbd2..9baabd95 100644
--- a/ao-tools/lib/cc-usb.h
+++ b/ao-tools/lib/cc-usb.h
@@ -47,7 +47,7 @@ cc_usb_debug_mode(struct cc_usb *cc);
int
cc_usb_reset(struct cc_usb *cc);
-void
+int
cc_usb_sync(struct cc_usb *cc);
void