summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chipdrivers.h4
-rw-r--r--flashchips.c11
-rw-r--r--sst49lfxxxc.c128
3 files changed, 13 insertions, 130 deletions
diff --git a/chipdrivers.h b/chipdrivers.h
index c96f445..6d5cef0 100644
--- a/chipdrivers.h
+++ b/chipdrivers.h
@@ -100,11 +100,7 @@ int erase_sector_28sf040(struct flashchip *flash, unsigned int address, unsigned
int write_28sf040(struct flashchip *flash, uint8_t *buf);
/* sst49lfxxxc.c */
-int probe_49lfxxxc(struct flashchip *flash);
-int erase_49lfxxxc(struct flashchip *flash);
int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size);
-int erase_block_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size);
-int erase_chip_49lfxxxc(struct flashchip *flash, unsigned int addr, unsigned int blocksize);
int write_49lfxxxc(struct flashchip *flash, uint8_t *buf);
int unlock_49lfxxxc(struct flashchip *flash);
diff --git a/flashchips.c b/flashchips.c
index 47cdc32..c69dd57 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -4190,9 +4190,10 @@ struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_49lfxxxc,
+ .block_erase = erase_block_82802ab,
}
},
+ .unlock = unlock_49lfxxxc,
.write = write_49lfxxxc,
.read = read_memmapped,
},
@@ -4252,9 +4253,10 @@ struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_49lfxxxc,
+ .block_erase = erase_block_82802ab,
}
},
+ .unlock = unlock_49lfxxxc,
.write = write_49lfxxxc,
.read = read_memmapped,
},
@@ -4283,9 +4285,10 @@ struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_49lfxxxc,
+ .block_erase = erase_block_82802ab,
}
},
+ .unlock = unlock_49lfxxxc,
.write = write_49lfxxxc,
.read = read_memmapped,
},
@@ -4459,7 +4462,7 @@ struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_49lfxxxc,
+ .block_erase = erase_block_82802ab,
}
},
.unlock = unlock_49lfxxxc,
diff --git a/sst49lfxxxc.c b/sst49lfxxxc.c
index 9f9ee30..e7e5b61 100644
--- a/sst49lfxxxc.c
+++ b/sst49lfxxxc.c
@@ -24,19 +24,6 @@
#include "flash.h"
#include "chipdrivers.h"
-#define SECTOR_ERASE 0x30
-#define BLOCK_ERASE 0x20
-#define ERASE 0xD0
-#define AUTO_PGRM 0x10
-#define RESET 0xFF
-#define READ_ID 0x90
-#define READ_STATUS 0x70
-#define CLEAR_STATUS 0x50
-
-#define STATUS_BPS (1 << 1)
-#define STATUS_ESS (1 << 6)
-#define STATUS_WSMS (1 << 7)
-
int unlock_block_49lfxxxc(struct flashchip *flash, unsigned long address, unsigned char bits)
{
unsigned long lock = flash->virtual_registers + address + 2;
@@ -90,21 +77,13 @@ int unlock_49lfxxxc(struct flashchip *flash)
int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size)
{
- unsigned char status;
+ uint8_t status;
chipaddr bios = flash->virtual_memory;
- chip_writeb(SECTOR_ERASE, bios);
- chip_writeb(ERASE, bios + address);
+ chip_writeb(0x30, bios);
+ chip_writeb(0xD0, bios + address);
- do {
- status = chip_readb(bios);
- if (status & (STATUS_ESS | STATUS_BPS)) {
- printf("sector erase FAILED at address=0x%08lx status=0x%01x\n", bios + address, status);
- chip_writeb(CLEAR_STATUS, bios);
- return (-1);
- }
- } while (!(status & STATUS_WSMS));
- chip_writeb(RESET, bios);
+ status = wait_82802ab(bios);
if (check_erased_range(flash, address, sector_size)) {
fprintf(stderr, "ERASE FAILED!\n");
@@ -113,101 +92,6 @@ int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigne
return 0;
}
-int erase_block_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int block_size)
-{
- unsigned char status;
- chipaddr bios = flash->virtual_memory;
-
- chip_writeb(BLOCK_ERASE, bios);
- chip_writeb(ERASE, bios + address);
-
- do {
- status = chip_readb(bios);
- if (status & (STATUS_ESS | STATUS_BPS)) {
- printf("block erase FAILED at address=0x%08lx status=0x%01x\n", bios + address, status);
- chip_writeb(CLEAR_STATUS, bios);
- return (-1);
- }
- } while (!(status & STATUS_WSMS));
- chip_writeb(RESET, bios);
-
- if (check_erased_range(flash, address, block_size)) {
- fprintf(stderr, "ERASE FAILED!\n");
- return -1;
- }
- return 0;
-}
-
-static int write_sector_49lfxxxc(chipaddr bios, uint8_t *src, chipaddr dst,
- unsigned int page_size)
-{
- int i;
- unsigned char status;
-
- chip_writeb(CLEAR_STATUS, bios);
- for (i = 0; i < page_size; i++) {
- /* transfer data from source to destination */
- if (*src == 0xFF) {
- dst++, src++;
- /* If the data is 0xFF, don't program it */
- continue;
- }
- /*issue AUTO PROGRAM command */
- chip_writeb(AUTO_PGRM, bios);
- chip_writeb(*src++, dst++);
-
- do {
- status = chip_readb(bios);
- if (status & (STATUS_ESS | STATUS_BPS)) {
- printf("sector write FAILED at address=0x%08lx status=0x%01x\n", dst, status);
- chip_writeb(CLEAR_STATUS, bios);
- return (-1);
- }
- } while (!(status & STATUS_WSMS));
- }
-
- return 0;
-}
-
-int probe_49lfxxxc(struct flashchip *flash)
-{
- chipaddr bios = flash->virtual_memory;
- uint8_t id1, id2;
-
- chip_writeb(RESET, bios);
-
- chip_writeb(READ_ID, bios);
- id1 = chip_readb(bios);
- id2 = chip_readb(bios + 0x01);
-
- chip_writeb(RESET, bios);
-
- printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2);
-
- if (!(id1 == flash->manufacture_id && id2 == flash->model_id))
- return 0;
-
- map_flash_registers(flash);
-
- return 1;
-}
-
-int erase_49lfxxxc(struct flashchip *flash)
-{
- chipaddr bios = flash->virtual_memory;
- int i;
- unsigned int total_size = flash->total_size * 1024;
-
- write_lockbits_49lfxxxc(flash, 0);
- for (i = 0; i < total_size; i += flash->page_size)
- if (erase_sector_49lfxxxc(flash, i, flash->page_size))
- return (-1);
-
- chip_writeb(RESET, bios);
-
- return 0;
-}
-
int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
{
int i;
@@ -226,13 +110,13 @@ int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
/* write to the sector */
printf("%04d at address: 0x%08x", i, i * page_size);
- write_sector_49lfxxxc(bios, buf + i * page_size,
+ write_page_82802ab(bios, buf + i * page_size,
bios + i * page_size, page_size);
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");
}
printf("\n");
- chip_writeb(RESET, bios);
+ chip_writeb(0xFF, bios);
return 0;
}
OpenPOWER on IntegriCloud