ao_rawload: Don't reset after we finish loading
[fw/altos] / ao-tools / ao-rawload / ao-rawload.c
1 /*
2  * Copyright © 2008 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #include <unistd.h>
20 #include <getopt.h>
21 #include "ccdbg.h"
22
23 static const struct option options[] = {
24         { .name = "tty", .has_arg = 1, .val = 'T' },
25         { .name = "device", .has_arg = 1, .val = 'D' },
26         { 0, 0, 0, 0},
27 };
28
29 static void usage(char *program)
30 {
31         fprintf(stderr, "usage: %s [--tty <tty-name>] [--device <device-name>] file.ihx\n", program);
32         exit(1);
33 }
34
35 int
36 main (int argc, char **argv)
37 {
38         struct ccdbg    *dbg;
39         uint8_t         status;
40         uint16_t        pc;
41         struct hex_file *hex;
42         struct hex_image *image;
43         char            *filename;
44         FILE            *file;
45         char            *tty = NULL;
46         char            *device = NULL;
47         int             c;
48
49         while ((c = getopt_long(argc, argv, "T:D:", options, NULL)) != -1) {
50                 switch (c) {
51                 case 'T':
52                         tty = optarg;
53                         break;
54                 case 'D':
55                         device = optarg;
56                         break;
57                 default:
58                         usage(argv[0]);
59                         break;
60                 }
61         }
62         filename = argv[optind];
63         if (filename == NULL) {
64                 fprintf(stderr, "usage: %s <filename.ihx>\n", argv[0]);
65                 exit(1);
66         }
67         file = fopen(filename, "r");
68         if (!file) {
69                 perror(filename);
70                 exit(1);
71         }
72         hex = ccdbg_hex_file_read(file, filename);
73         fclose(file);
74         if (!hex)
75                 exit (1);
76         image = ccdbg_hex_image_create(hex);
77         if (!image) {
78                 fprintf(stderr, "image create failed\n");
79                 exit (1);
80         }
81
82         ccdbg_hex_file_free(hex);
83         if (!tty)
84                 tty = cc_usbdevs_find_by_arg(device, "TIDongle");
85         dbg = ccdbg_open(tty);
86         if (!dbg)
87                 exit (1);
88
89         ccdbg_add_debug(CC_DEBUG_FLASH);
90
91         ccdbg_debug_mode(dbg);
92         ccdbg_halt(dbg);
93         if (image->address == 0xf000) {
94                 printf("Loading %d bytes to execute from RAM\n",
95                        image->length);
96                 ccdbg_write_hex_image(dbg, image, 0);
97         } else if (image->address == 0x0000) {
98                 printf("Loading %d bytes to execute from FLASH\n",
99                        image->length);
100                 ccdbg_flash_hex_image(dbg, image);
101         } else {
102                 printf("Cannot load code to 0x%04x\n",
103                        image->address);
104                 ccdbg_hex_image_free(image);
105                 ccdbg_close(dbg);
106                 exit(1);
107         }
108         ccdbg_close(dbg);
109         exit (0);
110 }