From 7c790fe859dff062692964338091ffbbcdf63257 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 18 Aug 2009 12:40:24 -0700 Subject: Rename tools to ao- Use a consistent prefix to make it easier to remember which programs belong to this package Signed-off-by: Keith Packard --- ao-tools/ao-load/ao-load.c | 231 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 ao-tools/ao-load/ao-load.c (limited to 'ao-tools/ao-load/ao-load.c') diff --git a/ao-tools/ao-load/ao-load.c b/ao-tools/ao-load/ao-load.c new file mode 100644 index 00000000..b84a88a6 --- /dev/null +++ b/ao-tools/ao-load/ao-load.c @@ -0,0 +1,231 @@ +/* + * Copyright © 2008 Keith Packard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include +#include +#include +#include "ccdbg.h" + +#define AO_USB_DESC_STRING 3 + +void +usage(char *program) +{ + fprintf(stderr, "usage: %s \n", program); + exit(1); +} + +struct sym { + unsigned addr; + char *name; +} serial_symbols[] = { + { 0, "_ao_serial_number" }, +#define AO_SERIAL_NUMBER (serial_symbols[0].addr) + { 0, "_ao_usb_descriptors" }, +#define AO_USB_DESCRIPTORS (serial_symbols[1].addr) +}; + +#define NUM_SERIAL_SYMBOLS (sizeof(serial_symbols)/sizeof(serial_symbols[0])) + +static int +find_symbols(FILE *map) +{ + char line[2048]; + char *addr, *addr_end; + char *name; + char *save; + char *colon; + unsigned long a; + int s; + int found = 0; + + while (fgets(line, sizeof(line), map) != NULL) { + line[sizeof(line)-1] = '\0'; + addr = strtok_r(line, " \t\n", &save); + if (!addr) + continue; + name = strtok_r(NULL, " \t\n", &save); + if (!name) + continue; + colon = strchr (addr, ':'); + if (!colon) + continue; + 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; + ++found; + break; + } + } + return found == NUM_SERIAL_SYMBOLS; +} + +static int +rewrite(struct hex_image *image, unsigned addr, char *data, int len) +{ + int i; + if (addr < image->address || image->address + image->length < addr + len) + return 0; + printf("rewrite %04x:", addr); + for (i = 0; i < len; i++) + printf (" %02x", image->data[addr - image->address + i]); + printf(" ->"); + for (i = 0; i < len; i++) + printf (" %02x", data[i]); + printf("\n"); + memcpy(image->data + addr - image->address, data, len); +} + +int +main (int argc, char **argv) +{ + struct ccdbg *dbg; + uint8_t status; + uint16_t pc; + struct hex_file *hex; + struct hex_image *image; + char *filename; + FILE *file; + FILE *map; + char *serial_string; + unsigned int serial; + char *mapname, *dot; + char *serial_ucs2; + int serial_ucs2_len; + char serial_int[2]; + unsigned int s; + int i; + unsigned usb_descriptors; + int string_num; + + filename = argv[1]; + if (filename == NULL) + usage(argv[0]); + mapname = strdup(filename); + dot = strrchr(mapname, '.'); + if (!dot || strcmp(dot, ".ihx") != 0) + usage(argv[0]); + strcpy(dot, ".map"); + + serial_string = argv[2]; + if (serial_string == NULL) + usage(argv[0]); + + file = fopen(filename, "r"); + if (!file) { + perror(filename); + exit(1); + } + map = fopen(mapname, "r"); + if (!map) { + perror(mapname); + exit(1); + } + if (!find_symbols(map)) { + fprintf(stderr, "Cannot find symbols in \"%s\"\n", mapname); + exit(1); + } + fclose(map); + + hex = ccdbg_hex_file_read(file, filename); + fclose(file); + if (!hex) { + perror(filename); + exit (1); + } + image = ccdbg_hex_image_create(hex); + if (!image) { + fprintf(stderr, "image create failed\n"); + exit (1); + } + ccdbg_hex_file_free(hex); + + serial = strtoul(serial_string, NULL, 0); + if (!serial) + usage(argv[0]); + + serial_int[0] = serial & 0xff; + serial_int[1] = (serial >> 8) & 0xff; + + if (!rewrite(image, AO_SERIAL_NUMBER, serial_int, sizeof (serial_int))) { + fprintf(stderr, "Cannot rewrite serial integer at %04x\n", + AO_SERIAL_NUMBER); + exit(1); + } + + usb_descriptors = AO_USB_DESCRIPTORS - image->address; + string_num = 0; + while (image->data[usb_descriptors] != 0 && usb_descriptors < image->length) { + if (image->data[usb_descriptors+1] == AO_USB_DESC_STRING) { + ++string_num; + if (string_num == 4) + break; + } + usb_descriptors += image->data[usb_descriptors]; + } + if (usb_descriptors >= image->length || image->data[usb_descriptors] == 0 ) { + fprintf(stderr, "Cannot rewrite serial string at %04x\n", AO_USB_DESCRIPTORS); + exit(1); + } + + serial_ucs2_len = image->data[usb_descriptors] - 2; + serial_ucs2 = malloc(serial_ucs2_len); + if (!serial_ucs2) { + fprintf(stderr, "Malloc(%d) failed\n", serial_ucs2_len); + exit(1); + } + s = serial; + for (i = serial_ucs2_len / 2; i; i--) { + serial_ucs2[i * 2 - 1] = 0; + serial_ucs2[i * 2 - 2] = (s % 10) + '0'; + s /= 10; + } + if (!rewrite(image, usb_descriptors + 2 + image->address, serial_ucs2, serial_ucs2_len)) + usage(argv[0]); + + dbg = ccdbg_open(); + if (!dbg) + exit (1); + + ccdbg_add_debug(CC_DEBUG_FLASH); + + ccdbg_debug_mode(dbg); + ccdbg_halt(dbg); + if (image->address == 0xf000) { + printf("Loading %d bytes to execute from RAM\n", + image->length); + ccdbg_write_hex_image(dbg, image, 0); + } else if (image->address == 0x0000) { + printf("Loading %d bytes to execute from FLASH\n", + image->length); + ccdbg_flash_hex_image(dbg, image); + } else { + printf("Cannot load code to 0x%04x\n", + image->address); + ccdbg_hex_image_free(image); + ccdbg_close(dbg); + exit(1); + } + ccdbg_set_pc(dbg, image->address); + ccdbg_resume(dbg); + ccdbg_close(dbg); + exit (0); +} -- cgit v1.2.3 From 9b03d620722dc54630539afba40720c30de69b2d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 18 Aug 2009 12:19:31 -0700 Subject: Use --tty/-T on command line to specify target device Also, use the ALTOS_TTY environment variable in all tools. Note that the magic value of "BITBANG" switches the library to connecting through a CP2103 instead. Signed-off-by: Keith Packard --- .gitignore | 1 + ao-tools/ao-bitbang/ao-bitbang.c | 2 +- ao-tools/ao-dbg/ao-dbg-main.c | 12 ++++++++- ao-tools/ao-dbg/ao-dbg-parse.c | 6 ++--- ao-tools/ao-dbg/ao-dbg.1 | 4 +++ ao-tools/ao-dbg/ao-dbg.h | 1 + ao-tools/ao-eeprom/ao-eeprom.c | 33 ++++++++++++++++++++++-- ao-tools/ao-load/ao-load.c | 54 ++++++++++++++++++++++++++-------------- ao-tools/ao-rawload/ao-rawload.c | 33 +++++++++++++++++++++--- ao-tools/lib/ccdbg-io.c | 19 +++++++++----- ao-tools/lib/ccdbg.h | 2 +- ao-tools/lib/cp-usb-async.c | 1 + ao-view/aoview.glade | 1 - ao-view/aoview.h | 4 +++ ao-view/aoview_main.c | 16 ++++++++---- 15 files changed, 146 insertions(+), 43 deletions(-) (limited to 'ao-tools/ao-load/ao-load.c') diff --git a/.gitignore b/.gitignore index 8b83dd3f..b3d2d562 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ *.rst *.sym .deps +TAGS aclocal.m4 src/ao_flight_test src/ao_gps_test diff --git a/ao-tools/ao-bitbang/ao-bitbang.c b/ao-tools/ao-bitbang/ao-bitbang.c index 7090c9a3..e8dff6bf 100644 --- a/ao-tools/ao-bitbang/ao-bitbang.c +++ b/ao-tools/ao-bitbang/ao-bitbang.c @@ -23,7 +23,7 @@ main (int argc, char **argv) { struct ccdbg *dbg; - dbg = ccdbg_open(); + dbg = ccdbg_open("BITBANG"); if (!dbg) exit (1); diff --git a/ao-tools/ao-dbg/ao-dbg-main.c b/ao-tools/ao-dbg/ao-dbg-main.c index 72249a6b..f1e2c111 100644 --- a/ao-tools/ao-dbg/ao-dbg-main.c +++ b/ao-tools/ao-dbg/ao-dbg-main.c @@ -24,6 +24,7 @@ #include #include #include +#include static int s51_port = 0; static char *cpu = "8051"; @@ -32,6 +33,7 @@ char *s51_prompt = "> "; struct ccdbg *s51_dbg; int s51_interrupted = 0; int s51_monitor = 0; +char *s51_tty = NULL; static FILE *s51_input; static FILE *s51_output; @@ -48,6 +50,11 @@ void s51_sigint() s51_interrupted = 1; } +static const struct option options[] = { + { .name = "tty", .has_arg = 1, .val = 'T' }, + { 0, 0, 0, 0 }, +}; + int main(int argc, char **argv) { @@ -55,7 +62,7 @@ main(int argc, char **argv) char *endptr; struct sigvec vec, ovec; - while ((opt = getopt(argc, argv, "PVvHhmt:X:c:r:Z:s:S:p:")) != -1) { + while ((opt = getopt_long(argc, argv, "PVvHhmt:X:c:r:Z:s:S:p:T:", options, NULL)) != -1) { switch (opt) { case 't': cpu = optarg; @@ -104,6 +111,9 @@ main(int argc, char **argv) case 'm': s51_monitor = 1; break; + case 'T': + s51_tty = optarg; + break; } } if (s51_port) { diff --git a/ao-tools/ao-dbg/ao-dbg-parse.c b/ao-tools/ao-dbg/ao-dbg-parse.c index 5db6c01c..825d0e9c 100644 --- a/ao-tools/ao-dbg/ao-dbg-parse.c +++ b/ao-tools/ao-dbg/ao-dbg-parse.c @@ -195,11 +195,9 @@ command_read (void) enum command_result result; struct command_function *func; - s51_dbg = ccdbg_open (); - if (!s51_dbg) { - perror("ccdbg_open"); + s51_dbg = ccdbg_open (s51_tty); + if (!s51_dbg) exit(1); - } ccdbg_debug_mode(s51_dbg); ccdbg_halt(s51_dbg); s51_printf("Welcome to the non-simulated processor\n"); diff --git a/ao-tools/ao-dbg/ao-dbg.1 b/ao-tools/ao-dbg/ao-dbg.1 index f2f59a52..1f544e5b 100644 --- a/ao-tools/ao-dbg/ao-dbg.1 +++ b/ao-tools/ao-dbg/ao-dbg.1 @@ -34,6 +34,7 @@ s51 \- hex debugger for cc1111 processors [\-H] [\-h] [\-m] +[\-T \fItty-device\fP] .SH DESCRIPTION .I s51 connects to a cc1111 processor through a cp1203-based USB-to-serial @@ -78,6 +79,9 @@ This should print a usage message, but does nothing useful currently. .IP "\-m" This option is not present in the original 8051 emulator, and causes s51 to dump all commands and replies that are received from and sent to sdcdb. +.IP "\-T" +This selects which tty device the debugger uses to communicate with +the target device. .SH COMMANDS Once started, s51 connects to the cc1111 via the CP2103 using libusb2 and then reads and executes commands, either from stdin, or the nework diff --git a/ao-tools/ao-dbg/ao-dbg.h b/ao-tools/ao-dbg/ao-dbg.h index f4dcce66..c1789d10 100644 --- a/ao-tools/ao-dbg/ao-dbg.h +++ b/ao-tools/ao-dbg/ao-dbg.h @@ -22,6 +22,7 @@ extern char *s51_prompt; extern struct ccdbg *s51_dbg; extern int s51_interrupted; extern int s51_monitor; +extern char *s51_tty; enum command_result { command_success, command_debug, command_syntax, command_interrupt, command_error, diff --git a/ao-tools/ao-eeprom/ao-eeprom.c b/ao-tools/ao-eeprom/ao-eeprom.c index 399732d9..726cc22c 100644 --- a/ao-tools/ao-eeprom/ao-eeprom.c +++ b/ao-tools/ao-eeprom/ao-eeprom.c @@ -18,10 +18,23 @@ #include #include +#include +#include #include "cc-usb.h" #define NUM_BLOCK 512 +static const struct option options[] = { + { .name = "tty", .has_arg = 1, .val = 'T' }, + { 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ + fprintf(stderr, "usage: %s [--tty ]\n", program); + exit(1); +} + int main (int argc, char **argv) { @@ -31,10 +44,26 @@ main (int argc, char **argv) uint8_t *b; int i, j; uint32_t addr; - char *tty; + char *tty = NULL; + int c; - tty = getenv("CCDBG_TTY"); + while ((c = getopt_long(argc, argv, "T:", options, NULL)) != -1) { + switch (c) { + case 'T': + tty = optarg; + break; + default: + usage(argv[0]); + break; + } + } + 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++) { cc_queue_read(cc, bytes, sizeof (bytes)); cc_usb_printf(cc, "e %x\n", block); diff --git a/ao-tools/ao-load/ao-load.c b/ao-tools/ao-load/ao-load.c index b84a88a6..c27fcbe9 100644 --- a/ao-tools/ao-load/ao-load.c +++ b/ao-tools/ao-load/ao-load.c @@ -19,17 +19,12 @@ #include #include #include +#include +#include #include "ccdbg.h" #define AO_USB_DESC_STRING 3 -void -usage(char *program) -{ - fprintf(stderr, "usage: %s \n", program); - exit(1); -} - struct sym { unsigned addr; char *name; @@ -94,6 +89,17 @@ rewrite(struct hex_image *image, unsigned addr, char *data, int len) memcpy(image->data + addr - image->address, data, len); } +static const struct option options[] = { + { .name = "tty", .has_arg = 1, .val = 'T' }, + { 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ + fprintf(stderr, "usage: %s [--tty ] file.ihx serial-number\n", program); + exit(1); +} + int main (int argc, char **argv) { @@ -102,12 +108,12 @@ main (int argc, char **argv) uint16_t pc; struct hex_file *hex; struct hex_image *image; - char *filename; - FILE *file; - FILE *map; - char *serial_string; - unsigned int serial; - char *mapname, *dot; + char *filename; + FILE *file; + FILE *map; + char *serial_string; + unsigned int serial; + char *mapname, *dot; char *serial_ucs2; int serial_ucs2_len; char serial_int[2]; @@ -115,8 +121,20 @@ main (int argc, char **argv) int i; unsigned usb_descriptors; int string_num; - - filename = argv[1]; + char *tty = NULL; + int c; + + while ((c = getopt_long(argc, argv, "T:", options, NULL)) != -1) { + switch (c) { + case 'T': + tty = optarg; + break; + default: + usage(argv[0]); + break; + } + } + filename = argv[optind]; if (filename == NULL) usage(argv[0]); mapname = strdup(filename); @@ -125,7 +143,7 @@ main (int argc, char **argv) usage(argv[0]); strcpy(dot, ".map"); - serial_string = argv[2]; + serial_string = argv[optind + 1]; if (serial_string == NULL) usage(argv[0]); @@ -160,7 +178,7 @@ main (int argc, char **argv) serial = strtoul(serial_string, NULL, 0); if (!serial) - usage(argv[0]); +(argv[0]); serial_int[0] = serial & 0xff; serial_int[1] = (serial >> 8) & 0xff; @@ -201,7 +219,7 @@ main (int argc, char **argv) if (!rewrite(image, usb_descriptors + 2 + image->address, serial_ucs2, serial_ucs2_len)) usage(argv[0]); - dbg = ccdbg_open(); + dbg = ccdbg_open(tty); if (!dbg) exit (1); diff --git a/ao-tools/ao-rawload/ao-rawload.c b/ao-tools/ao-rawload/ao-rawload.c index 5f7708fd..1f1537b9 100644 --- a/ao-tools/ao-rawload/ao-rawload.c +++ b/ao-tools/ao-rawload/ao-rawload.c @@ -16,8 +16,21 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include +#include #include "ccdbg.h" +static const struct option options[] = { + { .name = "tty", .has_arg = 1, .val = 'T' }, + { 0, 0, 0, 0}, +}; + +static void usage(char *program) +{ + fprintf(stderr, "usage: %s [--tty ] file.ihx\n", program); + exit(1); +} + int main (int argc, char **argv) { @@ -26,10 +39,22 @@ main (int argc, char **argv) uint16_t pc; struct hex_file *hex; struct hex_image *image; - char *filename; - FILE *file; + char *filename; + FILE *file; + char *tty = NULL; + int c; - filename = argv[1]; + while ((c = getopt_long(argc, argv, "T:", options, NULL)) != -1) { + switch (c) { + case 'T': + tty = optarg; + break; + default: + usage(argv[0]); + break; + } + } + filename = argv[optind]; if (filename == NULL) { fprintf(stderr, "usage: %s \n", argv[0]); exit(1); @@ -50,7 +75,7 @@ main (int argc, char **argv) } ccdbg_hex_file_free(hex); - dbg = ccdbg_open(); + dbg = ccdbg_open(tty); if (!dbg) exit (1); diff --git a/ao-tools/lib/ccdbg-io.c b/ao-tools/lib/ccdbg-io.c index 9c6693cd..d3f87274 100644 --- a/ao-tools/lib/ccdbg-io.c +++ b/ao-tools/lib/ccdbg-io.c @@ -22,25 +22,32 @@ #include "cc-bitbang.h" struct ccdbg * -ccdbg_open(void) +ccdbg_open(char *tty) { struct ccdbg *dbg; - char *tty; dbg = calloc(sizeof (struct ccdbg), 1); if (!dbg) { perror("calloc"); return NULL; } - tty = getenv("CCDBG_TTY"); - if (!tty || tty[0] == '/') - dbg->usb = cc_usb_open(tty); - if (!dbg->usb) { + if (!tty) + tty = getenv("ALTOS_TTY"); + if (!tty) + tty="/dev/ttyACM0"; + + if (!strcmp(tty, "BITBANG")) { dbg->bb = cc_bitbang_open(); if (!dbg->bb) { free(dbg); return NULL; } + } else { + dbg->usb = cc_usb_open(tty); + if (!dbg->usb) { + free(dbg); + return NULL; + } } return dbg; } diff --git a/ao-tools/lib/ccdbg.h b/ao-tools/lib/ccdbg.h index 4a2e3b9f..ca596143 100644 --- a/ao-tools/lib/ccdbg.h +++ b/ao-tools/lib/ccdbg.h @@ -258,7 +258,7 @@ ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b); /* ccdbg-io.c */ struct ccdbg * -ccdbg_open(void); +ccdbg_open(char *tty); void ccdbg_close(struct ccdbg *dbg); diff --git a/ao-tools/lib/cp-usb-async.c b/ao-tools/lib/cp-usb-async.c index 6539394b..3e75b507 100644 --- a/ao-tools/lib/cp-usb-async.c +++ b/ao-tools/lib/cp-usb-async.c @@ -60,6 +60,7 @@ cp_usb_async_open(void) 0x10c4, 0xea60); cp->ack = -1; if (!cp->handle) { + fprintf(stderr, "Cannot find USB device 10c4:ea60\n"); libusb_exit(cp->ctx); free(cp); return NULL; diff --git a/ao-view/aoview.glade b/ao-view/aoview.glade index df08b83c..3481a779 100644 --- a/ao-view/aoview.glade +++ b/ao-view/aoview.glade @@ -651,7 +651,6 @@ You should have received a copy of the GNU General Public License along with AoV normal True aoview - False close Saving EEPROM data as <filename> diff --git a/ao-view/aoview.h b/ao-view/aoview.h index 62d0640b..e8334e5b 100644 --- a/ao-view/aoview.h +++ b/ao-view/aoview.h @@ -308,4 +308,8 @@ aoview_flite_start(void); void aoview_flite_stop(void); +/* aoview_main.c */ + +extern char *aoview_tty; + #endif /* _AOVIEW_H_ */ diff --git a/ao-view/aoview_main.c b/ao-view/aoview_main.c index 36a82e0e..64c1c027 100644 --- a/ao-view/aoview_main.c +++ b/ao-view/aoview_main.c @@ -32,29 +32,29 @@ static void destroy_event(GtkWidget *widget, gpointer data) } extern int _Xdebug; +char *aoview_tty = NULL; int main(int argc, char **argv) { GladeXML *xml = NULL; GtkWidget *mainwindow; - char *device = NULL; GtkAboutDialog *about_dialog; static struct option long_options[] = { - { "device", 1, 0, 'd'}, + { "tty", 1, 0, 'T'}, { "sync", 0, 0, 's'}, { 0, 0, 0, 0 } }; for (;;) { int c, temp; - c = getopt_long_only(argc, argv, "sd:", long_options, &temp); + c = getopt_long_only(argc, argv, "sT:", long_options, &temp); if (c == -1) break; switch (c) { - case 'd': - device = optarg; + case 'T': + aoview_tty = optarg; break; case 's': _Xdebug = 1; @@ -102,6 +102,12 @@ int main(int argc, char **argv) aoview_label_init(xml); + if (aoview_tty) { + if (!aoview_monitor_connect(aoview_tty)) { + perror(aoview_tty); + exit(1); + } + } aoview_voice_speak("rocket flight monitor ready\n"); gtk_main(); -- cgit v1.2.3