diff options
author | Mats Erik Andersson <mats.andersson@gisladisker.se> | 2008-09-26 13:19:02 +0000 |
---|---|---|
committer | Uwe Hermann <uwe@hermann-uwe.de> | 2008-09-26 13:19:02 +0000 |
commit | ad9bdb4345d73c7e9ae53b4bef4796d4216c34a2 (patch) | |
tree | 5e4d755249316df47c2f40a882ccacf4ccf40699 /util/flashrom/en29f002a.c | |
parent | 6c55b05cb2f910d5bb2823f5457de8cae3b43271 (diff) |
Activate proper support for EN29F002(A)(N)[BT].
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
Diffstat (limited to 'util/flashrom/en29f002a.c')
-rw-r--r-- | util/flashrom/en29f002a.c | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/util/flashrom/en29f002a.c b/util/flashrom/en29f002a.c index e2b4f9b09b..904b58b819 100644 --- a/util/flashrom/en29f002a.c +++ b/util/flashrom/en29f002a.c @@ -19,12 +19,17 @@ */ /* - 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; +} |