1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00

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>
This commit is contained in:
Sean Nelson 2010-01-28 23:55:12 +00:00
parent b1bd3e85ba
commit 35727f7618
4 changed files with 316 additions and 195 deletions

View File

@ -42,8 +42,7 @@ LDFLAGS += -L/usr/local/lib
endif
CHIP_OBJS = jedec.o stm50flw0x0x.o w39v080fa.o sharplhf00l04.o w29ee011.o \
sst28sf040.o am29f040b.o mx29f002.o m29f400bt.o pm29f002.o w39v040c.o \
w49f002u.o 82802ab.o pm49fl00x.o sst49lf040.o en29f002a.o m29f002.o \
sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \
sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o
LIB_OBJS = layout.o

View File

@ -154,8 +154,14 @@ enum chipbustype {
#define FEATURE_REGISTERMAP (1 << 0)
#define FEATURE_BYTEWRITES (1 << 1)
#define FEATURE_LONG_RESET (0 << 4)
#define FEATURE_SHORT_RESET (1 << 4)
#define FEATURE_EITHER_RESET FEATURE_LONG_RESET
#define FEATURE_ADDR_FULL (0 << 2)
#define FEATURE_ADDR_MASK (3 << 2)
#define FEATURE_ADDR_2AA (1 << 2)
#define FEATURE_ADDR_AAA (2 << 2)
#define FEATURE_ADDR_SHIFTED 0
struct flashchip {
const char *vendor;

File diff suppressed because it is too large Load Diff

44
jedec.c
View File

@ -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);
}