diff options
Diffstat (limited to 'ao-tools')
| -rwxr-xr-x[-rw-r--r--] | ao-tools/ao-flash/ao-flash-lpc | 9 | ||||
| -rw-r--r-- | ao-tools/ao-load/ao-load.c | 2 | ||||
| -rw-r--r-- | ao-tools/ao-telem/ao-telem.c | 3 | ||||
| -rw-r--r-- | ao-tools/ao-usbload/ao-usbload.c | 28 | ||||
| -rw-r--r-- | ao-tools/lib/ao-editaltos.c | 26 | ||||
| -rw-r--r-- | ao-tools/lib/ao-hex.h | 1 | ||||
| -rw-r--r-- | ao-tools/lib/cc-telemetry.h | 2 | ||||
| -rw-r--r-- | ao-tools/lib/cc-usb.c | 60 | ||||
| -rw-r--r-- | ao-tools/lib/cc-usb.h | 3 |
9 files changed, 108 insertions, 26 deletions
diff --git a/ao-tools/ao-flash/ao-flash-lpc b/ao-tools/ao-flash/ao-flash-lpc index 57f632b4..7ac5b523 100644..100755 --- a/ao-tools/ao-flash/ao-flash-lpc +++ b/ao-tools/ao-flash/ao-flash-lpc @@ -7,15 +7,10 @@ case "$#" in esac cmds=/tmp/flash$$ trap "rm $cmds" 0 1 15 -for file in "$@"; do - echo "flash write_image $file" -done > $cmds +file="$1" +echo "program $file verify reset" > $cmds openocd \ -f interface/stlink-v2.cfg \ -f target/lpc11u14.cfg \ - -c init \ - -c 'reset halt' \ -f $cmds \ - -c 'reset init' \ - -c 'reset run' \ -c shutdown diff --git a/ao-tools/ao-load/ao-load.c b/ao-tools/ao-load/ao-load.c index c1f55149..0cf03772 100644 --- a/ao-tools/ao-load/ao-load.c +++ b/ao-tools/ao-load/ao-load.c @@ -26,7 +26,7 @@ #define AO_USB_DESC_STRING 3 -struct sym { +static struct sym { unsigned addr; char *name; int required; diff --git a/ao-tools/ao-telem/ao-telem.c b/ao-tools/ao-telem/ao-telem.c index f1755b82..da873838 100644 --- a/ao-tools/ao-telem/ao-telem.c +++ b/ao-tools/ao-telem/ao-telem.c @@ -158,7 +158,8 @@ main (int argc, char **argv) printf ("\n"); break; case AO_TELEMETRY_MEGA_SENSOR: - printf ("accel %5d pres %9d temp %5d accel_x %5d accel_y %5d accel_z %5d gyro_x %5d gyro_y %5d gyro_z %5d mag_x %5d mag_y %5d mag_z %5d\n", + printf ("orient %3d accel %5d pres %9d temp %5d accel_x %5d accel_y %5d accel_z %5d gyro_x %5d gyro_y %5d gyro_z %5d mag_x %5d mag_y %5d mag_z %5d\n", + telem.mega_sensor.orient, telem.mega_sensor.accel, telem.mega_sensor.pres, telem.mega_sensor.temp, diff --git a/ao-tools/ao-usbload/ao-usbload.c b/ao-tools/ao-usbload/ao-usbload.c index 0c8a23df..fd34fbdc 100644 --- a/ao-tools/ao-usbload/ao-usbload.c +++ b/ao-tools/ao-usbload/ao-usbload.c @@ -142,6 +142,8 @@ main (int argc, char **argv) int verbose = 0; struct ao_sym *file_symbols; int num_file_symbols; + uint32_t flash_base, flash_bound; + int has_flash_size = 0; while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) { switch (c) { @@ -222,6 +224,14 @@ main (int argc, char **argv) cc_usb_getline(cc, line, sizeof(line)); if (!strncmp(line, "altos-loader", 12)) is_loader = 1; + if (!strncmp(line, "flash-range", 11)) { + int i; + for (i = 11; i < strlen(line); i++) + if (line[i] != ' ') + break; + if (sscanf(line + i, "%x %x", &flash_base, &flash_bound) == 2) + has_flash_size = 1; + } if (!strncmp(line, "software-version", 16)) break; } @@ -262,6 +272,22 @@ main (int argc, char **argv) #endif } + /* If the device can tell us the size of flash, make sure + * the image fits in that + */ + if (has_flash_size) { + if (load->address < flash_base || + load->address + load->length > flash_bound) + { + fprintf(stderr, "Image does not fit on device.\n"); + fprintf(stderr, " Image base: %08x bounds %08x\n", + load->address, load->address + load->length); + fprintf(stderr, " Device base: %08x bounds %08x\n", + flash_base, flash_bound); + done(cc, 1); + } + } + if (!raw) { /* Go fetch existing config values * if available @@ -295,7 +321,7 @@ main (int argc, char **argv) /* And flash the resulting image to the device */ success = ao_self_write(cc, load); - + if (!success) { fprintf (stderr, "\"%s\": Write failed\n", filename); done(cc, 1); diff --git a/ao-tools/lib/ao-editaltos.c b/ao-tools/lib/ao-editaltos.c index a8b64098..7547c82c 100644 --- a/ao-tools/lib/ao-editaltos.c +++ b/ao-tools/lib/ao-editaltos.c @@ -20,12 +20,26 @@ #include "ao-editaltos.h" struct ao_sym ao_symbols[] = { - - { 0, 0, "ao_romconfig_version", 1 }, - { 0, 0, "ao_romconfig_check", 1 }, - { 0, 0, "ao_serial_number", 1 }, - { 0, 0, "ao_radio_cal", 0 }, - { 0, 0, "ao_usb_descriptors", 0 }, + { + .name = "ao_romconfig_version", + .required = 1 + }, + { + .name = "ao_romconfig_check", + .required = 1 + }, + { + .name = "ao_serial_number", + .required = 1 + }, + { + .name = "ao_radio_cal", + .required = 0 + }, + { + .name = "ao_usb_descriptors", + .required = 0 + }, }; #define NUM_SYMBOLS 5 diff --git a/ao-tools/lib/ao-hex.h b/ao-tools/lib/ao-hex.h index 98497460..eb510ba2 100644 --- a/ao-tools/lib/ao-hex.h +++ b/ao-tools/lib/ao-hex.h @@ -51,7 +51,6 @@ struct ao_hex_image { struct ao_sym { unsigned addr; - unsigned default_addr; char *name; bool required; bool found; diff --git a/ao-tools/lib/cc-telemetry.h b/ao-tools/lib/cc-telemetry.h index c28aceb8..d64c4b30 100644 --- a/ao-tools/lib/cc-telemetry.h +++ b/ao-tools/lib/cc-telemetry.h @@ -157,7 +157,7 @@ struct ao_telemetry_mega_sensor { uint16_t tick; /* 2 */ uint8_t type; /* 4 */ - uint8_t pad5; /* 5 */ + uint8_t orient; /* 5 angle from vertical */ int16_t accel; /* 6 Z axis */ int32_t pres; /* 8 Pa * 10 */ diff --git a/ao-tools/lib/cc-usb.c b/ao-tools/lib/cc-usb.c index d7ac138c..38dfff04 100644 --- a/ao-tools/lib/cc-usb.c +++ b/ao-tools/lib/cc-usb.c @@ -53,6 +53,7 @@ struct cc_usb { struct cc_hex_read hex_buf[CC_NUM_HEX_READ]; int hex_count; + int show_input; int remote; }; @@ -156,7 +157,7 @@ cc_usb_dbg(int indent, uint8_t *bytes, int len) */ static int -_cc_usb_sync(struct cc_usb *cc, int wait_for_input) +_cc_usb_sync(struct cc_usb *cc, int wait_for_input, int write_timeout) { int ret; struct pollfd fds; @@ -165,7 +166,7 @@ _cc_usb_sync(struct cc_usb *cc, int wait_for_input) fds.fd = cc->fd; for (;;) { if (cc->hex_count || cc->out_count) - timeout = 5000; + timeout = write_timeout; else if (wait_for_input && cc->in_pos == cc->in_count) timeout = wait_for_input; else @@ -200,6 +201,10 @@ _cc_usb_sync(struct cc_usb *cc, int wait_for_input) cc->in_count += ret; if (cc->hex_count) cc_handle_hex_read(cc); + if (cc->show_input && cc->in_count) { + write(2, cc->in_buf, cc->in_count); + cc->in_count = 0; + } } else if (ret < 0) perror("read"); } @@ -222,7 +227,7 @@ _cc_usb_sync(struct cc_usb *cc, int wait_for_input) void cc_usb_sync(struct cc_usb *cc) { - if (_cc_usb_sync(cc, 0) < 0) { + if (_cc_usb_sync(cc, 0, 5000) < 0) { fprintf(stderr, "USB link timeout\n"); exit(1); } @@ -263,7 +268,7 @@ int cc_usb_getchar_timeout(struct cc_usb *cc, int timeout) { while (cc->in_pos == cc->in_count) { - if (_cc_usb_sync(cc, timeout) < 0) { + if (_cc_usb_sync(cc, timeout, 5000) < 0) { fprintf(stderr, "USB link timeout\n"); exit(1); } @@ -395,7 +400,7 @@ cc_usb_open_remote(struct cc_usb *cc, int freq, char *call) cc_usb_printf(cc, "\nc F %d\nc c %s\np\nE 0\n", freq, call); do { cc->in_count = cc->in_pos = 0; - _cc_usb_sync(cc, 100); + _cc_usb_sync(cc, 100, 5000); } while (cc->in_count > 0); cc->remote = 1; } @@ -412,19 +417,35 @@ cc_usb_close_remote(struct cc_usb *cc) static struct termios save_termios; +#include <errno.h> + struct cc_usb * cc_usb_open(char *tty) { struct cc_usb *cc; struct termios termios; + int i; if (!tty) tty = DEFAULT_TTY; cc = calloc (sizeof (struct cc_usb), 1); if (!cc) return NULL; - cc->fd = open(tty, O_RDWR | O_NONBLOCK); - if (cc->fd < 0) { + i = 0; + for (;;) { + cc->fd = open(tty, O_RDWR | O_NONBLOCK); + if (cc->fd >= 0) + break; + i++; + if (errno == EBUSY || errno == EPERM || errno == EACCES) { + fprintf(stderr, "open failed, pausing"); + perror(tty); + if (i < 20) { + sleep(3); + continue; + } + } + perror(tty); free (cc); return NULL; @@ -438,7 +459,7 @@ cc_usb_open(char *tty) cc_usb_printf(cc, "\nE 0\nm 0\n"); do { cc->in_count = cc->in_pos = 0; - _cc_usb_sync(cc, 100); + _cc_usb_sync(cc, 100, 5000); } while (cc->in_count > 0); return cc; } @@ -452,3 +473,26 @@ cc_usb_close(struct cc_usb *cc) close (cc->fd); free (cc); } + +int +cc_usb_write(struct cc_usb *cc, void *buf, int c) +{ + uint8_t *b; + int this_time; + + b = buf; + cc->show_input = 1; + while (c > 0) { + this_time = c; + if (this_time > CC_OUT_BUF - cc->out_count) + this_time = CC_OUT_BUF - cc->out_count; + memcpy(cc->out_buf + cc->out_count, b, this_time); + cc->out_count += this_time; + c -= this_time; + b += this_time; + while (cc->out_count >= CC_OUT_BUF) { + _cc_usb_sync(cc, 0, -1); + } + } + return 1; +} diff --git a/ao-tools/lib/cc-usb.h b/ao-tools/lib/cc-usb.h index f1193456..e08a956b 100644 --- a/ao-tools/lib/cc-usb.h +++ b/ao-tools/lib/cc-usb.h @@ -65,6 +65,9 @@ cc_usb_getline(struct cc_usb *cc, char *line, int max); void cc_usb_printf(struct cc_usb *cc, char *format, ...); +int +cc_usb_write(struct cc_usb *cc, void *buf, int c); + void cc_usb_open_remote(struct cc_usb *cc, int freq, char *call); |
