[flashrom] [PATCH] Allow shifted JEDEC access

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Wed Jun 11 02:06:50 CEST 2014


Some Parallel bus chips have a 16-bit mode and an 8-bit mode. They use
normal JEDEC addresses for 16-bit mode and shifted addresses (by 1 bit)
for 8-bit mode. Some programmers can access them in 16-bit mode, but on
all flashrom-supported programmers so far, we access them in 8-bit mode.
This means we have to shift the addresses.

Untested, should work. This is a patch written shortly after r886 was
committed, and it has been forward-ported.
Missing from this patch is the deletion of now-unused code.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: flashrom-jedec_shifted/jedec.c
===================================================================
--- flashrom-jedec_shifted/jedec.c	(Revision 1818)
+++ flashrom-jedec_shifted/jedec.c	(Arbeitskopie)
@@ -4,7 +4,7 @@
  * Copyright (C) 2000 Silicon Integrated System Corporation
  * Copyright (C) 2006 Giampiero Giancipoli <gianci at email.it>
  * Copyright (C) 2006 coresystems GmbH <info at coresystems.de>
- * Copyright (C) 2007 Carl-Daniel Hailfinger
+ * Copyright (C) 2007-2012 Carl-Daniel Hailfinger
  * Copyright (C) 2009 Sean Nelson <audiohacked at gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -115,15 +115,18 @@
 static void start_program_jedec_common(const struct flashctx *flash, unsigned int mask)
 {
 	chipaddr bios = flash->virtual_memory;
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
-	chip_writeb(flash, 0xA0, bios + (0x5555 & mask));
+	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) ? 1 : 0;
+
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
+	chip_writeb(flash, 0xA0, bios + ((0x5555 << shifted) & mask));
 }
 
 static int probe_jedec_common(struct flashctx *flash, unsigned int mask)
 {
 	chipaddr bios = flash->virtual_memory;
 	const struct flashchip *chip = flash->chip;
+	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) ? 1 : 0;
 	uint8_t id1, id2;
 	uint32_t largeid1, largeid2;
 	uint32_t flashcontent1, flashcontent2;
