有人知道真么再U-BOOT和内核中添加BCH4的ECC校验么

wuqingchen111 2018-11-02 10:14:00
我尝试再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;
...全文
138 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuqingchen111 2018-11-02
  • 打赏
  • 举报
回复
有大佬知道么?

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