[LinuxBIOS] [PATCH] flashrom: Support EON EN29F002AT, JEDEC continuation IDs

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Tue Dec 18 00:53:37 CET 2007


Hi Markus,

On 24.09.2007 00:38, Carl-Daniel Hailfinger wrote:
> On 31.08.2007 21:40, Markus Boas wrote:
>   
>> I send a patch to add support for the EON EN29F002NT
>> Write, read works.
>>     
>
> Sorry, but the data sheet says you're only doing half of the
> identification and this will match all EON chips.
>   

Can you test this patch? If identification fails, can you post the
output of "flashrom --verbose" ? Thanks!

Add continuation ID support to jedec.c
Add support for EON EN29F002AT.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: flashrom-eon/flash.h
===================================================================
--- flashrom-eon/flash.h	(Revision 3012)
+++ flashrom-eon/flash.h	(Arbeitskopie)
@@ -32,8 +32,12 @@
 
 struct flashchip {
 	const char *name;
-	int manufacture_id;
-	int model_id;
+	/* With 32bit manufacture_id and model_id we can cover IDs up to
+	 * (including) the 4th bank of JEDEC JEP106W Standard Manufacturer's
+	 * Identification code.
+	 */
+	uint32_t manufacture_id;
+	uint32_t model_id;
 
 	int total_size;
 	int page_size;
@@ -85,8 +89,14 @@
 /*
  * EN25 chips are SPI, first byte of device ID is memory type,
  * second byte of device ID is log(bitsize)-9.
+ * Vendor and device ID of EN29 series are both prefixed with 0x7F, which
+ * is the continuation code for IDs in bank 2.
+ * Vendor ID of EN25 series is NOT prefixed with 0x7F, this results in
+ * a collision with Mitsubishi. Mitsubishi once manufactured flash chips.
+ * Let's hope they are not manufacturing SPI flash chips as well.
  */
-#define EON_ID			0x1C	/* EON */
+#define EON_ID			0x7F1C	/* EON, code is 1C in bank 2 */
+#define EON_ID_NOPREFIX		0x1C	/* EON, code is 1C in bank 2 */
 #define EN_25B05		0x2010	/* 2^19 kbit or 2^16 kByte */
 #define EN_25B10		0x2011
 #define EN_25B20		0x2012
@@ -94,6 +104,13 @@
 #define EN_25B80		0x2014
 #define EN_25B16		0x2015
 #define EN_25B32		0x2016
+#define EN_29F512		0x7F21
+#define EN_29F010		0x7F20
+#define EN_29F040A		0x7F04
+#define EN_29LV010		0x7F6E
+#define EN_29LV040A		0x7F4F	/* EN_29LV040(A) */
+#define EN_29F002AT		0x7F92
+#define EN_29F002AB		0x7F97
 
 #define FUJITSU_ID		0x04	/* Fujitsu */
 #define MBM29F400TC		0x23
Index: flashrom-eon/en29f002a.c
===================================================================
Index: flashrom-eon/jedec.c
===================================================================
--- flashrom-eon/jedec.c	(Revision 3012)
+++ flashrom-eon/jedec.c	(Arbeitskopie)
@@ -4,6 +4,7 @@
  * Copyright (C) 2000 Silicon Integrated System Corporation
  * Copyright (C) 2006 Giampiero Giancipoli <gianci at email.it>
  * Copyright (C) 2006 coresystems GmbH <info at coresystems.de>
+ * Copyright (C) 2007 Carl-Daniel Hailfinger
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -82,6 +83,7 @@
 {
 	volatile uint8_t *bios = flash->virtual_memory;
 	uint8_t id1, id2;
+	uint32_t largeid1, largeid2;
 
 	/* Issue JEDEC Product ID Entry command */
 	*(volatile uint8_t *)(bios + 0x5555) = 0xAA;
@@ -98,7 +100,21 @@
 	/* Read product ID */
 	id1 = *(volatile uint8_t *)bios;
 	id2 = *(volatile uint8_t *)(bios + 0x01);
+	largeid1 = id1;
+	largeid2 = id2;
 
+	/* Check if it is a continuation ID, this should be a while loop. */
+	if (id1 == 0x7F) {
+		largeid1 <<= 8;
+		id1 = *(volatile uint8_t *)(bios + 0x100);
+		largeid1 |= id1;
+	}
+	if (id2 == 0x7F) {
+		largeid2 <<= 8;
+		id2 = *(volatile uint8_t *)(bios + 0x101);
+		largeid2 |= id2;
+	}
+
 	/* Issue JEDEC Product ID Exit command */
 	*(volatile uint8_t *)(bios + 0x5555) = 0xAA;
 	myusec_delay(10);
@@ -107,8 +123,8 @@
 	*(volatile uint8_t *)(bios + 0x5555) = 0xF0;
 	myusec_delay(40);
 
-	printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);
-	if (id1 == flash->manufacture_id && id2 == flash->model_id)
+	printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, largeid1, largeid2);
+	if (largeid1 == flash->manufacture_id && largeid2 == flash->model_id)
 		return 1;
 
 	return 0;
Index: flashrom-eon/flashchips.c
===================================================================
--- flashrom-eon/flashchips.c	(Revision 3012)
+++ flashrom-eon/flashchips.c	(Arbeitskopie)
@@ -42,6 +42,9 @@
 	 probe_jedec,	erase_chip_jedec, write_jedec},
 	{"At49F002(N)T",ATMEL_ID,	AT_49F002NT,	256, 256,
 	 probe_jedec,	erase_chip_jedec, write_jedec},
+	/* The EN29F002AT can do byte program at arbitrary boundaries. */
+	{"EN29F002AT",	EON_ID,		EN_29F002AT,	256, 256,
+	 probe_jedec,	erase_chip_jedec, write_jedec},
 	{"MBM29F400TC",	FUJITSU_ID,	MBM29F400TC,	512, 64 * 1024,
 	 probe_m29f400bt, erase_m29f400bt, write_linuxbios_m29f400bt},
 	{"MX29F002",	MX_ID,		MX_29F002,	256, 64 * 1024,






More information about the coreboot mailing list