Flash programming progress countdown.

Signed-off-by: Gerald Van Baren <vanbaren@cideas.com>
This commit is contained in:
Jerry Van Baren 2008-03-08 13:48:01 -05:00 committed by Stefan Roese
parent 23e20aa648
commit 9a042e9ca5
2 changed files with 48 additions and 1 deletions

5
README
View File

@ -1946,6 +1946,11 @@ Configuration Settings:
is useful, if some of the configured banks are only
optionally available.
- CONFIG_FLASH_SHOW_PROGRESS
If defined (must be an integer), print out countdown
digits and dots. Recommended value: 45 (9..1) for 80
column displays, 15 (3..1) for 40 column displays.
- CFG_RX_ETH_BUFFER:
Defines the number of ethernet receive buffers. On some
ethernet controllers it is recommended to set this value

View File

@ -1179,6 +1179,22 @@ void flash_print_info (flash_info_t * info)
return;
}
/*-----------------------------------------------------------------------
* This is used in a few places in write_buf() to show programming
* progress. Making it a function is nasty because it needs to do side
* effect updates to digit and dots. Repeated code is nasty too, so
* we define it once here.
*/
#define FLASH_SHOW_PROGRESS(scale, dots, digit) \
if ((scale > 0) && (dots <= 0)) { \
if ((digit % 5) == 0) \
printf ("%d", digit / 5); \
else \
putc ('.'); \
digit--; \
dots += scale; \
}
/*-----------------------------------------------------------------------
* Copy memory to flash, returns:
* 0 - OK
@ -1192,10 +1208,23 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
int aln;
cfiword_t cword;
int i, rc;
#ifdef CFG_FLASH_USE_BUFFER_WRITE
int buffered_size;
#endif
#ifdef CONFIG_FLASH_SHOW_PROGRESS
int digit = CONFIG_FLASH_SHOW_PROGRESS;
int scale = 0;
int dots = 0;
/*
* Suppress if there are fewer than CONFIG_FLASH_SHOW_PROGRESS writes.
*/
if (cnt >= CONFIG_FLASH_SHOW_PROGRESS) {
scale = (int)((cnt + CONFIG_FLASH_SHOW_PROGRESS - 1) /
CONFIG_FLASH_SHOW_PROGRESS);
}
#endif
/* get lower aligned address */
wp = (addr & ~(info->portwidth - 1));
@ -1219,6 +1248,10 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
return rc;
wp += i;
#ifdef CONFIG_FLASH_SHOW_PROGRESS
dots -= i;
FLASH_SHOW_PROGRESS(scale, dots, digit);
#endif
}
/* handle the aligned part */
@ -1248,6 +1281,10 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
wp += i;
src += i;
cnt -= i;
#ifdef CONFIG_FLASH_SHOW_PROGRESS
dots -= i;
FLASH_SHOW_PROGRESS(scale, dots, digit);
#endif
}
#else
while (cnt >= info->portwidth) {
@ -1259,8 +1296,13 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
return rc;
wp += info->portwidth;
cnt -= info->portwidth;
#ifdef CONFIG_FLASH_SHOW_PROGRESS
dots -= info->portwidth;
FLASH_SHOW_PROGRESS(scale, dots, digit);
#endif
}
#endif /* CFG_FLASH_USE_BUFFER_WRITE */
if (cnt == 0) {
return (0);
}