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.

[参考译文] AM3352:NAND 闪存问题

Guru**** 2544130 points
Other Parts Discussed in Thread: TPS65217

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/602735/am3352-nand-flash-problem

器件型号:AM3352
主题中讨论的其他器件:TPS65217

您好!

我在定制板中遇到与 nand flash 相关的问题。 Nand 芯片为 Toshiba TH58BVG3S0HTAI0。 nand 从 u-boot 运行正常、但当我尝试从 Linux 执行 ubiattach 时、我会收到以下消息:

ubiattach /dev/ubi_ctrl -m、5
[2464.815719] ubi0:连接 mtd5
[2465.071990] ubi0:扫描完成
[2465.075975] ubi0:检测到空 MTD 设备
[2465.081179] ubi0错误:ubi_EARLY_GET_PEB:无可用的擦块
[2465.087968] ubi0错误:ubi_attach_MTD_dev:无法连接 mtd5,错误-28
ubibattach:ubi_IOCATT:器件上没有剩余空间

DTS 配置为:

nandflash_pins_s0:nandflash_pins_s0{
pinctrl-single、pins =<
0x0 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD0.GPMC_AD0 */
0x4 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD1.GPMC_AD1 */
0x8 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD2.GPMC_AD2 *
0xc (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD3.GPMC_AD3 *
0x10 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD4.GPMC_AD4 */
0x14 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD5.GPMC_AD5 *
0x18 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD6.GPMC_AD6 *
0x1c (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_AD7.GPMC_AD7 *
0x70 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_wait0.GPMC_wait0 */
0x74 (PIN_INPUT_PULLUP | MUX_MODE7)/* GPMC_WPN.GPIO0_30 */
0x7c (PIN_OUTPUT | MUX_MODE0)/* GPMC_csn0.GPMC_csn0 */
0x90 (PIN_OUTPUT | MUX_MODE0)/* GPMC_advn_ALe.GPMC_advn_ALE */
0x94 (PIN_OUTPUT | MUX_MODE0)/* GPMC_oen_ren。GPMC_oen_ren *
0x98 (PIN_OUTPUT | MUX_MODE0)/* GPMC_WN.GPMC_Wen */
0x9C (PIN_OUTPUT | MUX_MODE0)/* GPMC_be0n_cle。GPMC_be0n_cle *
>;
};

GPMC{
pinctrl-names ="default";
pinctrl-0 =</nandflash_pins_s0>;
范围=<0 0x08000000 0x20000000>;
状态="正常";

NAND@0、0{
兼容="ti、OMAP2-nand";
reg =<0 0 4>;
interrupt-parent =<&GPMC>;
中断=<0 IRQ_TYPE_None>、<1 IRQ_TYPE_None>;
RB-GPIO =<&GPMC 0 GPIO_ACTIVE_HIGH_>;
NAND-BUS 宽度=<8>;
TI、nand-ecc-opt ="bch8";
TI、nand-xfer-type ="轮询";

GPMC、DEVACE-NAND ="true";
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、总线翻转-ns =<0>;
GPMC、cycle2cycle-delay-ns =<0>;
GPMC、clk-activation-ns =<0>;
GPMC、wr 访问-ns =<40>;
GPMC、wr-data-mux-bus-ns =<0>;

#address-cells =<1>;
大小单元格=<1>;
TI、elm-id =<和 elm>;

分区@0{
标签="NAND.SPL";
REG =<0x00000000 0x000040000>;
};
分区@1{
标签="NAND.u-BOOT";
REG =<0x00040000 0x00100000 >;
};
分区@2{
标签="NAND.u-boot-env";
REG =<0x00140000 0x00040000>;
};
分区@3{
标签="NAND.DTB";
REG =<0x00180000 0x00040000>;
};
分区@4{
标签="NAND.kernel";
REG =<0x001C0000 0x00800000>;
};
分区@5{
标签="NAND.rootfs";
REG =<0x009c0000 0x3f640000>;
};
};
};

内核引导的输出为:

[1.859673] OMAP-GPMC 50000000。GPMC:GPMC 版本6.0
[1.865450] GPMC_mem_init:禁用映射在0x0-0x1000000的 CS 0
[1.873889] Nand:找到器件、制造商 ID:0x98、芯片 ID:0xd3
[1.880695] Nand:Toshiba NAND 1GiB 3、3V 8位
[1.885385] Nand:1024 MIB、SLC、擦除大小:256 KiB、页面大小:4096、OOB 大小:128
[1.893573] nand:Using OMAP-ECC_BCH8_CODE_HW_DETECTing_SW
[1.904845]在 MTD 器件 OMAP2-nand.0上找到6个部件分区
[1.911268]在"OMAP2-nand.0"上创建6个 MTD 分区:
[1.916886] 0x000000000000-0x000000040000:“分区”
[1.931165] 0x000000040000-0x000000140000:“partition”
[1.945078] 0x000000140000-0x000000180000:"分区"
[1.955133] mmc0:主机不支持读取只读开关、假设已启用写入
[1.966589] 0x000000180000-0x0000001c0000:"分区"
[1.975140] mmc0:地址0001处的新高速 SDHC 卡
[1.985655] mmcblk0:mmc0:0001 team 29.5GiB
[1.996151] 0x0000001c0000-0x0000009c0000:“PARTITION”
[2.008685] mmcblk0:P1
[2.019145] 0x0000009c0000-0x000040000000:"分区"
[2.328784] tps65217 0-0024:TPS65217 ID 0xe 版本1.2
[2.334657] OMAP_i2c 44e0b000。i2c:总线0 rev0.11、频率为400kHz

我从 nand (MLO、uboot、dtb、kernel)引导设备,并使用 MMC 的 rootfs。 nand 芯片已使用"nand erase.chip"从 uboot 中擦除

非常感谢、

此致、

Ioannis

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

    1.您是否在 mtd5分区内格式化/刷新了 ubifs?
    2.您是否尝试过-O 选项,即页面大小?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢你的答复。 我认为格式和子文件的制定还很早。 我只是尝试连接到空卷、但无法正常工作。 它看起来与 nand 配置参数有问题(因为同一个芯片在 u-boot 上工作)、但 它们中有很多、我丢失了。

    此致、

    Ioannis

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

    在 Linux 中、您看到的是以下命令的结果
    # flash_eraseall /dev/mtd5

    您可以转储 GPMC 寄存器、并在 uboot 和内核中对它们进行比较、以获得快速差异。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    我认为这还不会是 NAND 配置的问题。 由于在内核引导日志中读取 NAND ID、基本配置似乎正常。
    如果能够成功执行诸如 flash_eraseall 之类的非 ubi 操作、则可能需要将分区格式化为 UBI 卷。

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

    您好!

    感谢您的努力。 这个闪存芯片的奇怪之处是它有4096页大小和128字节的备用空间。 我认为、通常具有4096字节页面的闪存具有224字节的备用区域。 为了使其正常工作、我在 u-boot 中对 CONFIG_SYS_NAND_ECCPOS 进行了以下修改:

    £define CONFIG_ENV_IS _IN_NAND

    #define CONFIG_SYS_NAND_5_ADDR_CYCLE

    #define CONFIG_SYS_NAND_PAGE_COUNT (CONFIG_SYS_NAND_BLOCK _SIZE /\

    CONFIG_SYS_NAND_PAGE_SIZE)

    #define CONFIG_SYS_NAND_PAGE_SIZE 4096

    #define CONFIG_SYS_NAND_OOBSIZE 128

    #define CONFIG_SYS_NAND_BLOCK_SIZE (256*1024)

    #define CONFIG_NAND_OMAP-GPMC

    #define CONFIG_NAND_OMAP-GPMC_PREFetch

    #define CONFIG_NAND_OMAP-ELM

    #define CONFIG_SYS_NAND_BAD_BAD_BLOCK_POS NAND_LARGE_BADBLOCK_POS

    #define CONFIG_SYS_NAND_ECCPOS{2、3、4、5、6、 7、8、9、10、11、 12、13、14、15、\

    16、17、18、19、20、 21、22、23、24、25、 26、27、\

    28、29、30、31、32、 33、34、35、36、37、 38、39、\

    40、41、42、43、44、 45、46、47、48、49、 50、51、\

    52、53、54、55、56、 57、58、59、60、61、 62、63、\

    64、65、66、67、68、 69、70、71、72、73、 74、75、\

    76、77、78、79、80、 81、82、83、84、85、 86、87、\

    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、}

    /*

    #define CONFIG_SYS_NAND_ECCPOS{2、3、4、5、6、 7、8、9、\

    10、11、12、13、14、 15、16、17、\

    18、19、20、21、22、 23、24、25、\

    26、27、28、29、30、 31、32、33、\

    34、35、36、37、38、 39、40、41、\

    42、43、44、45、46、 47、48、49、\

    50、51、52、53、54、 55、56、57、}

    *

    #define CONFIG_SYS_NAND_ECCSIZE 512

    #define CONFIG_SYS_NAND_ECCBYTES 14.

    #define CONFIG_SYS_NAND_ONFI_DETING

    #define CONFIG_NAND_OMAP-ECCSCHEME OMAP-ECC_BCH8_CODE_HW

    您知道 Linux 中是否有类似的 eccpos 定义、还是自动计算?

    此致、

    Ioannis

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

    它被拆分并在文件中分配:drivers/MTD/nand/OMAP2.c

    检查它、检查它中的 eccpos。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我再次阅读 Toshiba TH58BVG3S0HTAI0的数据表。 闪存芯片似乎具有硬件 ECC 的内部逻辑。 有人知道、如何从 u-boot spl 禁用 ECC?

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

    您确定 Toshiba 在内部提供 ECC 硬件逻辑吗? 通常、NAND 芯片提供备用区域、主机控制器(AM335x 中的 NAND 控制器)可以在其中计算和存储 ECC。

    禁用 ECC 没有简单的方法、因为它不局限于一个宏。 处理器 SDK 中默认启用 ECC 代码。 您的软件包是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    下面是数据表中的复制粘贴:

    TH58BVG3S0HTAI0在芯片上具有 ECC 逻辑、每个528Bytes 的8位读取错误都可以纠正

    内部.... 每个528Byte 的8位 ECC 在芯片上执行......

    我使用的软件是 git 的 ti-u-boot 以及内核和 rootf 的 openwrt。 内核版本为4.4.14

    此致、

    Ioannis

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

    这对我来说是新的。 谢谢! 是的、NAND 芯片本身支持 ECC。 我知道您能够更改 ECC 布局、然后在 uboot 中工作。 我认为这是前进的道路、您也需要在内核中尝试类似的 ECC 布局。 在 uboot 中禁用 ECC 可能并不容易、因为在最新的 uboot 中没有更清晰的方法来禁用 AM335x 板的 ECC。 此外、NAND 芯片的 ECC 计算不会干扰 AM335x 的 ECC 计算、因为它在 uboot 中工作、并且启用了 ECC。 是这样吗? 检查是否有禁用 NAND 芯片 ECC 的方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、它适用于 uboot。 明天的计划是保留 u-boot 的 ECC、我将尝试在内核中禁用它。 我看到内核 menuconfig 中有相应的配置。 然后、我将尝试使用 flash_eraseall 从 Linux 中擦除 MTD 分区。 听起来不是很容易理解、但我无法想到其他东西。 否则、我将更改闪存芯片。

    非常感谢。

    Ioannis