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 <[EMAIL PROTECTED]>

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 <[EMAIL PROTECTED]>
  * Copyright (C) 2006 coresystems GmbH <[EMAIL PROTECTED]>
+ * 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,



-- 
linuxbios mailing list
linuxbios@linuxbios.org
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to