[flashrom] [commit] r972 - trunk

repository service svn at flashrom.org
Tue Mar 23 18:10:28 CET 2010


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 at gmail.com>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at 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;
 }




More information about the flashrom mailing list