有人知道真么再U-BOOT和内核中添加BCH4的ECC校验么
我尝试再arch/arm/mach-omap2/board-am335xevm.c中更改但是跟踪代码到下面函数中后发现并没有BCH4的纠错U-boot中也在ti81xx_nand.c中的__ti81xx_nand_switch_ecc函数中提示不支持请问有大佬知道如何添加么
static int omap_correct_data(struct mtd_info *mtd, u_char *dat,
u_char *read_ecc, u_char *calc_ecc)
{
struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
mtd);
int blockCnt = 0, i = 0, ret = 0;
int stat = 0;
int j, eccsize, eccflag, count;
unsigned int err_loc[8];
/* Ex NAND_ECC_HW12_2048 */
if ((info->nand.ecc.mode == NAND_ECC_HW) &&
(info->nand.ecc.size == 2048))
blockCnt = 4;
else
blockCnt = 1;
switch (info->ecc_opt) {
case OMAP_ECC_HAMMING_CODE_HW:
case OMAP_ECC_HAMMING_CODE_HW_ROMCODE:
for (i = 0; i < blockCnt; i++) {
if (memcmp(read_ecc, calc_ecc, 3) != 0) {
ret = omap_compare_ecc(read_ecc, calc_ecc, dat);
if (ret < 0)
return ret;
/* keep track of number of corrected errors */
stat += ret;
}
read_ecc += 3;
calc_ecc += 3;
dat += 512;
}
break;
case OMAP_ECC_BCH8_CODE_HW:
eccsize = BCH8_ECC_OOB_BYTES;
for (i = 0; i < blockCnt; i++) {
#if 1
if (memcmp(read_ecc, calc_ecc, 13) == 0) {
continue;
}
#endif
eccflag = 0;
/* check if area is flashed */
for (j = 0; (j < eccsize) && (eccflag == 0); j++)
if (read_ecc[j] != 0xFF)
eccflag = 1;
if (eccflag == 1) {
eccflag = 0;
/* check if any ecc error */
for (j = 0; (j < eccsize) && (eccflag == 0);
j++)
if (calc_ecc[j] != 0)
eccflag = 1;
}
count = 0;
if (eccflag == 1)
count = omap_elm_decode_bch_error(0, calc_ecc,
err_loc);
/* Uncorrectable error reported */
if (count < 0)
return count;
for (j = 0; j < count; j++) {
u32 bit_pos, byte_pos;
bit_pos = err_loc[j] % 8;
byte_pos = (BCH8_ECC_MAX - err_loc[j] - 1) / 8; /*(512+13)X8*/
if (err_loc[j] < BCH8_ECC_MAX) {
/*
* Check bit flip error reported in data
* area, if yes correct bit flip, else
* bit flip in OOB area.
*/
if (byte_pos < 512)
dat[byte_pos] ^= 1 << bit_pos;
else
read_ecc[byte_pos - 512] ^=
1 << bit_pos;
}
/* else, not interested to correct ecc */
}
stat += count;
calc_ecc = calc_ecc + OMAP_BCH8_ECC_SECT_BYTES;
read_ecc = read_ecc + OMAP_BCH8_ECC_SECT_BYTES;
dat += BCH8_ECC_BYTES;
}
break;