summaryrefslogtreecommitdiffstats
path: root/jedec.c
diff options
context:
space:
mode:
authorSean Nelson <audiohacked@gmail.com>2010-01-28 23:55:12 +0000
committerSean Nelson <audiohacked@gmail.com>2010-01-28 23:55:12 +0000
commit35727f7618358ac96ab2c4746e51d277e0a3c177 (patch)
treedb29881bf400d15e99e4e1fc45d72ea3aa03c50c /jedec.c
parentb1bd3e85baf5db97ef33789539558a2373c03fd4 (diff)
downloadast2050-flashrom-35727f7618358ac96ab2c4746e51d277e0a3c177.zip
ast2050-flashrom-35727f7618358ac96ab2c4746e51d277e0a3c177.tar.gz
Complete the addition of Feature Bits for all Jedec based chips
Add FEATURE_SHORT_RESET, FEATURE_LONG_RESET, and FEATURE_EITHER_RESET rewrite jedec functions to use getaddrmask convert write_49f002 to write_jedec_1 convert write_w39v040c to write_jedec_1 convert probe_w39v040c to probe_jedec convert write_49lf040 to write_jedec_1 convert write_pm29f002 to write_jedec convert write_29f040b to write_jedec_1 convert probe_29f040b to probe_jedec convert erase_chip_29f040b to erase_chip_block_jedec convert erase_sector_29f040b to erase_sector_jedec convert write_m29f002b to write_jedec convert write_m29f002t to write_jedec convert *_29f002 to *_jedec decouple unused files from Makefile: am29f040b.c en29f002a.c m29f002.c mx29f002.c pm29f002.c sst49lf040.c w39v040c.c w49f002u.c Corresponding to flashrom svn r886. Signed-off-by: Sean Nelson <audiohacked@gmail.com> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Anders Juel Jensen <andersjjensen@gmail.com>
Diffstat (limited to 'jedec.c')
-rw-r--r--jedec.c44
1 files changed, 34 insertions, 10 deletions
diff --git a/jedec.c b/jedec.c
index 055fbc3..055e910 100644
--- a/jedec.c
+++ b/jedec.c
@@ -27,6 +27,7 @@
#define MAX_REFLASH_TRIES 0x10
#define MASK_FULL 0xffff
#define MASK_2AA 0x7ff
+#define MASK_AAA 0xfff
/* Check one byte for odd parity */
uint8_t oddparity(uint8_t val)
@@ -98,8 +99,7 @@ void start_program_jedec_common(struct flashchip *flash, unsigned int mask)
chip_writeb(0xA0, bios + (0x5555 & mask));
}
-int probe_jedec_common(struct flashchip *flash,
- unsigned int mask, int long_reset)
+int probe_jedec_common(struct flashchip *flash, unsigned int mask)
{
chipaddr bios = flash->virtual_memory;
uint8_t id1, id2;
@@ -152,7 +152,7 @@ int probe_jedec_common(struct flashchip *flash,
}
/* Issue JEDEC Product ID Exit command */
- if (long_reset)
+ if ((flash->feature_bits & FEATURE_SHORT_RESET) == FEATURE_LONG_RESET)
{
chip_writeb(0xAA, bios + (0x5555 & mask));
if (probe_timing_exit)
@@ -379,6 +379,12 @@ int getaddrmask(struct flashchip *flash)
case FEATURE_ADDR_FULL:
return MASK_FULL;
break;
+ case FEATURE_ADDR_2AA:
+ return MASK_2AA;
+ break;
+ case FEATURE_ADDR_AAA:
+ return MASK_AAA;
+ break;
default:
fprintf(stderr, "%s called with unknown mask\n", __func__);
return 0;
@@ -388,10 +394,13 @@ int getaddrmask(struct flashchip *flash)
int write_jedec(struct flashchip *flash, uint8_t *buf)
{
+ int mask;
int i, failed = 0;
int total_size = flash->total_size * 1024;
int page_size = flash->page_size;
+ mask = getaddrmask(flash);
+
if (erase_chip_jedec(flash)) {
fprintf(stderr,"ERASE FAILED!\n");
return -1;
@@ -401,7 +410,7 @@ int write_jedec(struct flashchip *flash, uint8_t *buf)
for (i = 0; i < total_size / page_size; i++) {
printf("%04d at address: 0x%08x", i, i * page_size);
if (write_page_write_jedec_common(flash, buf + i * page_size,
- i * page_size, page_size, MASK_FULL))
+ i * page_size, page_size, mask))
failed = 1;
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
}
@@ -415,6 +424,9 @@ int write_jedec_1(struct flashchip *flash, uint8_t * buf)
int i;
chipaddr bios = flash->virtual_memory;
chipaddr dst = bios;
+ int mask;
+
+ mask = getaddrmask(flash);
programmer_delay(10);
if (erase_flash(flash)) {
@@ -427,7 +439,7 @@ int write_jedec_1(struct flashchip *flash, uint8_t * buf)
if ((i & 0x3) == 0)
printf("address: 0x%08lx", (unsigned long)i * 1024);
- write_sector_jedec_common(flash, buf + i * 1024, dst + i * 1024, 1024, MASK_FULL);
+ write_sector_jedec_common(flash, buf + i * 1024, dst + i * 1024, 1024, mask);
if ((i & 0x3) == 0)
printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
@@ -441,12 +453,15 @@ int write_jedec_1(struct flashchip *flash, uint8_t * buf)
int erase_chip_block_jedec(struct flashchip *flash, unsigned int addr,
unsigned int blocksize)
{
+ int mask;
+
+ mask = getaddrmask(flash);
if ((addr != 0) || (blocksize != flash->total_size * 1024)) {
fprintf(stderr, "%s called with incorrect arguments\n",
__func__);
return -1;
}
- return erase_chip_jedec_common(flash, MASK_FULL);
+ return erase_chip_jedec_common(flash, mask);
}
int probe_jedec(struct flashchip *flash)
@@ -454,20 +469,29 @@ int probe_jedec(struct flashchip *flash)
int mask;
mask = getaddrmask(flash);
- return probe_jedec_common(flash, mask, 1);
+ return probe_jedec_common(flash, mask);
}
int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int size)
{
- return erase_sector_jedec_common(flash, page, size, MASK_FULL);
+ int mask;
+
+ mask = getaddrmask(flash);
+ return erase_sector_jedec_common(flash, page, size, mask);
}
int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int size)
{
- return erase_block_jedec_common(flash, page, size, MASK_FULL);
+ int mask;
+
+ mask = getaddrmask(flash);
+ return erase_block_jedec_common(flash, page, size, mask);
}
int erase_chip_jedec(struct flashchip *flash)
{
- return erase_chip_jedec_common(flash, MASK_FULL);
+ int mask;
+
+ mask = getaddrmask(flash);
+ return erase_chip_jedec_common(flash, mask);
}
OpenPOWER on IntegriCloud