[U-Boot-Users] [PATCH] ARM Versatile PB926EJ-S, Rev.D: Added support for flash 28F256L30B

Josef Meser Josef.Meser at odm.at
Fri May 25 07:55:53 CEST 2007


Current u-boot works with ARM Versatile PB926EJ-S, HW- Rev.C 
(NOR flash 28F256K3).
This patch adds support for 28F256L30B (asymmetrical sectors: 
4 small sectors at bottom) used on HW-Rev.D.

Signed-off-by: Josef Meser <josef.meser at odm.at>
---
 board/versatile/flash.c     |   84
+++++++++++++++++++++++++++++++++++--------
 include/configs/versatile.h |    2 +-
 include/flash.h             |   10 ++++--
 3 files changed, 77 insertions(+), 19 deletions(-)

diff --git a/board/versatile/flash.c b/board/versatile/flash.c
index 7153371..b79761f 100644
--- a/board/versatile/flash.c
+++ b/board/versatile/flash.c
@@ -31,7 +31,9 @@
 #include <common.h>
 #include <linux/byteorder/swab.h>
 
-#define PHYS_FLASH_SECT_SIZE	0x00020000	/* 256 KB sectors (x2)
*/
+#define PHYS_FLASH_SECT_SIZE		0x00020000 /* *2 = 256 KB
sectors */
+#define PHYS_FLASH_MAIN_SECT_SIZE	0x00020000 /* *2 = 256 KB
sectors */
+#define PHYS_FLASH_PARAM_SECT_SIZE	0x00008000 /* *2 =  64 KB
sectors */
 flash_info_t flash_info[CFG_MAX_FLASH_BANKS];	/* info for FLASH chips
*/
 
 /* Board support for 1 or 2 flash devices */
@@ -62,10 +64,19 @@ typedef struct OrgDef {
 
 
 /* Flash Organizations */
-OrgDef OrgIntel_28F256K3[] = {
+OrgDef OrgIntel_28F256K3[] = {		/* for Hw-Rev. C */
 	{256, 128 * 1024},		/* 256 * 128kBytes sectors */
 };
 
+OrgDef OrgIntel_28F256L18T[] = {
+	{255, 128 * 1024},		/* 255 * 128kBytes sectors */
+	{  4,  32 * 1024},		/*   4 *  32kBytes sectors */
+};
+
+OrgDef OrgIntel_28F256L30B[] = {	/* for Hw-Rev. D */
+	{  4,  32 * 1024},		/*   4 *  32kBytes sectors */
+	{255, 128 * 1024},		/* 255 * 128kBytes sectors */
+};
 
 
/*----------------------------------------------------------------------
-
  * Functions
@@ -132,23 +143,55 @@ static void flash_get_offsets (ulong base,
flash_info_t * info)
 	int i;
 	OrgDef *pOrgDef;
 
-	pOrgDef = OrgIntel_28F256K3;
-	if (info->flash_id == FLASH_UNKNOWN) {
+	switch (info->flash_id & FLASH_VENDMASK) {
+	case FLASH_MAN_INTEL:
+		break;
+	default:
 		return;
 	}
 
-	if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
+	switch (info->flash_id & FLASH_TYPEMASK) {
+	case FLASH_28F256K3:
+		pOrgDef = OrgIntel_28F256K3;
 		for (i = 0; i < info->sector_count; i++) {
+			info->start[i] = base + (i *
PHYS_FLASH_SECT_SIZE);
+			info->protect[i] = 0;
+		}
+		break;
+	case FLASH_28F256L18T:
+		pOrgDef = OrgIntel_28F256L18T;
+		for (i = 0; i < info->sector_count; i++) {
+			/* top param block type */
 			if (i > 255) {
-				info->start[i] = base + (i * 0x8000);
-				info->protect[i] = 0;
+				info->start[i] = base +
+					(255     *
PHYS_FLASH_MAIN_SECT_SIZE) +
+					((i -255)*
PHYS_FLASH_PARAM_SECT_SIZE);
+			} else {
+				info->start[i] = base +
+					(i       *
PHYS_FLASH_MAIN_SECT_SIZE);
+			}
+			info->protect[i] = 0;
+		}
+		break;
+	case FLASH_28F256L30B:
+		pOrgDef = OrgIntel_28F256L30B;
+		for (i = 0; i < info->sector_count; i++) {
+			/* bottom param block type */
+			if (i < 4) {
+				info->start[i] = base + 
+					(i       *
PHYS_FLASH_PARAM_SECT_SIZE);
 			} else {
 				info->start[i] = base +
-						(i *
PHYS_FLASH_SECT_SIZE);
-				info->protect[i] = 0;
+					((i - 3) *
PHYS_FLASH_MAIN_SECT_SIZE);
 			}
+			info->protect[i] = 0;
 		}
+		break;
+	default:
+		return;
 	}
+
+	return;
 }
 
 
