Flash programming progress countdown.
authorJerry Van Baren <gvb.uboot@gmail.com>
Sat, 8 Mar 2008 18:48:01 +0000 (13:48 -0500)
committerStefan Roese <sr@denx.de>
Wed, 19 Mar 2008 12:41:25 +0000 (13:41 +0100)
Signed-off-by: Gerald Van Baren <vanbaren@cideas.com>
README
drivers/mtd/cfi_flash.c

diff --git a/README b/README
index b230fde78a6bbdd5d0a455931f70a240752a8475..0e37b8b0846b75c36744792d311dc3940c28f233 100644 (file)
--- a/README
+++ b/README
@@ -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
index 439c950cf22837b8874887a010189b3b5ccd5f32..48286e58033280c563465980c42aeaec6effd3d8 100644 (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);
        }