Activate proper support for EN29F002(A)(N)[BT].
authorMats Erik Andersson <mats.andersson@gisladisker.se>
Fri, 26 Sep 2008 13:19:02 +0000 (13:19 +0000)
committerUwe Hermann <uwe@hermann-uwe.de>
Fri, 26 Sep 2008 13:19:02 +0000 (13:19 +0000)
Fully tested for Probe/Read/Erase/Write on EN29F002NT.
Jedec subroutines 'probe_jedec()' and 'erase_chip_jedec()'
are still in use, but a tailored 'write_en29f002a()' is
needed due to a byte wise writing mechanism for this chip.

Signed-off-by: Mats Erik Andersson <mats.andersson@gisladisker.se>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3602 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/flashrom/Makefile
util/flashrom/en29f002a.c
util/flashrom/flash.h
util/flashrom/flashchips.c

index b3ed739f67b83f39403d3fe2b2649738541ae990..09c68dedf1d8c1a52ea1ea70d79b2bc6b0e2daad 100644 (file)
@@ -26,7 +26,7 @@ endif
 
 OBJS = chipset_enable.o board_enable.o udelay.o jedec.o stm50flw0x0x.o \
        sst28sf040.o am29f040b.o mx29f002.o sst39sf020.o m29f400bt.o \
-       w49f002u.o 82802ab.o pm49fl00x.o sst49lf040.o \
+       w49f002u.o 82802ab.o pm49fl00x.o sst49lf040.o en29f002a.o \
        sst49lfxxxc.o sst_fwhub.o layout.o cbtable.o flashchips.o \
        flashrom.o w39v080fa.o sharplhf00l04.o w29ee011.o spi.o it87spi.o \
        ichspi.o w39v040c.o
index e2b4f9b09bb4b1eb8c7dbea41df189ca2365f9fe..904b58b81917dd04407af1a65c018e6b99374ac7 100644 (file)
  */
 
 /*
  EN29F512 has 1C,21
  EN29F010 has 1C,20
  EN29F040A has 1C,04
  EN29LV010 has 1C,6E and uses short F0 reset sequence
  EN29LV040(A) has 1C,4F and uses short F0 reset sequence
* EN29F512 has 1C,21
* EN29F010 has 1C,20
* EN29F040A has 1C,04
* EN29LV010 has 1C,6E and uses short F0 reset sequence
* EN29LV040(A) has 1C,4F and uses short F0 reset sequence
  */
+
+#include <stdio.h>
+#include <stdint.h>
+#include "flash.h"
+
 int probe_en29f512(struct flashchip *flash)
 {
        volatile uint8_t *bios = flash->virtual_memory;
@@ -53,9 +58,11 @@ int probe_en29f512(struct flashchip *flash)
 }
 
 /*
  EN29F002AT has 1C,92
  EN29F002AB has 1C,97
* EN29F002AT has 1C,92
* EN29F002AB has 1C,97
  */
+
+/* This does not seem to function properly for EN29F002NT. */
 int probe_en29f002a(struct flashchip *flash)
 {
        volatile uint8_t *bios = flash->virtual_memory;
@@ -83,3 +90,35 @@ int probe_en29f002a(struct flashchip *flash)
        return 0;
 }
 
+/* The EN29F002 chip needs repeated single byte writing, no block writing. */
+int write_en29f002a(struct flashchip *flash, uint8_t *buf)
+{
+       int i;
+       int total_size = flash->total_size * 1024;
+       volatile uint8_t *bios = flash->virtual_memory;
+       volatile uint8_t *dst = bios;
+
+       // *bios = 0xF0;
+       myusec_delay(10);
+       erase_chip_jedec(flash);
+
+       printf("Programming page: ");
+       for (i = 0; i < total_size; i++) {
+               /* write to the sector */
+               if ((i & 0xfff) == 0)
+                       printf("address: 0x%08lx", (unsigned long)i);
+               *(bios + 0x5555) = 0xAA;
+               *(bios + 0x2AAA) = 0x55;
+               *(bios + 0x5555) = 0xA0;
+               *dst++ = *buf++;
+
+               /* wait for Toggle bit ready */
+               toggle_ready_jedec(dst);
+
+               if ((i & 0xfff) == 0)
+                       printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
+       }
+
+       printf("\n");
+       return 0;
+}
index 7e1fab7eb35e2c65dd7100d77f5604c0efeb420e..1dcdbfbdb54309d817ac662e06a2ef67d4d67c49 100644 (file)
@@ -435,6 +435,11 @@ int probe_29f040b(struct flashchip *flash);
 int erase_29f040b(struct flashchip *flash);
 int write_29f040b(struct flashchip *flash, uint8_t *buf);
 
+/* en29f002a.c */
+int probe_en29f002a(struct flashchip *flash);
+int erase_en29f002a(struct flashchip *flash);
+int write_en29f002a(struct flashchip *flash, uint8_t *buf);
+
 /* ichspi.c */
 int ich_spi_command(unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr);
 int ich_spi_read(struct flashchip *flash, uint8_t * buf);
index 07445bf4eaf0d58371f48bc996eb4906ecc10dc9..afe0bfbc4e05d6947307e581925ae42722999762 100644 (file)
@@ -47,8 +47,8 @@ struct flashchip flashchips[] = {
        {"AMIC",        "A29040B",              AMIC_ID_NOPREFIX, AMIC_A29040B,         512,    64 * 1024,      TEST_OK_PR,     probe_29f040b,          erase_29f040b,                  write_29f040b},
        {"AMIC",        "A49LF040A",            AMIC_ID_NOPREFIX, AMIC_A49LF040A,       512,    64 * 1024,      TEST_OK_PREW,   probe_49fl00x,          erase_49fl00x,                  write_49fl00x},
        {"EMST",        "F49B002UA",            EMST_ID,        EMST_F49B002UA,         256,    4096,           TEST_UNTESTED,  probe_jedec,            erase_chip_jedec,               write_49f002},
-       {"EON",         "EN29F002(A)(N)B",      EON_ID,         EN_29F002B,             256,    256,            TEST_UNTESTED,  probe_jedec,            erase_chip_jedec,               write_jedec},
-       {"EON",         "EN29F002(A)(N)T",      EON_ID,         EN_29F002T,             256,    256,            TEST_UNTESTED,  probe_jedec,            erase_chip_jedec,               write_jedec},
+       {"EON",         "EN29F002(A)(N)B",      EON_ID,         EN_29F002B,             256,    256,            TEST_UNTESTED,  probe_jedec,            erase_chip_jedec,               write_en29f002a},
+       {"EON",         "EN29F002(A)(N)T",      EON_ID,         EN_29F002T,             256,    256,            TEST_OK_PREW,   probe_jedec,            erase_chip_jedec,               write_en29f002a},
        {"Fujitsu",     "MBM29F400TC",          FUJITSU_ID,     MBM29F400TC_STRANGE,    512,    64 * 1024,      TEST_UNTESTED,  probe_m29f400bt,        erase_m29f400bt,                write_coreboot_m29f400bt},
        {"Intel",       "82802AB",              INTEL_ID,       173,                    512,    64 * 1024,      TEST_OK_PREW,   probe_82802ab,          erase_82802ab,                  write_82802ab},
        {"Intel",       "82802AC",              INTEL_ID,       172,                    1024,   64 * 1024,      TEST_OK_PREW,   probe_82802ab,          erase_82802ab,                  write_82802ab},