From 69e5811e791dce0bb03796d842314c0397ff0e7c Mon Sep 17 00:00:00 2001 From: Sean Nelson Date: Tue, 23 Mar 2010 17:10:28 +0000 Subject: 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 Acked-by: Carl-Daniel Hailfinger --- sst49lfxxxc.c | 128 +++------------------------------------------------------- 1 file changed, 6 insertions(+), 122 deletions(-) (limited to 'sst49lfxxxc.c') 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; } -- cgit v1.1