summaryrefslogtreecommitdiff
path: root/ao-tools
diff options
context:
space:
mode:
Diffstat (limited to 'ao-tools')
-rwxr-xr-x[-rw-r--r--]ao-tools/ao-flash/ao-flash-lpc9
-rw-r--r--ao-tools/ao-load/ao-load.c2
-rw-r--r--ao-tools/ao-telem/ao-telem.c3
-rw-r--r--ao-tools/ao-usbload/ao-usbload.c28
-rw-r--r--ao-tools/lib/ao-editaltos.c26
-rw-r--r--ao-tools/lib/ao-hex.h1
-rw-r--r--ao-tools/lib/cc-telemetry.h2
-rw-r--r--ao-tools/lib/cc-usb.c60
-rw-r--r--ao-tools/lib/cc-usb.h3
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);