浏览代码

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

Wolfgang Denk 17 年之前
父节点
当前提交
e334e05ba0
共有 2 个文件被更改,包括 44 次插入1 次删除
  1. 5 0
      README
  2. 39 1
      drivers/mtd/cfi_flash.c

+ 5 - 0
README

@@ -1946,6 +1946,11 @@ Configuration Settings:
 		is useful, if some of the configured banks are only
 		is useful, if some of the configured banks are only
 		optionally available.
 		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:
 - CFG_RX_ETH_BUFFER:
 		Defines the number of ethernet receive buffers. On some
 		Defines the number of ethernet receive buffers. On some
 		ethernet controllers it is recommended to set this value
 		ethernet controllers it is recommended to set this value

+ 39 - 1
drivers/mtd/cfi_flash.c

@@ -1179,6 +1179,27 @@ 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.
+ */
+#ifdef CONFIG_FLASH_SHOW_PROGRESS
+#define FLASH_SHOW_PROGRESS(scale, dots, digit, dots_sub) \
+	dots -= dots_sub; \
+	if ((scale > 0) && (dots <= 0)) { \
+		if ((digit % 5) == 0) \
+			printf ("%d", digit / 5); \
+		else \
+			putc ('.'); \
+		digit--; \
+		dots += scale; \
+	}
+#else
+#define FLASH_SHOW_PROGRESS(scale, dots, digit, dots_sub)
+#endif
+
 /*-----------------------------------------------------------------------
 /*-----------------------------------------------------------------------
  * Copy memory to flash, returns:
  * Copy memory to flash, returns:
  * 0 - OK
  * 0 - OK
@@ -1192,10 +1213,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 +1253,7 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
 			return rc;
 			return rc;
 
 
 		wp += i;
 		wp += i;
+		FLASH_SHOW_PROGRESS(scale, dots, digit, i);
 	}
 	}
 
 
 	/* handle the aligned part */
 	/* handle the aligned part */
@@ -1248,6 +1283,7 @@ 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;
+		FLASH_SHOW_PROGRESS(scale, dots, digit, i);
 	}
 	}
 #else
 #else
 	while (cnt >= info->portwidth) {
 	while (cnt >= info->portwidth) {
@@ -1259,8 +1295,10 @@ 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;
+		FLASH_SHOW_PROGRESS(scale, dots, digit, info->portwidth);
 	}
 	}
 #endif /* CFG_FLASH_USE_BUFFER_WRITE */
 #endif /* CFG_FLASH_USE_BUFFER_WRITE */
+
 	if (cnt == 0) {
 	if (cnt == 0) {
 		return (0);
 		return (0);
 	}
 	}