|
@@ -90,6 +90,32 @@ static struct nand_ecclayout nand_hw_eccoob_128 = { /* large page 2k with 64 byt
|
|
|
.oobfree = { {2, 42} }
|
|
|
};
|
|
|
|
|
|
+//1024--24
|
|
|
+static struct nand_ecclayout nand_hw_eccoob_256 = {
|
|
|
+ .eccbytes = BIT_24_ECC_BYTE,
|
|
|
+ .eccpos = {88, 89,
|
|
|
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
|
|
|
+ 100, 101, 102, 103, 104, 105,106, 107, 108, 109,
|
|
|
+ 110, 111, 112, 113, 114, 115,116, 117, 118, 119,
|
|
|
+ 120, 121, 122, 123, 124, 125,126, 127, 128, 129,
|
|
|
+ 130, 131, 132, 133, 134, 135,136, 137, 138, 139,
|
|
|
+ 140, 141, 142, 143, 144, 145,146, 147, 148, 149,
|
|
|
+ 150, 151, 152, 153, 154, 155,156, 157, 158, 159,
|
|
|
+ 160, 161, 162, 163, 164, 165,166, 167, 168, 169,
|
|
|
+ 170, 171, 172, 173, 174, 175,176, 177, 178, 179,
|
|
|
+ 180, 181, 182, 183, 184, 185,186, 187, 188, 189,
|
|
|
+ 190, 191, 192, 193, 194, 195,196, 197, 198, 199,
|
|
|
+ 200, 201, 202, 203, 204, 205,206, 207, 208, 209,
|
|
|
+ 210, 211, 212, 213, 214, 215,216, 217, 218, 219,
|
|
|
+ 220, 221, 222, 223, 224, 225,226, 227, 228, 229,
|
|
|
+ 230, 231, 232, 233, 234, 235,236, 237, 238, 239,
|
|
|
+ 240, 241, 242, 243, 244, 245,246, 247, 248, 249,
|
|
|
+ 250, 251, 252, 253, 254, 255,
|
|
|
+ },
|
|
|
+ .oobfree = { {2, 86} }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
|
|
|
/*static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
|
|
|
static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
|
|
@@ -1001,7 +1027,7 @@ static int ark_hwecc_nand_init_param(struct nand_chip *chip, struct mtd_info *mt
|
|
|
val &= ~(0x7 << 4);
|
|
|
val |= (1 << 8) | (1 << 7) | (1 << 4) | (1 << 0);
|
|
|
writel(val, rBCH_CR);
|
|
|
- } else if(mtd->oobsize >= 128) {
|
|
|
+ } else if(mtd->oobsize >= 128 && mtd->oobsize < 256) {
|
|
|
chip->ecc.bytes = BIT_24_ECC_BYTE; // should be 13 bytes but the ECC encoder register is in 32 bit word
|
|
|
chip->ecc.strength = 24;
|
|
|
chip->ecc.layout = &nand_hw_eccoob_128;
|
|
@@ -1011,8 +1037,17 @@ static int ark_hwecc_nand_init_param(struct nand_chip *chip, struct mtd_info *mt
|
|
|
val &= ~(0x7 << 4);
|
|
|
val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
|
|
|
writel(val, rBCH_CR);
|
|
|
- }
|
|
|
-
|
|
|
+ } else if(mtd->oobsize >= 256) {
|
|
|
+ chip->ecc.bytes = BIT_24_ECC_BYTE;
|
|
|
+ chip->ecc.strength = 24;
|
|
|
+ chip->ecc.layout = &nand_hw_eccoob_256;
|
|
|
+ chip->ecc.prepad = nand_hw_eccoob_256.eccpos[0];
|
|
|
+ chip->ecc.postpad = nand_hw_eccoob_256.oobfree[0].offset;
|
|
|
+ val = readl(rBCH_CR);
|
|
|
+ val &= ~(0x7 << 4);
|
|
|
+ val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
|
|
|
+ writel(val, rBCH_CR);
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1112,7 +1147,7 @@ static int do_switchecc(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
|
val &= ~(0x7 << 4);
|
|
|
val |= (1 << 8) | (1 << 7) | (1 << 4) | (1 << 0);
|
|
|
writel(val, rBCH_CR);
|
|
|
- } else if(mtd->oobsize >= 128) {
|
|
|
+ } else if(mtd->oobsize >= 128 && mtd->oobsize <256) {
|
|
|
chip->ecc.bytes = BIT_24_ECC_BYTE; // should be 13 bytes but the ECC encoder register is in 32 bit word
|
|
|
chip->ecc.strength = 24;
|
|
|
chip->ecc.layout = &nand_hw_eccoob_128;
|
|
@@ -1122,7 +1157,17 @@ static int do_switchecc(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
|
val &= ~(0x7 << 4);
|
|
|
val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
|
|
|
writel(val, rBCH_CR);
|
|
|
- }
|
|
|
+ } else if(mtd->oobsize >= 256) {
|
|
|
+ chip->ecc.bytes = BIT_24_ECC_BYTE;
|
|
|
+ chip->ecc.strength = 24;
|
|
|
+ chip->ecc.layout = &nand_hw_eccoob_256;
|
|
|
+ chip->ecc.prepad = nand_hw_eccoob_256.eccpos[0];
|
|
|
+ chip->ecc.postpad = nand_hw_eccoob_256.oobfree[0].offset;
|
|
|
+ val = readl(rBCH_CR);
|
|
|
+ val &= ~(0x7 << 4);
|
|
|
+ val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
|
|
|
+ writel(val, rBCH_CR);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|