summaryrefslogtreecommitdiff
path: root/ao-tools
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-12-05 19:50:38 -0800
committerKeith Packard <keithp@keithp.com>2009-12-05 19:50:38 -0800
commit5481082b18226a0de6b377215b3b330bdbc4a6c6 (patch)
tree5943ca5d792ca05df48366f5039ee0d81d261467 /ao-tools
parent46f03ab3145a61139c8ca6fc99e8f2798728b5a9 (diff)
Allow radio calibration to be set from ao-load
This moves the initial radio calibration value into const memory where it will be used if no eeprom configuration value is available, either on an unprogrammed board with eeprom or a device without an eeprom. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools')
-rw-r--r--ao-tools/ao-load/ao-load.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/ao-tools/ao-load/ao-load.c b/ao-tools/ao-load/ao-load.c
index f5466612..4aa91b29 100644
--- a/ao-tools/ao-load/ao-load.c
+++ b/ao-tools/ao-load/ao-load.c
@@ -29,14 +29,17 @@
struct sym {
unsigned addr;
char *name;
-} serial_symbols[] = {
+} ao_symbols[] = {
{ 0, "_ao_serial_number" },
-#define AO_SERIAL_NUMBER (serial_symbols[0].addr)
+#define AO_SERIAL_NUMBER (ao_symbols[0].addr)
{ 0, "_ao_usb_descriptors" },
-#define AO_USB_DESCRIPTORS (serial_symbols[1].addr)
+#define AO_USB_DESCRIPTORS (ao_symbols[1].addr)
+ { 0, "_ao_radio_cal" },
+#define AO_RADIO_CAL (ao_symbols[2].addr)
};
-#define NUM_SERIAL_SYMBOLS (sizeof(serial_symbols)/sizeof(serial_symbols[0]))
+#define NUM_SERIAL_SYMBOLS 2
+#define NUM_SYMBOLS 3
static int
find_symbols(FILE *map)
@@ -64,14 +67,14 @@ find_symbols(FILE *map)
a = strtoul(colon+1, &addr_end, 16);
if (a == ULONG_MAX || addr_end == addr)
continue;
- for (s = 0; s < NUM_SERIAL_SYMBOLS; s++)
- if (!strcmp(serial_symbols[s].name, name)) {
- serial_symbols[s].addr = (unsigned) a;
+ for (s = 0; s < NUM_SYMBOLS; s++)
+ if (!strcmp(ao_symbols[s].name, name)) {
+ ao_symbols[s].addr = (unsigned) a;
++found;
break;
}
}
- return found == NUM_SERIAL_SYMBOLS;
+ return found >= NUM_SERIAL_SYMBOLS;
}
static int
@@ -93,12 +96,13 @@ rewrite(struct hex_image *image, unsigned addr, char *data, int len)
static const struct option options[] = {
{ .name = "tty", .has_arg = 1, .val = 'T' },
{ .name = "device", .has_arg = 1, .val = 'D' },
+ { .name = "cal", .has_arg = 1, .val = 'c' },
{ 0, 0, 0, 0},
};
static void usage(char *program)
{
- fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] file.ihx serial-number\n", program);
+ fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] [--cal <radio-cal>] file.ihx serial-number\n", program);
exit(1);
}
@@ -125,9 +129,12 @@ main (int argc, char **argv)
int string_num;
char *tty = NULL;
char *device = NULL;
+ uint32_t cal = 0;
+ char cal_int[4];
+ char *cal_end;
int c;
- while ((c = getopt_long(argc, argv, "T:D:", options, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "T:D:c:", options, NULL)) != -1) {
switch (c) {
case 'T':
tty = optarg;
@@ -135,6 +142,11 @@ main (int argc, char **argv)
case 'D':
device = optarg;
break;
+ case 'c':
+ cal = strtoul(optarg, &cal_end, 10);
+ if (cal_end == optarg || *cal_end != '\0')
+ usage(argv[0]);
+ break;
default:
usage(argv[0]);
break;
@@ -225,6 +237,20 @@ main (int argc, char **argv)
if (!rewrite(image, usb_descriptors + 2 + image->address, serial_ucs2, serial_ucs2_len))
usage(argv[0]);
+ if (cal) {
+ cal_int[0] = cal & 0xff;
+ cal_int[1] = (cal >> 8) & 0xff;
+ cal_int[2] = (cal >> 16) & 0xff;
+ cal_int[3] = (cal >> 24) & 0xff;
+ if (!AO_RADIO_CAL) {
+ fprintf(stderr, "Cannot find radio calibration location in image\n");
+ exit(1);
+ }
+ if (!rewrite(image, AO_RADIO_CAL, cal_int, sizeof (cal_int))) {
+ fprintf(stderr, "Cannot rewrite radio calibration at %04x\n", AO_RADIO_CAL);
+ exit(1);
+ }
+ }
if (!tty)
tty = cc_usbdevs_find_by_arg(device, "TIDongle");
dbg = ccdbg_open(tty);