Mercurial > flash_v2
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 |
