summaryrefslogtreecommitdiffstats
path: root/sst49lfxxxc.c
diff options
context:
space:
mode:
authorSean Nelson <audiohacked@gmail.com>2010-03-23 17:10:28 +0000
committerSean Nelson <audiohacked@gmail.com>2010-03-23 17:10:28 +0000
commit69e5811e791dce0bb03796d842314c0397ff0e7c (patch)
tree2b37bafd08aecabc45fd72ec36bdba132a6f0b4c /sst49lfxxxc.c
parent12aa0be5d47d8759e27a1ee412b2f95b9906898b (diff)
downloadflashrom-69e5811e791dce0bb03796d842314c0397ff0e7c.tar.gz
flashrom-69e5811e791dce0bb03796d842314c0397ff0e7c.tar.bz2
flashrom-69e5811e791dce0bb03796d842314c0397ff0e7c.zip
Sst49lfxxxc chips are functionally the same as 82802ab chips
Sst49lfxxxc software status register is functionally the same as the 82802ab status register, "Block Protect Status"(49lfxxxc) can be treated the same as "Device Protect Status"(82802ab). Erase_block_49lfxxxc is the same command sequence as erase_block_82802ab. Add unlock_49lfxxxc to chips definitions. Write_sector_49lfxxxc is the same as write_page_82802ab. Corresponding to flashrom svn r972. Signed-off-by: Sean Nelson <audiohacked@gmail.com> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Diffstat (limited to 'sst49lfxxxc.c')
-rw-r--r--sst49lfxxxc.c128
1 files changed, 6 insertions, 122 deletions
diff --git a/sst49lfxxxc.c b/sst49lfxxxc.c
index 9f9ee308c..e7e5b6162 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;
}