Merge branch 'master' of git://git.denx.de/u-boot-cfi-flash

* 'master' of git://git.denx.de/u-boot-cfi-flash:
  cfi: Make the flash erase and write operations abortable
  cfi: Check for blank before erase

Signed-off-by: Wolfgang Denk <wd@denx.de>
This commit is contained in:
Wolfgang Denk 2012-09-03 21:22:12 +02:00
commit f499131867
4 changed files with 43 additions and 1 deletions

View File

@ -443,7 +443,8 @@ int flash_sect_erase (ulong addr_first, ulong addr_last)
rcode = flash_erase (info, s_first[bank], s_last[bank]); rcode = flash_erase (info, s_first[bank], s_last[bank]);
} }
} }
printf ("Erased %d sectors\n", erased); if (rcode == 0)
printf("Erased %d sectors\n", erased);
} else if (rcode == 0) { } else if (rcode == 0) {
puts ("Error: start and/or end address" puts ("Error: start and/or end address"
" not on sector boundary\n"); " not on sector boundary\n");

View File

@ -221,6 +221,9 @@ void flash_perror (int err)
case ERR_PROG_ERROR: case ERR_PROG_ERROR:
puts ("General Flash Programming Error\n"); puts ("General Flash Programming Error\n");
break; break;
case ERR_ABORTED:
puts("Flash Programming Aborted\n");
break;
default: default:
printf ("%s[%d] FIXME: rc=%d\n", __FILE__, __LINE__, err); printf ("%s[%d] FIXME: rc=%d\n", __FILE__, __LINE__, err);
break; break;

View File

@ -1077,7 +1077,38 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)
for (sect = s_first; sect <= s_last; sect++) { for (sect = s_first; sect <= s_last; sect++) {
if (ctrlc()) {
printf("\n");
return 1;
}
if (info->protect[sect] == 0) { /* not protected */ if (info->protect[sect] == 0) { /* not protected */
#ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE
int k;
int size;
int erased;
u32 *flash;
/*
* Check if whole sector is erased
*/
size = flash_sector_size(info, sect);
erased = 1;
flash = (u32 *)info->start[sect];
/* divide by 4 for longword access */
size = size >> 2;
for (k = 0; k < size; k++) {
if (flash_read32(flash++) != 0xffffffff) {
erased = 0;
break;
}
}
if (erased) {
if (flash_verbose)
putc(',');
continue;
}
#endif
switch (info->vendor) { switch (info->vendor) {
case CFI_CMDSET_INTEL_PROG_REGIONS: case CFI_CMDSET_INTEL_PROG_REGIONS:
case CFI_CMDSET_INTEL_STANDARD: case CFI_CMDSET_INTEL_STANDARD:
@ -1353,6 +1384,9 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
src += i; src += i;
cnt -= i; cnt -= i;
FLASH_SHOW_PROGRESS(scale, dots, digit, i); FLASH_SHOW_PROGRESS(scale, dots, digit, i);
/* Only check every once in a while */
if ((cnt & 0xFFFF) < buffered_size && ctrlc())
return ERR_ABORTED;
} }
#else #else
while (cnt >= info->portwidth) { while (cnt >= info->portwidth) {
@ -1365,6 +1399,9 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
wp += info->portwidth; wp += info->portwidth;
cnt -= info->portwidth; cnt -= info->portwidth;
FLASH_SHOW_PROGRESS(scale, dots, digit, info->portwidth); FLASH_SHOW_PROGRESS(scale, dots, digit, info->portwidth);
/* Only check every once in a while */
if ((cnt & 0xFFFF) < info->portwidth && ctrlc())
return ERR_ABORTED;
} }
#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */ #endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */

View File

@ -141,6 +141,7 @@ extern flash_info_t *flash_get_info(ulong base);
#define ERR_UNKNOWN_FLASH_VENDOR 32 #define ERR_UNKNOWN_FLASH_VENDOR 32
#define ERR_UNKNOWN_FLASH_TYPE 64 #define ERR_UNKNOWN_FLASH_TYPE 64
#define ERR_PROG_ERROR 128 #define ERR_PROG_ERROR 128
#define ERR_ABORTED 256
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
* Protection Flags for flash_protect(): * Protection Flags for flash_protect():