FreeCalypso > hg > freecalypso-tools
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 } |