comparison loadtools/flmisc.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children 0dd2c87c1b63
comparison
equal deleted inserted replaced
-1:000000000000 0:e7502631a0f9
1 /*
2 * Miscellaneous flash commands (fc-loadtool) are implemented here
3 */
4
5 #include <sys/types.h>
6 #include <stdio.h>
7 #include <stdint.h>
8 #include <string.h>
9 #include <strings.h>
10 #include <stdlib.h>
11 #include "flash.h"
12
13 extern struct flash_bank_info flash_bank_info[2];
14
15 flashcmd_blankchk(argc, argv, bank)
16 char **argv;
17 {
18 struct flash_bank_info *bi;
19 u_long offset, len;
20 char *strtoul_endp;
21 char *targv[4], targ_start[10], targ_len[10];
22
23 if (argc != 4) {
24 inv: fprintf(stderr, "usage: %s %s hex-start-offset hex-length\n",
25 argv[0], argv[1]);
26 return(-1);
27 }
28 offset = strtoul(argv[2], &strtoul_endp, 16);
29 if (*strtoul_endp)
30 goto inv;
31 if (flash_get_cfi(bank) < 0)
32 return(-1);
33 bi = flash_bank_info + bank;
34 if (offset >= bi->geom->total_size) {
35 fprintf(stderr,
36 "error: specified offset exceeds flash bank size (0x%lx)\n",
37 (u_long) bi->geom->total_size);
38 return(-1);
39 }
40 len = strtoul(argv[3], &strtoul_endp, 16);
41 if (*strtoul_endp)
42 goto inv;
43 if (len > bi->geom->total_size - offset) {
44 fprintf(stderr,
45 "error: specified offset+length exceed flash bank size (0x%lx)\n",
46 (u_long) bi->geom->total_size);
47 return(-1);
48 }
49 /* reset flash to read mode */
50 if (bi->ops->reset_cmd(bi) < 0)
51 return(-1);
52 sprintf(targ_start, "%lx", (u_long) bi->base_addr + offset);
53 sprintf(targ_len, "%lx", len);
54 targv[0] = "blankchk";
55 targv[1] = targ_start;
56 targv[2] = targ_len;
57 targv[3] = 0;
58 tpinterf_make_cmd(targv);
59 if (tpinterf_send_cmd() < 0)
60 return(-1);
61 return tpinterf_pass_output(10); /* 10 s timeout */
62 }
63
64 flashcmd_dump2file(argc, argv, bank)
65 char **argv;
66 {
67 struct flash_bank_info *bi;
68 u_long offset, dumplen, maxlen;
69 char *strtoul_endp;
70 int format;
71
72 if (argc < 3 || argc > 5) {
73 inv: fprintf(stderr, "usage: %s %s outfile [offset [length]]\n",
74 argv[0], argv[1]);
75 return(-1);
76 }
77 if (flash_get_cfi(bank) < 0)
78 return(-1);
79 bi = flash_bank_info + bank;
80 if (argc >= 4) {
81 offset = strtoul(argv[3], &strtoul_endp, 16);
82 if (*strtoul_endp)
83 goto inv;
84 if (offset >= bi->geom->total_size) {
85 fprintf(stderr,
86 "error: specified offset exceeds flash bank size (0x%lx)\n",
87 (u_long) bi->geom->total_size);
88 return(-1);
89 }
90 } else
91 offset = 0;
92 maxlen = bi->geom->total_size - offset;
93 if (argc >= 5) {
94 dumplen = strtoul(argv[4], &strtoul_endp, 16);
95 if (*strtoul_endp)
96 goto inv;
97 if (dumplen > maxlen) {
98 fprintf(stderr,
99 "error: specified offset+length exceed flash bank size (0x%lx)\n",
100 (u_long) bi->geom->total_size);
101 return(-1);
102 }
103 } else
104 dumplen = maxlen;
105 switch (argv[1][5]) {
106 case 'b':
107 format = 0;
108 break;
109 case 's':
110 format = 1;
111 break;
112 default:
113 fprintf(stderr,
114 "internal bug: bad format in flashcmd_dump2file()\n");
115 return(-1);
116 }
117 /* reset flash to read mode */
118 if (bi->ops->reset_cmd(bi) < 0)
119 return(-1);
120 return loadtool_memdump(bi->base_addr + offset, dumplen, argv[2],
121 format);
122 }
123
124 flashcmd_erase(argc, argv, bank)
125 char **argv;
126 {
127 struct flash_bank_info *bi;
128 u_long offset, len;
129 char *strtoul_endp;
130 struct sector_info *startsec, *endsec, *sp;
131 int stat;
132
133 if (argc != 4) {
134 inv: fprintf(stderr, "usage: %s %s hex-start-offset hex-length\n",
135 argv[0], argv[1]);
136 return(-1);
137 }
138 offset = strtoul(argv[2], &strtoul_endp, 16);
139 if (*strtoul_endp)
140 goto inv;
141 if (flash_get_cfi(bank) < 0)
142 return(-1);
143 bi = flash_bank_info + bank;
144 if (offset >= bi->geom->total_size) {
145 fprintf(stderr,
146 "error: specified offset exceeds flash bank size (0x%lx)\n",
147 (u_long) bi->geom->total_size);
148 return(-1);
149 }
150 len = strtoul(argv[3], &strtoul_endp, 16);
151 if (*strtoul_endp)
152 goto inv;
153 if (len > bi->geom->total_size - offset) {
154 fprintf(stderr,
155 "error: specified offset+length exceed flash bank size (0x%lx)\n",
156 (u_long) bi->geom->total_size);
157 return(-1);
158 }
159 if (!len) {
160 printf("Zero length specified - nothing to do!\n");
161 return(0);
162 }
163 /* now enforce sector alignment for both offset and length */
164 if (get_flash_sector_table(bank) < 0)
165 return(-1);
166 if (get_flash_sector_range(bi, offset, len, &startsec, &endsec) < 0)
167 return(-1);
168 stat = flash_id_check(bank, 0);
169 if (stat)
170 return(stat);
171 printf("Erasing %d sector(s)\n", endsec - startsec);
172 for (sp = startsec; sp < endsec; sp++) {
173 stat = bi->ops->erase_sector(bi, sp);
174 if (stat)
175 return(stat);
176 putchar('.');
177 fflush(stdout);
178 }
179 putchar('\n');
180 return(0);
181 }
182
183 flashcmd_quickprog(argc, argv, bank)
184 char **argv;
185 {
186 struct flash_bank_info *bi;
187 char *targv[4], targ_base[10];
188 int stat;
189
190 if (argc != 4) {
191 fprintf(stderr, "usage: %s %s hex-offset hex-data-string\n",
192 argv[0], argv[1]);
193 return(-1);
194 }
195 if (flash_get_cfi(bank) < 0)
196 return(-1);
197 bi = flash_bank_info + bank;
198 sprintf(targ_base, "%lx", (u_long) bi->base_addr);
199 targv[0] = bi->ops->loadagent_setbase_cmd;
200 targv[1] = targ_base;
201 targv[2] = 0;
202 tpinterf_make_cmd(targv);
203 if (tpinterf_send_cmd() < 0)
204 return(-1);
205 stat = tpinterf_pass_output(1);
206 if (stat)
207 return(stat);
208 targv[0] = bi->ops->loadagent_program_cmd;
209 targv[1] = argv[2];
210 targv[2] = argv[3];
211 targv[3] = 0;
212 if (tpinterf_make_cmd(targv) < 0) {
213 fprintf(stderr,
214 "error: unable to form AMFW/INFW target command\n");
215 return(-1);
216 }
217 if (tpinterf_send_cmd() < 0)
218 return(-1);
219 return tpinterf_pass_output(1);
220 }
221
222 flashcmd_reset(argc, argv, bank)
223 char **argv;
224 {
225 struct flash_bank_info *bi;
226
227 if (argc > 2) {
228 fprintf(stderr, "error: too many arguments\n");
229 return(-1);
230 }
231 if (flash_get_cfi(bank) < 0)
232 return(-1);
233 bi = flash_bank_info + bank;
234 return bi->ops->reset_cmd(bi);
235 }
236
237 flashcmd_status(argc, argv, bank)
238 char **argv;
239 {
240 struct flash_bank_info *bi;
241
242 if (argc > 2) {
243 fprintf(stderr, "error: too many arguments\n");
244 return(-1);
245 }
246 if (flash_get_cfi(bank) < 0)
247 return(-1);
248 bi = flash_bank_info + bank;
249 return bi->ops->status_cmd(bi);
250 }
251
252 flashcmd_unlock(argc, argv, bank)
253 char **argv;
254 {
255 struct flash_bank_info *bi;
256 u_long offset, len;
257 char *strtoul_endp;
258 struct sector_info *startsec, *endsec, *sp;
259 int stat;
260
261 if (flash_get_cfi(bank) < 0)
262 return(-1);
263 bi = flash_bank_info + bank;
264 if (!bi->ops->needs_unlock) {
265 fprintf(stderr,
266 "This operation is not applicable to the selected flash type\n");
267 return(-1);
268 }
269 if (argc != 4) {
270 inv: fprintf(stderr, "usage: %s %s hex-start-offset hex-length\n",
271 argv[0], argv[1]);
272 return(-1);
273 }
274 offset = strtoul(argv[2], &strtoul_endp, 16);
275 if (*strtoul_endp)
276 goto inv;
277 if (offset >= bi->geom->total_size) {
278 fprintf(stderr,
279 "error: specified offset exceeds flash bank size (0x%lx)\n",
280 (u_long) bi->geom->total_size);
281 return(-1);
282 }
283 len = strtoul(argv[3], &strtoul_endp, 16);
284 if (*strtoul_endp)
285 goto inv;
286 if (len > bi->geom->total_size - offset) {
287 fprintf(stderr,
288 "error: specified offset+length exceed flash bank size (0x%lx)\n",
289 (u_long) bi->geom->total_size);
290 return(-1);
291 }
292 if (!len) {
293 printf("Zero length specified - nothing to do!\n");
294 return(0);
295 }
296 /* now enforce sector alignment for both offset and length */
297 if (get_flash_sector_table(bank) < 0)
298 return(-1);
299 if (get_flash_sector_range(bi, offset, len, &startsec, &endsec) < 0)
300 return(-1);
301 printf("Unlocking %d sector(s)\n", endsec - startsec);
302 for (sp = startsec; sp < endsec; sp++) {
303 stat = bi->ops->unlock_sector(bi, sp);
304 if (stat)
305 return(stat);
306 putchar('.');
307 fflush(stdout);
308 }
309 putchar('\n');
310 return(0);
311 }