FreeCalypso > hg > freecalypso-sw
comparison loadtools/flmisc.c @ 409:23ab8fe81764
Intel flash: unlock command implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Tue, 17 Jun 2014 03:18:02 +0000 |
parents | 431023033c86 |
children | 81d387690063 |
comparison
equal
deleted
inserted
replaced
408:431023033c86 | 409:23ab8fe81764 |
---|---|
246 if (flash_get_cfi(bank) < 0) | 246 if (flash_get_cfi(bank) < 0) |
247 return(-1); | 247 return(-1); |
248 bi = flash_bank_info + bank; | 248 bi = flash_bank_info + bank; |
249 return bi->ops->status_cmd(bi); | 249 return bi->ops->status_cmd(bi); |
250 } | 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 } |