Author: snelson Date: Tue Mar 23 18:10:28 2010 New Revision: 972 URL: http://flashrom.org/trac/coreboot/changeset/972
Log: 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.
Signed-off-by: Sean Nelson audiohacked@gmail.com Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Modified: trunk/chipdrivers.h trunk/flashchips.c trunk/sst49lfxxxc.c
Modified: trunk/chipdrivers.h ============================================================================== --- trunk/chipdrivers.h Tue Mar 23 00:47:38 2010 (r971) +++ trunk/chipdrivers.h Tue Mar 23 18:10:28 2010 (r972) @@ -100,11 +100,7 @@ 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);
Modified: trunk/flashchips.c ============================================================================== --- trunk/flashchips.c Tue Mar 23 00:47:38 2010 (r971) +++ trunk/flashchips.c Tue Mar 23 18:10:28 2010 (r972) @@ -4190,9 +4190,10 @@ {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 @@ {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 @@ {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 @@ {8 * 1024, 2}, {16 * 1024, 1}, }, - .block_erase = erase_block_49lfxxxc, + .block_erase = erase_block_82802ab, } }, .unlock = unlock_49lfxxxc,
Modified: trunk/sst49lfxxxc.c ============================================================================== --- trunk/sst49lfxxxc.c Tue Mar 23 00:47:38 2010 (r971) +++ trunk/sst49lfxxxc.c Tue Mar 23 18:10:28 2010 (r972) @@ -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 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 @@ 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 @@
/* 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; }