Add flash writing code.
[fw/altos] / ccdbg.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 "ccdbg.h"
20
21 #if 1
22 static uint8_t instructions[] = {
23         3, MOV_direct_data, 0xfe, 0x02,
24         3, MOV_direct_data, 0x90, 0xff,
25         0
26 };
27 #endif
28
29 static uint8_t mem_instr[] = {
30         MOV_direct_data, 0xfe, 0x02,
31         MOV_Rn_data(0), 0x00,
32         MOV_Rn_data(1), 0x00,
33         MOV_direct_data, 0x90, 0xff,
34         MOV_Rn_data(2), 0x10,
35         DJNZ_Rn_rel(1), 0xfe,
36         DJNZ_Rn_rel(0), 0xfc,
37         DJNZ_Rn_rel(2), 0xfa,
38         MOV_direct_data, 0x90, 0xfd,
39         MOV_Rn_data(2), 0x10,
40         DJNZ_Rn_rel(1), 0xfe,
41         DJNZ_Rn_rel(0), 0xfc,
42         DJNZ_Rn_rel(2), 0xfa,
43         SJMP, 0xe7,
44 };
45
46 static struct hex_image *
47 make_hex_image(uint16_t addr, uint8_t *data, uint16_t length)
48 {
49         struct hex_image        *image;
50
51         image = malloc(sizeof (struct hex_image) + length);
52         image->address = addr;
53         image->length = length;
54         memcpy(image->data, data, length);
55         return image;
56 }
57
58 int
59 main (int argc, char **argv)
60 {
61         struct ccdbg    *dbg;
62         uint8_t         status;
63         uint16_t        chip_id;
64         uint16_t        pc;
65         struct hex_file *hex;
66         struct hex_image *image;
67
68         dbg = ccdbg_open("/dev/ttyUSB0");
69         if (!dbg)
70                 exit (1);
71 #if 0
72         ccdbg_manual(dbg, stdin);
73 #endif
74 #if 1
75         hex = ccdbg_hex_file_read(stdin, "<stdin>");
76         if (!hex)
77                 exit (1);
78         image = ccdbg_hex_image_create(hex);
79         ccdbg_hex_file_free(hex);
80 #else
81         image = make_hex_image(0xf000, mem_instr, sizeof (mem_instr));
82 #endif
83         
84         ccdbg_reset(dbg);
85         ccdbg_debug_mode(dbg);
86         ccdbg_halt(dbg);
87         
88 #if 1
89         if (!image) {
90                 fprintf(stderr, "image create failed\n");
91                 exit (1);
92         }
93         if (image->address == 0xf000) {
94                 printf("Loading code to execute from RAM\n");
95                 ccdbg_execute_hex_image(dbg, image);
96         } else if (image->address == 0x0000) {
97                 printf("Loading code to execute from FLASH\n");
98                 ccdbg_flash_hex_image(dbg, image);
99                 ccdbg_set_pc(dbg, 0);
100                 ccdbg_resume(dbg);
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 #endif
109         for (;;) {
110                 pc = ccdbg_get_pc(dbg);
111                 status = ccdbg_read_status(dbg);
112                 printf("pc: 0x%04x.  status: 0x%02x\n", pc, status);
113         }
114 #if 0
115 /*      ccdbg_execute(dbg, instructions); */
116         ccdbg_write_memory(dbg, 0xf000, mem_instr, sizeof (mem_instr));
117         ccdbg_read_memory(dbg, 0xf000, memory, sizeof (memory));
118 #endif
119         ccdbg_close(dbg);
120         exit (0);
121 }