comparison packages/redboot/current/src/flash.c @ 1312:08edfb52f9cd

Improve FIS directory handling - should work with small block size devices
author gthomas
date Wed, 15 Oct 2003 15:52:02 +0000
parents 25b536d4b2bc
children 4444f5b3be7b
comparison
equal deleted inserted replaced
1311:e3df0ec06a22 1312:08edfb52f9cd
461 (void **)&show_cksums, (bool *)0, "display checksums"); 461 (void **)&show_cksums, (bool *)0, "display checksums");
462 i = 2; 462 i = 2;
463 #else 463 #else
464 i = 1; 464 i = 1;
465 #endif 465 #endif
466 if (!scan_opts(argc, argv, 2, opts, i, 0, 0, "")) 466 if (!scan_opts(argc, argv, 2, opts, i, 0, 0, "")) {
467 {
468 return; 467 return;
469 } 468 }
470 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr); 469 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
471 // Let diag_printf do the formatting in both cases, rather than counting 470 // Let diag_printf do the formatting in both cases, rather than counting
472 // cols by hand.... 471 // cols by hand....
1313 { 1312 {
1314 int stat; 1313 int stat;
1315 void *err_addr; 1314 void *err_addr;
1316 1315
1317 if (!__flash_init) { 1316 if (!__flash_init) {
1317 __flash_init = 1;
1318 if ((stat = flash_init((void *)(workspace_end-FLASH_MIN_WORKSPACE), 1318 if ((stat = flash_init((void *)(workspace_end-FLASH_MIN_WORKSPACE),
1319 FLASH_MIN_WORKSPACE, diag_printf)) != 0) { 1319 FLASH_MIN_WORKSPACE, diag_printf)) != 0) {
1320 diag_printf("FLASH: driver init failed: %s\n", flash_errmsg(stat)); 1320 diag_printf("FLASH: driver init failed: %s\n", flash_errmsg(stat));
1321 return false; 1321 return false;
1322 } 1322 }
1324 // Keep 'end' address as last valid location, to avoid wrap around problems 1324 // Keep 'end' address as last valid location, to avoid wrap around problems
1325 flash_end = (void *)((CYG_ADDRESS)flash_end - 1); 1325 flash_end = (void *)((CYG_ADDRESS)flash_end - 1);
1326 flash_get_block_info(&flash_block_size, &flash_num_blocks); 1326 flash_get_block_info(&flash_block_size, &flash_num_blocks);
1327 workspace_end = (unsigned char *)(workspace_end-FLASH_MIN_WORKSPACE); 1327 workspace_end = (unsigned char *)(workspace_end-FLASH_MIN_WORKSPACE);
1328 #ifdef CYGOPT_REDBOOT_FIS 1328 #ifdef CYGOPT_REDBOOT_FIS
1329 fisdir_size = CYGNUM_REDBOOT_FIS_DIRECTORY_ENTRY_COUNT * CYGNUM_REDBOOT_FIS_DIRECTORY_ENTRY_SIZE;
1330 fisdir_size = ((fisdir_size + flash_block_size - 1) / flash_block_size) * flash_block_size;
1329 # ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER 1331 # ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER
1330 fis_work_block = fis_zlib_common_buffer; 1332 fis_work_block = fis_zlib_common_buffer;
1331 if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < flash_block_size) { 1333 if(CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE < fisdir_size) {
1332 diag_printf("FLASH: common buffer too small\n"); 1334 diag_printf("FLASH: common buffer too small\n");
1333 workspace_end += FLASH_MIN_WORKSPACE; 1335 workspace_end += FLASH_MIN_WORKSPACE;
1334 return false; 1336 return false;
1335 } 1337 }
1336 # else 1338 # else
1337 workspace_end = (unsigned char *)(workspace_end-flash_block_size); 1339 workspace_end = (unsigned char *)(workspace_end-fisdir_size);
1338 fis_work_block = workspace_end; 1340 fis_work_block = workspace_end;
1339 # endif 1341 # endif
1340 fisdir_size = flash_block_size;
1341 if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) { 1342 if (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK < 0) {
1342 fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 + 1343 fis_addr = (void *)((CYG_ADDRESS)flash_end + 1 +
1343 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); 1344 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
1344 } else { 1345 } else {
1345 fis_addr = (void *)((CYG_ADDRESS)flash_start + 1346 fis_addr = (void *)((CYG_ADDRESS)flash_start +
1346 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size)); 1347 (CYGNUM_REDBOOT_FIS_DIRECTORY_BLOCK*flash_block_size));
1347 } 1348 }
1349 if (((CYG_ADDRESS)fis_addr + fisdir_size - 1) > (CYG_ADDRESS)flash_end) {
1350 diag_printf("FIS directory doesn't fit\n");
1351 return false;
1352 }
1348 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr); 1353 flash_read(fis_addr, fis_work_block, fisdir_size, (void **)&err_addr);
1349 #endif 1354 #endif
1350 __flash_init = 1;
1351 } 1355 }
1352 return true; 1356 return true;
1353 } 1357 }
1354 1358
1355 // Wrapper to avoid compiler warnings 1359 // Wrapper to avoid compiler warnings