@@ -153,31 +156,31 @@
 	/* Reset chip to a clean slate */
 	if ((chip->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
 	{
-		chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+		chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 		if (probe_timing_exit)
 			programmer_delay(10);
-		chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+		chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 		if (probe_timing_exit)
 			programmer_delay(10);
 	}
-	chip_writeb(flash, 0xF0, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xF0, bios + ((0x5555 << shifted) & mask));
 	if (probe_timing_exit)
 		programmer_delay(probe_timing_exit);
 
 	/* Issue JEDEC Product ID Entry command */
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	if (probe_timing_enter)
 		programmer_delay(10);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	if (probe_timing_enter)
 		programmer_delay(10);
-	chip_writeb(flash, 0x90, bios + (0x5555 & mask));
+	chip_writeb(flash, 0x90, bios + ((0x5555 << shifted) & mask));
 	if (probe_timing_enter)
 		programmer_delay(probe_timing_enter);
 
 	/* Read product ID */
-	id1 = chip_readb(flash, bios);
-	id2 = chip_readb(flash, bios + 0x01);
+	id1 = chip_readb(flash, bios + (0x00 << shifted));
+	id2 = chip_readb(flash, bios + (0x01 << shifted));
 	largeid1 = id1;
 	largeid2 = id2;
 
@@ -196,14 +199,14 @@
 	/* Issue JEDEC Product ID Exit command */
 	if ((chip->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
 	{
-		chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+		chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 		if (probe_timing_exit)
 			programmer_delay(10);
-		chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+		chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 		if (probe_timing_exit)
 			programmer_delay(10);
 	}
-	chip_writeb(flash, 0xF0, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xF0, bios + ((0x5555 << shifted) & mask));
 	if (probe_timing_exit)
 		programmer_delay(probe_timing_exit);
 
@@ -212,8 +215,8 @@
 		msg_cdbg(", id1 parity violation");
 
 	/* Read the product ID location again. We should now see normal flash contents. */
-	flashcontent1 = chip_readb(flash, bios);
-	flashcontent2 = chip_readb(flash, bios + 0x01);
+	flashcontent1 = chip_readb(flash, bios + (0x00 << shifted));
+	flashcontent2 = chip_readb(flash, bios + (0x01 << shifted));
 
 	/* Check if it is a continuation ID, this should be a while loop. */
 	if (flashcontent1 == 0x7F) {
@@ -244,21 +247,23 @@
 				     unsigned int pagesize, unsigned int mask)
 {
 	chipaddr bios = flash->virtual_memory;
+	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) ? 1 : 0;
 	unsigned int delay_us = 0;
+
 	if(flash->chip->probe_timing != TIMING_ZERO)
 		delay_us = 10;
 
 	/*  Issue the Sector Erase command   */
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x80, bios + (0x5555 & mask));
+	chip_writeb(flash, 0x80, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
 
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	programmer_delay(delay_us);
 	chip_writeb(flash, 0x30, bios + page);
 	programmer_delay(delay_us);
@@ -274,21 +279,23 @@
 				    unsigned int blocksize, unsigned int mask)
 {
 	chipaddr bios = flash->virtual_memory;
+	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) ? 1 : 0;
 	unsigned int delay_us = 0;
+
 	if(flash->chip->probe_timing != TIMING_ZERO)
 		delay_us = 10;
 
 	/*  Issue the Sector Erase command   */
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x80, bios + (0x5555 & mask));
+	chip_writeb(flash, 0x80, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
 
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	programmer_delay(delay_us);
 	chip_writeb(flash, 0x50, bios + block);
 	programmer_delay(delay_us);
@@ -303,23 +310,25 @@
 static int erase_chip_jedec_common(struct flashctx *flash, unsigned int mask)
 {
 	chipaddr bios = flash->virtual_memory;
+	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) ? 1 : 0;
 	unsigned int delay_us = 0;
+
 	if(flash->chip->probe_timing != TIMING_ZERO)
 		delay_us = 10;
 
 	/*  Issue the JEDEC Chip Erase command   */
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x80, bios + (0x5555 & mask));
+	chip_writeb(flash, 0x80, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
 
-	chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
+	chip_writeb(flash, 0xAA, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
+	chip_writeb(flash, 0x55, bios + ((0x2AAA << shifted) & mask));
 	programmer_delay(delay_us);
-	chip_writeb(flash, 0x10, bios + (0x5555 & mask));
+	chip_writeb(flash, 0x10, bios + ((0x5555 << shifted) & mask));
 	programmer_delay(delay_us);
 
 	toggle_ready_jedec_slow(flash, bios);
Index: flashrom-jedec_shifted/82802ab.c
===================================================================
--- flashrom-jedec_shifted/82802ab.c	(Revision 1818)
+++ flashrom-jedec_shifted/82802ab.c	(Arbeitskopie)
@@ -44,7 +44,7 @@
 {
 	chipaddr bios = flash->virtual_memory;
 	uint8_t id1, id2, flashcontent1, flashcontent2;
-	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) != 0;
+	int shifted = (flash->chip->feature_bits & FEATURE_ADDR_SHIFTED) ? 1 : 0;
 
 	/* Reset to get a clean state */
 	chip_writeb(flash, 0xFF, bios);
Index: flashrom-jedec_shifted/flashchips.c
===================================================================
--- flashrom-jedec_shifted/flashchips.c	(Revision 1818)
+++ flashrom-jedec_shifted/flashchips.c	(Arbeitskopie)
@@ -4892,10 +4892,10 @@
 		.model_id	= FUJITSU_MBM29F400BC,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
-		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
-		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+		.probe		= probe_jedec,
+		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
 			{
@@ -4905,13 +4905,13 @@
 					{32 * 1024, 1},
 					{64 * 1024, 7},
 				},
-				.block_erase = erase_block_shifted_jedec,
+				.block_erase = erase_sector_jedec,
 			}, {
 				.eraseblocks = { {512 * 1024, 1} },
-				.block_erase = erase_chip_block_shifted_jedec,
+				.block_erase = erase_chip_block_jedec,
 			},
 		},
-		.write		= write_m29f400bt,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
 	},
@@ -4924,10 +4924,10 @@
 		.model_id	= FUJITSU_MBM29F400TC,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
-		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
-		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+		.probe		= probe_jedec,
+		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
 			{
@@ -4937,13 +4937,13 @@
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_shifted_jedec,
+				.block_erase = erase_sector_jedec,
 			}, {
 				.eraseblocks = { {512 * 1024, 1} },
-				.block_erase = erase_chip_block_shifted_jedec,
+				.block_erase = erase_chip_block_jedec,
 			},
 		},
-		.write		= write_m29f400bt,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
 	},
@@ -11388,10 +11388,10 @@
 		.model_id	= ST_M29F400BB,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
-		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
-		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+		.probe		= probe_jedec,
+		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
 			{
@@ -11401,13 +11401,13 @@
 					{32 * 1024, 1},
 					{64 * 1024, 7},
 				},
-				.block_erase = erase_block_shifted_jedec,
+				.block_erase = erase_sector_jedec,
 			}, {
 				.eraseblocks = { {512 * 1024, 1} },
-				.block_erase = erase_chip_block_shifted_jedec,
+				.block_erase = erase_chip_block_jedec,
 			}
 		},
-		.write		= write_m29f400bt,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 		.voltage	= {4500, 5500},
 	},
@@ -11420,10 +11420,10 @@
 		.model_id	= ST_M29F400BT,
 		.total_size	= 512,
 		.page_size	= 64 * 1024,
-		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
 		.tested		= TEST_UNTESTED,
-		.probe		= probe_m29f400bt,
-		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+		.probe		= probe_jedec,
+		.probe_timing	= TIMING_FIXME,
 		.block_erasers	=
 		{
 			{
@@ -11433,13 +11433,13 @@
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_shifted_jedec,
+				.block_erase = erase_sector_jedec,
 			}, {
 				.eraseblocks = { {512 * 1024, 1} },
-				.block_erase = erase_chip_block_shifted_jedec,
+				.block_erase = erase_chip_block_jedec,
 			}
 		},
-		.write		= write_m29f400bt,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 		.voltage	= {4500, 5500},
 	},

-- 
http://www.hailfinger.org/





More information about the flashrom mailing list