/*----------------------------------------------------------------------
-
@@ -172,11 +215,14 @@ void flash_print_info (flash_info_t * info)
 	}
 
 	switch (info->flash_id & FLASH_TYPEMASK) {
+	case FLASH_28F256K3:
+		printf ("FLASH 28F256K3\n");
+		break;
 	case FLASH_28F256L18T:
 		printf ("FLASH 28F256L18T\n");
 		break;
-	case FLASH_28F256K3:
-		printf ("FLASH 28F256K3\n");
+	case FLASH_28F256L30B:
+		printf ("FLASH 28F256L30B\n");
 		break;
 	default:
 		printf ("Unknown Chip Type\n");
@@ -221,6 +267,7 @@ static ulong flash_get_size (FPW * addr,
flash_info_t * info)
 		info->flash_id = FLASH_UNKNOWN;
 		info->sector_count = 0;
 		info->size = 0;
+		printf ("Unknown flash vendor %0x\n", value);
 		addr[0] = (FPW) 0x00FF00FF;	/* restore read mode */
 		return (0);		/* no or unknown flash  */
 	}
@@ -229,20 +276,27 @@ static ulong flash_get_size (FPW * addr,
flash_info_t * info)
 	value = addr[1];	/* device ID        */
 	switch (value) {
 
+	case (FPW)(INTEL_ID_28F256K3):
+		info->flash_id += FLASH_28F256K3;
+		info->sector_count = 256;
+		info->size = 0x02000000;
+		break;
+
 	case (FPW) (INTEL_ID_28F256L18T):
 		info->flash_id += FLASH_28F256L18T;
 		info->sector_count = 259;
 		info->size = 0x02000000;
 		break;			/* => 32 MB     */
 
-	case (FPW)(INTEL_ID_28F256K3):
-		info->flash_id += FLASH_28F256K3;
-		info->sector_count = 256;
-		info->size = 0x02000000;
+	case (FPW)(INTEL_ID_28F256L30B):
+		info->flash_id += FLASH_28F256L30B;
+		info->sector_count = 259;
+		info->size = 0x02000000;	/* 32 MB */
 		break;
 
 	default:
 		info->flash_id = FLASH_UNKNOWN;
+		printf ("Unknown chip type %0x\n", value);
 		break;
 	}
 
diff --git a/include/configs/versatile.h b/include/configs/versatile.h
index 16db43b..fe26c42 100644
--- a/include/configs/versatile.h
+++ b/include/configs/versatile.h
@@ -166,7 +166,7 @@
 /* timeout values are in ticks */
 #define CFG_FLASH_ERASE_TOUT	(20*CFG_HZ)	/* Timeout for Flash
Erase */
 #define CFG_FLASH_WRITE_TOUT	(20*CFG_HZ)	/* Timeout for Flash
Write */
-#define CFG_MAX_FLASH_SECT	(256)
+#define CFG_MAX_FLASH_SECT	(259)
 
 #define PHYS_FLASH_1		(CFG_FLASH_BASE)
 
diff --git a/include/flash.h b/include/flash.h
index 43b9c6b..c1e327f 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -284,10 +284,12 @@ extern void flash_read_factory_serial(flash_info_t
* info, void * buffer, int of
 #define INTEL_ID_28F640J3A  0x00170017	/*  64M = 128K x  64	*/
 #define INTEL_ID_28F128J3A  0x00180018	/* 128M = 128K x 128	*/
 #define INTEL_ID_28F256J3A  0x001D001D	/* 256M = 128K x 256	*/
+#define INTEL_ID_28F64K3    0x88018801	/*  64M =  32K x 256 */
+#define INTEL_ID_28F128K3   0x88028802	/* 128M =  64K x 256 */
+#define INTEL_ID_28F256K3   0x88038803	/* 256M = 128K x 256 */
 #define INTEL_ID_28F256L18T 0x880D880D	/* 256M = 128K x 255 + 32k x 4
*/
-#define INTEL_ID_28F64K3    0x88018801	/*  64M =  32K x 255 + 32k x 4
*/
-#define INTEL_ID_28F128K3   0x88028802	/* 128M =  64K x 255 + 32k x 4
*/
-#define INTEL_ID_28F256K3   0x88038803	/* 256M = 128K x 255 + 32k x 4
*/
+#define INTEL_ID_28F256L30T 0x88138813	/* 256M = 128K x 255 + 32k x 4
*/
+#define INTEL_ID_28F256L30B 0x88168816	/* 256M = 128K x 255 + 32k x 4
*/
 #define INTEL_ID_28F64P30T  0x88178817	/*  64M =  32K x 255 + 32k x 4
*/
 #define INTEL_ID_28F64P30B  0x881A881A	/*  64M =  32K x 255 + 32k x 4
*/
 #define INTEL_ID_28F128P30T 0x88188818	/* 128M =  64K x 255 + 32k x 4
*/
@@ -420,6 +422,8 @@ extern void flash_read_factory_serial(flash_info_t *
info, void * buffer, int of
 #define FLASH_28F64K3	0x00B4		/* Intel 28F64K3   (  64M)
*/
 #define FLASH_28F128K3	0x00B6		/* Intel 28F128K3  ( 128M = 8M x
16 )	*/
 #define FLASH_28F256K3	0x00B8		/* Intel 28F256K3  ( 256M = 16M
x 16 )	*/
+#define FLASH_28F256L30T 0x00B9		/* Intel 28F256L30T (
256M = 16M x 16 )	*/
+#define FLASH_28F256L30B 0x00BA		/* Intel 28F256L30B (
256M = 16M x 16 )	*/
 
 #define FLASH_28F320J3A 0x00C0		/* INTEL 28F320J3A ( 32M = 128K
x  32)	*/
 #define FLASH_28F640J3A 0x00C2		/* INTEL 28F640J3A ( 64M = 128K
x  64)	*/
-- 
1.5.0.2




More information about the U-Boot mailing list