From 583c9b31ab67e302a9ce288c556d4288be61e2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Ahl=C3=A9n?= Date: Tue, 13 Dec 2011 11:39:52 +0100 Subject: [PATCH] Made BI-swap optional in mxc. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ibdf3b1e415adcf1fdb38de25fe05da726ef58ca4 Signed-off-by: Erik Ahlén Reviewed-on: http://openocd.zylin.com/269 Tested-by: jenkins Reviewed-by: Mathias Küster Reviewed-by: Spencer Oliver --- src/flash/nand/mx2.c | 53 ++++++++++++++++++++++++++--------------- src/flash/nand/mx2.h | 1 + tcl/board/tx27_stk5.cfg | 2 +- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/flash/nand/mx2.c b/src/flash/nand/mx2.c index ef1942216..e3647385c 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; } @@ -115,6 +115,15 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command) mxc_nf_info->flags.target_little_endian = (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 */ @@ -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; - } - 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); + 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); + } + /* * 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 c0e7d6b28..77854b953 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 { diff --git a/tcl/board/tx27_stk5.cfg b/tcl/board/tx27_stk5.cfg index 5887ac694..bb933e149 100644 --- a/tcl/board/tx27_stk5.cfg +++ b/tcl/board/tx27_stk5.cfg @@ -61,4 +61,4 @@ proc tx27_init { } { nand probe 0 } -nand device tx27.nand mxc $_TARGETNAME mx27 hwecc +nand device tx27.nand mxc $_TARGETNAME mx27 hwecc biswap