Add manual pages for remaining commands.
[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         { 0, 0, 0, 0},
26 };
27
28 static void usage(char *program)
29 {
30         fprintf(stderr, "usage: %s [--tty <tty-name>] file.ihx\n", program);
31         exit(1);
32 }
33
34 int
35 main (int argc, char **argv)
36 {
37         struct ccdbg    *dbg;
38         uint8_t         status;
39         uint16_t        pc;
40         struct hex_file *hex;
41         struct hex_image *image;
42         char            *filename;
43         FILE            *file;
44         char            *tty = NULL;
45         int             c;
46
47         while ((c = getopt_long(argc, argv, "T:", options, NULL)) != -1) {
48                 switch (c) {
49                 case 'T':
50                         tty = optarg;
51                         break;
52                 default:
53                         usage(argv[0]);
54                         break;
55                 }
56         }
57         filename = argv[optind];
58         if (filename == NULL) {
59                 fprintf(stderr, "usage: %s <filename.ihx>\n", argv[0]);
60                 exit(1);
61         }
62         file = fopen(filename, "r");
63         if (!file) {
64                 perror(filename);
65                 exit(1);
66         }
67         hex = ccdbg_hex_file_read(file, filename);
68         fclose(file);
69         if (!hex)
70                 exit (1);
71         image = ccdbg_hex_image_create(hex);
72         if (!image) {
73                 fprintf(stderr, "image create failed\n");
74                 exit (1);
75         }
76
77         ccdbg_hex_file_free(hex);
78         dbg = ccdbg_open(tty);
79         if (!dbg)
80                 exit (1);
81
82         ccdbg_add_debug(CC_DEBUG_FLASH);
83
84         ccdbg_debug_mode(dbg);
85         ccdbg_halt(dbg);
86         if (image->address == 0xf000) {
87                 printf("Loading %d bytes to execute from RAM\n",
88                        image->length);
89                 ccdbg_write_hex_image(dbg, image, 0);
90         } else if (image->address == 0x0000) {
91                 printf("Loading %d bytes to execute from FLASH\n",
92                        image->length);
93                 ccdbg_flash_hex_image(dbg, image);
94         } else {
95                 printf("Cannot load code to 0x%04x\n",
96                        image->address);
97                 ccdbg_hex_image_free(image);
98                 ccdbg_close(dbg);
99                 exit(1);
100         }
101         ccdbg_set_pc(dbg, image->address);
102         ccdbg_resume(dbg);
103         ccdbg_close(dbg);
104         exit (0);
105 }