Commit 583c9b31 authored by Erik Ahlén's avatar Erik Ahlén Committed by Spencer Oliver
Browse files

Made BI-swap optional in mxc.



Change-Id: Ibdf3b1e415adcf1fdb38de25fe05da726ef58ca4
Signed-off-by: default avatarErik Ahlén <erik.ahlen@avalonenterprise.com>
Reviewed-on: http://openocd.zylin.com/269


Tested-by: jenkins
Reviewed-by: default avatarMathias Küster <kesmtp@freenet.de>
Reviewed-by: default avatarSpencer Oliver <spen@spen-soft.co.uk>
parent 684e9674
...@@ -87,7 +87,7 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command) ...@@ -87,7 +87,7 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command)
nand->controller_priv = mxc_nf_info; nand->controller_priv = mxc_nf_info;
if (CMD_ARGC < 4) { 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; return ERROR_FAIL;
} }
...@@ -115,6 +115,15 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command) ...@@ -115,6 +115,15 @@ NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command)
mxc_nf_info->flags.target_little_endian = mxc_nf_info->flags.target_little_endian =
(nand->target->endianness == 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 * testing host endianness
*/ */
...@@ -414,18 +423,21 @@ static int mxc_write_page(struct nand_device *nand, uint32_t page, ...@@ -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); 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 (nand->page_size > 512 && mxc_nf_info->flags.biswap_enabled) {
if (oob) { /* BI-swap - work-around of i.MX NFC for NAND device with page == 2kb*/
LOG_ERROR("Due to NFC Bug, oob is not correctly implemented in mxc driver"); target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
return ERROR_NAND_OPERATION_FAILED; 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) * 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, ...@@ -553,13 +565,16 @@ static int mxc_read_page(struct nand_device *nand, uint32_t page,
LOG_ERROR("MXC_NF : Error reading page 3"); LOG_ERROR("MXC_NF : Error reading page 3");
return retval; 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); if (nand->page_size > 512 && mxc_nf_info->flags.biswap_enabled) {
target_read_u16(target, MXC_NF_SPARE_BUFFER3 + 4, &swap2); /* BI-swap - work-around of mxc NFC for NAND device with page == 2k */
new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8); target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
swap2 = (swap1 << 8) | (swap2 & 0xFF); target_read_u16(target, MXC_NF_SPARE_BUFFER3 + 4, &swap2);
target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1); new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
target_write_u16(target, MXC_NF_SPARE_BUFFER3 + 4, swap2); 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) if (data)
target_read_buffer(target, MXC_NF_MAIN_BUFFER0, data_size, data); target_read_buffer(target, MXC_NF_MAIN_BUFFER0, data_size, data);
......
...@@ -107,6 +107,7 @@ struct mxc_nf_flags { ...@@ -107,6 +107,7 @@ struct mxc_nf_flags {
unsigned nand_readonly:1; unsigned nand_readonly:1;
unsigned one_kb_sram:1; unsigned one_kb_sram:1;
unsigned hw_ecc_enabled:1; unsigned hw_ecc_enabled:1;
unsigned biswap_enabled:1;
}; };
struct mxc_nf_controller { struct mxc_nf_controller {
......
...@@ -61,4 +61,4 @@ proc tx27_init { } { ...@@ -61,4 +61,4 @@ proc tx27_init { } {
nand probe 0 nand probe 0
} }
nand device tx27.nand mxc $_TARGETNAME mx27 hwecc nand device tx27.nand mxc $_TARGETNAME mx27 hwecc biswap
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment