aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErik Ahlén <erik.ahlen@avalonenterprise.com>2011-12-13 11:39:52 +0100
committerSpencer Oliver <spen@spen-soft.co.uk>2011-12-23 09:39:48 +0000
commit583c9b31ab67e302a9ce288c556d4288be61e2e6 (patch)
tree2d1299e935030a5c9c99fcf75677e49a79d99711 /src
parent684e9674a6d1410295ab2a9ca582d5d502bd62bd (diff)
downloadriscv-openocd-583c9b31ab67e302a9ce288c556d4288be61e2e6.zip
riscv-openocd-583c9b31ab67e302a9ce288c556d4288be61e2e6.tar.gz
riscv-openocd-583c9b31ab67e302a9ce288c556d4288be61e2e6.tar.bz2
Made BI-swap optional in mxc.
Change-Id: Ibdf3b1e415adcf1fdb38de25fe05da726ef58ca4 Signed-off-by: Erik Ahlén <erik.ahlen@avalonenterprise.com> Reviewed-on: http://openocd.zylin.com/269 Tested-by: jenkins Reviewed-by: Mathias Küster <kesmtp@freenet.de> Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src')
-rw-r--r--src/flash/nand/mx2.c51
-rw-r--r--src/flash/nand/mx2.h1
2 files changed, 34 insertions, 18 deletions
diff --git a/src/flash/nand/mx2.c b/src/flash/nand/mx2.c
index ef19422..e364738 100644
--- a/src/flash/nand/mx2.c
+++ b/src/flash/nand/mx2.c
@@ -87,7 +87,7 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command)
nand->controller_priv = mxc_nf_info;
if (CMD_ARGC < 4) {
- LOG_ERROR("use \"nand device mxc target mx27|mx31|mx35 noecc|hwecc\"");
+ LOG_ERROR("use \"nand device mxc target mx27|mx31|mx35 noecc|hwecc [biswap]\"");
return ERROR_FAIL;
}
@@ -116,6 +116,15 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command)
(nand->target->endianness == TARGET_LITTLE_ENDIAN);
/*
+ * should factory bad block indicator be swaped
+ * as a workaround for how the nfc handles pages.
+ */
+ if (CMD_ARGC > 4 && strcmp(CMD_ARGV[4], "biswap") == 0) {
+ LOG_DEBUG("BI-swap enabled");
+ mxc_nf_info->flags.biswap_enabled = 1;
+ }
+
+ /*
* testing host endianness
*/
x = 1;
@@ -414,18 +423,21 @@ static int mxc_write_page(struct nand_device *nand, uint32_t page,
}
target_write_buffer(target, MXC_NF_SPARE_BUFFER0, oob_size, oob);
}
- /* BI-swap - work-around of mxc NFC for NAND device with page == 2kb */
- target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
- if (oob) {
- LOG_ERROR("Due to NFC Bug, oob is not correctly implemented in mxc driver");
- return ERROR_NAND_OPERATION_FAILED;
+
+ if (nand->page_size > 512 && mxc_nf_info->flags.biswap_enabled) {
+ /* BI-swap - work-around of i.MX NFC for NAND device with page == 2kb*/
+ target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
+ if (oob) {
+ LOG_ERROR("Due to NFC Bug, oob is not correctly implemented in mxc driver");
+ return ERROR_NAND_OPERATION_FAILED;
+ }
+ swap2 = 0xffff; /* Spare buffer unused forced to 0xffff */
+ new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
+ swap2 = (swap1 << 8) | (swap2 & 0xFF);
+ target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1);
+ target_write_u16(target, MXC_NF_SPARE_BUFFER3 + 4, swap2);
}
- swap2 = 0xffff; /* Spare buffer unused forced to 0xffff */
- new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
- swap2 = (swap1 << 8) | (swap2 & 0xFF);
- target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1);
- target_write_u16(target, MXC_NF_SPARE_BUFFER3 + 4, swap2);
/*
* start data input operation (set MXC_NF_BIT_OP_DONE==0)
*/
@@ -553,13 +565,16 @@ static int mxc_read_page(struct nand_device *nand, uint32_t page,
LOG_ERROR("MXC_NF : Error reading page 3");
return retval;
}
- /* BI-swap - work-around of mxc NFC for NAND device with page == 2k */
- target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
- target_read_u16(target, MXC_NF_SPARE_BUFFER3 + 4, &swap2);
- new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
- swap2 = (swap1 << 8) | (swap2 & 0xFF);
- target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1);
- target_write_u16(target, MXC_NF_SPARE_BUFFER3 + 4, swap2);
+
+ if (nand->page_size > 512 && mxc_nf_info->flags.biswap_enabled) {
+ /* BI-swap - work-around of mxc NFC for NAND device with page == 2k */
+ target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
+ target_read_u16(target, MXC_NF_SPARE_BUFFER3 + 4, &swap2);
+ new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
+ swap2 = (swap1 << 8) | (swap2 & 0xFF);
+ target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1);
+ target_write_u16(target, MXC_NF_SPARE_BUFFER3 + 4, swap2);
+ }
if (data)
target_read_buffer(target, MXC_NF_MAIN_BUFFER0, data_size, data);
diff --git a/src/flash/nand/mx2.h b/src/flash/nand/mx2.h
index c0e7d6b..77854b9 100644
--- a/src/flash/nand/mx2.h
+++ b/src/flash/nand/mx2.h
@@ -107,6 +107,7 @@ struct mxc_nf_flags {
unsigned nand_readonly:1;
unsigned one_kb_sram:1;
unsigned hw_ecc_enabled:1;
+ unsigned biswap_enabled:1;
};
struct mxc_nf_controller {