This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM3354:新 NAND 存储器出现 UBifs ECC 错误

Guru**** 2964790 points

Other Parts Discussed in Thread: AM3354

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/675618/linux-am3354-ubifs-ecc-error-with-new-nand-memory

器件型号:AM3354

工具/软件:Linux

你(们)好

  我们将 AM3354 +处理器 SDK 03.02.00.05与内核4.4.3.2结合使用。

  最初、我们使用的是 Nand 闪存芯片 Spanion S34ML08G101TF100

  规格为1GB capacity.2k page.128k 块和512个子页大小。

  我们将 BCH8 ECC 用于 uboot 和内核。我们将使用 UBIFS 作为处理器 SDK 的默认选择。

  它工作正常。

  现在、我需要切换到另一个型号为 Samsung K9K8G08U0E 的 nand 闪存芯片。

  根据规格、它看起来基本上与 Spansion 芯片相同。相同的容量。相同的页/块/子页大小和所有。

  因此、我想、我可能不需要更改任何代码即可使该芯片正常工作?

  当我首次使用此 Samsung 芯片启动内核时、看起来不错。 但在重新启动后。 内核启动时会打印这些 ECC 错误。

  如下所示:

OMAP-GPMC 50000000。GPMC:GPMC 版本6.0
GPMC_mem_init:禁用映射在0x0-0x1000000的 CS 0
NAND:找到器件、制造商 ID:0xEC、芯片 ID:0xD3
NAND:Samsung NAND 1GiB 3、3V 8位
NAND:1024 MIB、SLC、擦除大小:128 KiB、页面大小:2048、OOB 大小:64
NAND:使用 OMAP-ECC_BCH8_CODE_HW ECC 方案
9在 MTD 器件8000000.nand 上找到部件分区
在"8000000.nand"上创建9个 MTD 分区:
0x0000000000000000 0x000000020000:“NAND.SPL”
0x00000002000-0x000000040000:“NAND.SPL.Backup1”
0x000000040000-0x000000060000:“NAND.SPL.Backup2”
0x000000060000-0x000000080000:“NAND.SPL.backup3”
0x000000080000-0x000000260000:“NAND.u-boot”
0x000000260000-0x000000280000:“NAND.u-boot-env”
0x000000280000-0x000000580000:“NAND.LOGO”
0x000000580000-0x000000a80000:“NAND.kernel”
0x000000a80000-0x000040000000:“rootfs”
ubi0:连接 mtd8
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
ubi0警告:ubi_io_read:从 PEB 1885:0读取64个字节时出错-74 (ECC 错误)、只读64个字节、然后重试
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
OMAP2-nand 8000000.nand:找到不可纠正的位翻转
ubi0警告:ubi_io_read:从 PEB 1885:0读取64个字节时出错-74 (ECC 错误)、只读64个字节、然后重试

我要附上 nand chips.and my DTS file 的规范。

e2e.ti.com/.../2553.k9k8g08u0e_2D00_sib0.pdfe2e.ti.com/.../7343.S34ML08G1.pdfe2e.ti.com/.../8322.am335x_2D00_evm.dts.txt

您能帮我找出可能的原因吗?

感谢大家。

