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();