Mercurial > ecos
comparison packages/redboot/current/src/flash.c @ 2130:9a0cafc8b9bf
* src/flash.c (fis_lock & fis_unlock): Allow compilation without
FIS being enabled.
* src/flash.c (fis_update_directory): When reading/writing flash
use the full size of the fis directory, not just one block.
| author | asl |
|---|---|
| date | Sun, 19 Feb 2006 17:11:31 +0000 |
| parents | 5d5572c64422 |
| children | 55e180a14a91 |
comparison
equal
deleted
inserted
replaced
| 2129:8eb72dcf503a | 2130:9a0cafc8b9bf |
|---|---|
| 253 memcpy((char *)fis_work_block+fisdir_size, config, cfg_size); | 253 memcpy((char *)fis_work_block+fisdir_size, config, cfg_size); |
| 254 conf_endian_fixup((char *)fis_work_block+fisdir_size); | 254 conf_endian_fixup((char *)fis_work_block+fisdir_size); |
| 255 #endif | 255 #endif |
| 256 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL | 256 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL |
| 257 // Ensure [quietly] that the directory is unlocked before trying to update | 257 // Ensure [quietly] that the directory is unlocked before trying to update |
| 258 flash_unlock((void *)fis_addr, flash_block_size, (void **)&err_addr); | 258 flash_unlock((void *)fis_addr, fisdir_size, (void **)&err_addr); |
| 259 #endif | 259 #endif |
| 260 if ((stat = flash_erase(fis_addr, flash_block_size, (void **)&err_addr)) != 0) { | 260 if ((stat = flash_erase(fis_addr, fisdir_size, (void **)&err_addr)) != 0) { |
| 261 diag_printf("Error erasing FIS directory at %p: %s\n", err_addr, flash_errmsg(stat)); | 261 diag_printf("Error erasing FIS directory at %p: %s\n", err_addr, flash_errmsg(stat)); |
| 262 } else { | 262 } else { |
| 263 if ((stat = FLASH_PROGRAM(fis_addr, fis_work_block, | 263 if ((stat = FLASH_PROGRAM(fis_addr, fis_work_block, |
| 264 flash_block_size, (void **)&err_addr)) != 0) { | 264 fisdir_size, (void **)&err_addr)) != 0) { |
| 265 diag_printf("Error writing FIS directory at %p: %s\n", | 265 diag_printf("Error writing FIS directory at %p: %s\n", |
| 266 err_addr, flash_errmsg(stat)); | 266 err_addr, flash_errmsg(stat)); |
| 267 } | 267 } |
| 268 } | 268 } |
| 269 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL | 269 #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL |
| 270 // Ensure [quietly] that the directory is locked after the update | 270 // Ensure [quietly] that the directory is locked after the update |
| 271 flash_lock((void *)fis_addr, flash_block_size, (void **)&err_addr); | 271 flash_lock((void *)fis_addr, fisdir_size, (void **)&err_addr); |
| 272 #endif | 272 #endif |
| 273 fis_endian_fixup(fis_work_block); | 273 fis_endian_fixup(fis_work_block); |
| 274 } | 274 } |
| 275 | 275 |
| 276 static void | 276 static void |
| 1271 if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name")) | 1271 if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name")) |
| 1272 { | 1272 { |
| 1273 fis_usage("invalid arguments"); | 1273 fis_usage("invalid arguments"); |
| 1274 return; | 1274 return; |
| 1275 } | 1275 } |
| 1276 | 1276 #ifdef CYGOPT_REDBOOT_FIS |
| 1277 /* Get parameters from image if specified */ | 1277 /* Get parameters from image if specified */ |
| 1278 if (name) { | 1278 if (name) { |
| 1279 struct fis_image_desc *img; | 1279 struct fis_image_desc *img; |
| 1280 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) { | 1280 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) { |
| 1281 diag_printf("No image '%s' found\n", name); | 1281 diag_printf("No image '%s' found\n", name); |
| 1282 return; | 1282 return; |
| 1283 } | 1283 } |
| 1284 | 1284 |
| 1285 flash_addr = img->flash_base; | 1285 flash_addr = img->flash_base; |
| 1286 length = img->size; | 1286 length = img->size; |
| 1287 } else if (!flash_addr_set || !length_set) { | 1287 } else |
| 1288 #endif | |
| 1289 if (!flash_addr_set || !length_set) { | |
| 1288 fis_usage("missing argument"); | 1290 fis_usage("missing argument"); |
| 1289 return; | 1291 return; |
| 1290 } | 1292 } |
| 1291 if (flash_addr_set && | 1293 if (flash_addr_set && |
| 1292 ((stat = flash_verify_addr((void *)flash_addr)) || | 1294 ((stat = flash_verify_addr((void *)flash_addr)) || |
| 1318 if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name")) | 1320 if (!scan_opts(argc, argv, 2, opts, 2, &name, OPTION_ARG_TYPE_STR, "image name")) |
| 1319 { | 1321 { |
| 1320 fis_usage("invalid arguments"); | 1322 fis_usage("invalid arguments"); |
| 1321 return; | 1323 return; |
| 1322 } | 1324 } |
| 1323 | 1325 #ifdef CYGOPT_REDBOOT_FIS |
| 1324 if (name) { | 1326 if (name) { |
| 1325 struct fis_image_desc *img; | 1327 struct fis_image_desc *img; |
| 1326 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) { | 1328 if ((img = fis_lookup(name, NULL)) == (struct fis_image_desc *)0) { |
| 1327 diag_printf("No image '%s' found\n", name); | 1329 diag_printf("No image '%s' found\n", name); |
| 1328 return; | 1330 return; |
| 1329 } | 1331 } |
| 1330 | 1332 |
| 1331 flash_addr = img->flash_base; | 1333 flash_addr = img->flash_base; |
| 1332 length = img->size; | 1334 length = img->size; |
| 1333 } else if (!flash_addr_set || !length_set) { | 1335 } else |
| 1336 #endif | |
| 1337 if (!flash_addr_set || !length_set) { | |
| 1334 fis_usage("missing argument"); | 1338 fis_usage("missing argument"); |
| 1335 return; | 1339 return; |
| 1336 } | 1340 } |
| 1337 if (flash_addr_set && | 1341 if (flash_addr_set && |
| 1338 ((stat = flash_verify_addr((void *)flash_addr)) || | 1342 ((stat = flash_verify_addr((void *)flash_addr)) || |
| 1391 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); | 1395 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); |
| 1392 } else { | 1396 } else { |
| 1393 fis_addr = (void *)((CYG_ADDRESS)flash_start + | 1397 fis_addr = (void *)((CYG_ADDRESS)flash_start + |
| 1394 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); | 1398 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); |
| 1395 } | 1399 } |
| 1400 | |
| 1396 if (((CYG_ADDRESS)fis_addr + fisdir_size - 1) > (CYG_ADDRESS)flash_end) { | 1401 if (((CYG_ADDRESS)fis_addr + fisdir_size - 1) > (CYG_ADDRESS)flash_end) { |
| 1397 diag_printf("FIS directory doesn't fit\n"); | 1402 diag_printf("FIS directory doesn't fit\n"); |
| 1398 return false; | 1403 return false; |
| 1399 } | 1404 } |
| 1400 fis_read_directory(); | 1405 fis_read_directory(); |