延东

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还将附加命令以生成 UBI 二进制文件。

    我仔细检查了这些命令的参数...它似乎不是由错误的参数引起的...?

    mkfs.ubifs -r rootfs-cutout/-m 2048 -e 129024 -c 8108 -F -o ubi.in
    ubbinize -o root.bin -m 2048 -p 128KiB -s 512 ubinize.cfg

    ubinize.cfg 类似于:

    [子项]
    mode=ubi
    image=ubi.in
    VOL_id=0
    VOL_SIZE = 950MiB
    VOL_TYPE=动态
    Vol_alignment=1.
    VOL_NAME=rootfs
    VOL_flags=自动大小

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我观察到的另一件奇怪的事情是:

    新的 Samsung 闪存在旧版内核3.2.0上工作正常

    而3.2.0和4.4内核共享完全相同的 GPMC 时序设置。

    静态结构 GPMC_时序 AM335x_nand_时序={

    SYNC_clk = 0、

    .cs_on = 0、

    cs_rd_off = 44、

    CS_wr_off = 44、

    .adv_on = 6、

    .adv_rd_off = 34、

    .adv_wr_off = 44、

    .we_off = 40、

    .OE_OFF = 54、

    .access = 64、

    .rd_cycle = 82、

    .wR_cycle = 82、

    .wr 访问= 40、

    .wR_DATA_MUX_BUS = 0、

    };

    和

    NAND-BUS 宽度=<8>;

    GPMC、器件宽度=<1>;

    GPMC、SYNC-clk-ps =<0>;

    GPMC、cs-on-ns =<0>;

    GPMC、cs-rd-Off-ns =<44>;

    GPMC、cs-wr-off-ns =<44>;

    GPMC、Adv-on-ns =<6>;

    GPMC、Ad-rd -关闭-ns =<34>;

    GPMC、AdV-wr-off-ns =<44>;

    GPMC、WE-ON-ns =<0>;

    GPMC、WE-OFF-ns =<40>;

    GPMC、OE-ON-ns =<0>;

    GPMC、OE-OFF-ns =<54>;

    GPMC、ACCESS ns =<64>;

    GPMC、第周期-ns =<82>;

    GPMC、功率周期-ns =<82>;

    GPMC、等待读取="真";

    GPMC、写入等待="真";

    GPMC、总线翻转-ns =<0>;

    GPMC、cycle2cycle-delay-ns =<0>;

    GPMC、clk-activation-ns =<0>;

    GPMC、等待监控 ns =<0>;

    GPMC、wr 访问-ns =<40>;

    GPMC、wr-data-mux-bus-ns =<0>;

     

    因此、我怀疑问题也不是由计时设置引起的?

    否则、3.2.0内核也会出现问题。

    区别在于3.2.0是通过 yaffs2安装 rootfs。

    4.4内核将 rootfs 安装为 UBIFS

    3.2.0对 uboot 和内核使用 OMAP-ECC_hamming_code_HW ECC。

    4.4使用 BCH8。

    但我尝试针对4.4内核和 uboot 切换到 OMA_ECC_HAM1_CODE_HW、但结果未解决。

    存在恒定误差

    ubi0:在 PEB 1398上检测到可修复的位翻转

    OMAP-ECC_HAM1_CODE_SW ECC 也不会像我尝试过的那样在4.4内核上工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    刚刚使用04.02.00.09 SDK 在最新的4.9内核上尝试过
    误差是相同的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    U-Boot 是否已更新以了解不同闪存的变化?

    您是否使用04.02.00.09 SDK 随附的默认内核配置? 如果不是、您可以将其附加到此帖子吗? 另外、您能否记下04.02.00.09 SDK 的完整启动日志?

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好 、Schuyler

       感谢你的答复。

       我不确定您所说的“U-Boot 是否已更新”是什么?

       令我感到困惑的是、新闪存具有与旧闪存相同的规格。 页面大小块大小.OOB 大小等 时间要求不同? 我不确定还有什么...

       我将连接04 SDK 的内核配置。  

       这并不完全是默认值、因为我针对自己的电路板进行了一些调整。 但基本上是相同的。  

       此处:

       e2e.ti.com/.../IQ8_2D00_config_2D00_4.9.txt

      我还将附加原始内核配置:

    e2e.ti.com/.../am335x_2D00_evm_2D00_original_2D00_config.txt

      

     我要附加04 SDK 的完整引导日志。 第一次引导成功。 重新引导后的第二次引导失败。

     首次启动:

      e2e.ti.com/.../4.9-kernel-1st-boot.txt

     第二次启动失败:

      e2e.ti.com/.../4.9-kernel-2nd-boot.txt

    谢谢

    延东

        

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    昨天的另一个发现是:

    我尝试转储 rootfs 分区的 nand 数据。并在旧闪存和新闪存之间进行比较。

    基本上,我想转储整个 rootfs 分区并将数据保存到 MMC 卡。

    下面是我所做的:

    在 u-boot 命令行中:

    纳瓦级硬件2.

    NAND 读取.e 0x82000000 0xa80000 0xEBA0000

    然后使用 MMC write 命令来编写 MMC (我不确定这是否起作用。 尚未尝试。)

    现在

    第一条命令。

    NAND 读取.e 0x82000000 0xa80000 0xEBA0000


    0xa80000是 rootfs 的起始值、 0xEBA0000是以字节为单位的 rootfs 大小。


    我假设 u-boot 将读取 Nand 并在读取时检查 ECC。原因这就是它是"read.e"的原因。 对吧?

    我发现在为新闪存执行 read.e 命令时没有报告错误。

    这意味着当 u-boot 使用 BCH8写入新的 nand 时。 还可以 至少当时新 nand 中的数据是可以的。对吧?

    否则、u-boot 将在读取期间报告类似"Error: Bad Compare! 失败"。或"错误:ECC 错误"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有关使用 u-boot 转储新 nand 闪存的最新发现。

    我成功地将 新 nand 闪存的 rootfs 区域转换为 MMC 卡。(在使用 u-boot 写入 nand 闪存后。 而不实际启动内核。 原因安装 rootfs 会在一定程度上更改 rootfs 数据)

    然后将其与我用于下载到 nand 的 root.bin 文件进行二进制比较。

    它们是相同的。

    这意味着在 u-boot 级。 编程是否正常?

    我所做的是:

    纳瓦级硬件2.

    NAND read.e 0x82000000 0xa80000 0xEBA0000 (0xa80000是 rootfs 的起始值、0xEBA0000是以字节为单位的 rootfs 大小。)

    MMC 重新扫描

    MMC 写入0x82000000 0 482560 (只需将数据写入 MMC 卡的起始块0即可。 大小= 0xEBA0000/512=482560)

    然后将 MMC 插入我的 Linux PC

    DD if=/dev/sdb of=dump BS=250m count=1

    并将文件"dump"与 root.bin 进行比较。

    它们看起来是一样的。

    结果可能是解释第1个安装是否正常的原因。 然而、在第二次启动时、内核报告 ECC 错误。

    原因第一次启动时,nand 数据确实是干净的,还可以。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有人可以帮我吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我解决了这个问题。

    实际上、Nand 计时设置是好的。

    bch8 ECC 或所选的任何 ECC 都没有问题。

    问题出在 UBIFS 本身。

    UBIFS 将尽量访问子页。

    此外、由于 Nand 驱动程序无法正确确定芯片是否真正支持子页访问。

    这是一个问题。

    棘手的问题是、我无法在 nand 规格本身上找到任何有关子页大小的信息。

    但是、虽然我的旧 Spansion nand 闪存可以支持512字节的子页访问。

    三星闪存不能。

    这就是为什么 ubifs 引导 up.it 后尝试更改闪存中的某些内容。并完成所有错误的更新。

    这也解释了为什么我的 yaffs2在 ubifs 失败时还可以。

    解决方案是禁用 Nand 驱动程序内的子页访问。

    这样子页大小=page 大小=2k

    驱动程序/MTD/nand/OMAP2.c

    NAND_CHIP->OPTIONS |= NAND_NO_SUBPAGE_WRITE;

    同时。

    调整 mkfs.ubifs 和 ubbinize 命令参数以相应地满足2k 子页要求。

    mkfs.ubifs -r rootfs-cutout/-m 2048 -e 126976 -c 8108 -F -o ubi.in
    ubbinize -o root.bin -m 2048 -p 128KiB -s 2048 ubinize.cfg

    就这些。