|
@@ -1179,6 +1179,22 @@ void flash_print_info (flash_info_t * info)
|
|
return;
|
|
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:
|
|
* Copy memory to flash, returns:
|
|
* 0 - OK
|
|
* 0 - OK
|
|
@@ -1192,10 +1208,23 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
int aln;
|
|
int aln;
|
|
cfiword_t cword;
|
|
cfiword_t cword;
|
|
int i, rc;
|
|
int i, rc;
|
|
-
|
|
|
|
#ifdef CFG_FLASH_USE_BUFFER_WRITE
|
|
#ifdef CFG_FLASH_USE_BUFFER_WRITE
|
|
int buffered_size;
|
|
int buffered_size;
|
|
#endif
|
|
#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 */
|
|
/* get lower aligned address */
|
|
wp = (addr & ~(info->portwidth - 1));
|
|
wp = (addr & ~(info->portwidth - 1));
|
|
|
|
|
|
@@ -1219,6 +1248,10 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
return rc;
|
|
return rc;
|
|
|
|
|
|
wp += i;
|
|
wp += i;
|
|
|
|
+#ifdef CONFIG_FLASH_SHOW_PROGRESS
|
|
|
|
+ dots -= i;
|
|
|
|
+ FLASH_SHOW_PROGRESS(scale, dots, digit);
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
|
|
/* handle the aligned part */
|
|
/* handle the aligned part */
|
|
@@ -1248,6 +1281,10 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
wp += i;
|
|
wp += i;
|
|
src += i;
|
|
src += i;
|
|
cnt -= i;
|
|
cnt -= i;
|
|
|
|
+#ifdef CONFIG_FLASH_SHOW_PROGRESS
|
|
|
|
+ dots -= i;
|
|
|
|
+ FLASH_SHOW_PROGRESS(scale, dots, digit);
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
while (cnt >= info->portwidth) {
|
|
while (cnt >= info->portwidth) {
|
|
@@ -1259,8 +1296,13 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
return rc;
|
|
return rc;
|
|
wp += info->portwidth;
|
|
wp += info->portwidth;
|
|
cnt -= 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 */
|
|
#endif /* CFG_FLASH_USE_BUFFER_WRITE */
|
|
|
|
+
|
|
if (cnt == 0) {
|
|
if (cnt == 0) {
|
|
return (0);
|
|
return (0);
|
|
}
|
|
}
|