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/OMAP-L138:Linux/OMAP-L138:如何从 Linux 将 Linux 内核刷写到 NAND-Flash 分区

Guru**** 2036780 points
Other Parts Discussed in Thread: OMAP-L132
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/716126/linux-omap-l138-linux-omap-l138-how-to-flash-linux-kernel-into-nand-flash-partition-from-linux

器件型号:OMAP-L138
主题中讨论的其他器件:OMAP-L132

工具/软件:Linux

我必须从运行的 Linux 系统中将新的 Linux 内核更新(写入)到 NAND-Flash 分区。

要写入 NAND-Flash 的分区2、我使用带有选项"-p"的程序"nandwrite":

nandwrite /dev/mtd -p

但之后、我的电路板无法启动;引导加载程序"u-boot"抱怨加载内核时出现 CRC 错误。

我将在引导加载程序 Linux 内核中对 NAND-Flash 使用"4位 HW ECC 校正"。

对于引导加载程序"u-boot"、定义了:

#undef CONFIG_SYS_NAND_HW_ECC
#define CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
#define CONFIG_SYS_NAND_USE_FLASH_BBT

对于 Linux 内核(在特定于电路板的文件中)、定义如下:

静态结构 Davinci_aemif_timing gins_qmonixx_nand_timing ={
   //以纳秒为单位的所有时序
   .wsetup = 10、
   .wstrobe = 20、
   whold = 0、
   .rsetup=10、
   .rstrobe = 20、
   .rhold = 20、//要实现可靠的16位 NAND 操作、必须将 R_hold 设置为1、以确保 ECC 计算的2个时钟周期
   .TA = 60、
};

静态结构 Davinci_nand_pdata gins_qmonixx_nand_pdata ={
   .parts = gins_qmonixx_nand_parts、
   nr_parts = array_size (gins_qmonixx_nand_parts)、
   .options = NAND_BUSWIDTH_16、
   .timing =&gins_qmonixx_nand_timing、
   
   // ECC 配置
   //另请参见 U-Boot 的配置:CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST、CONFIG_SYS_NAND_USE_FLASH_BBT
   ecc_mode = NAND_ECC_HW、   //此处不要使用 NAND_ECC_HW_OOB_FIRST!
   ecc_bits = 4、
   .bBT_options = NAND_BBT_USE_FLASH、
};

问题可能出在哪呢?

备注:
如果我在引导加载程序"u-boot"的帮助下将 Linux 内核写入 NAND 闪存、则系统会成功启动!

提前感谢您的帮助!
Jan-Marc。

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

    MTDUtils 是写入 Nand 闪存分区的推荐工具。 查看 wiki:
    processors.wiki.ti.com/.../Mtdutils
    您可能使用了错误的命令。 检查上面的链接。

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

    Yordan、您好!

    感谢您的快速回答;但这对我没有什么帮助。

    我已经在引导加载程序"u-boot"和 Linux 内核中仔细检查了 EMIF CS3上 NAND-Flash 的初始化:
    -时序设置(此处为 EMIF 寄存器"A2CR"、分别为"CE3CFG")
    -"drivers/MTD/nand/Davinci_nand.c"中 ECC 模式的设置

    我还注意到以下情况:

    "要实现可靠的16位 NAND 操作、必须将 R_HOLD 设置为1、以确保 ECC 计算的2个时钟周期!"

    我在源代码中插入了消息、并在 Linux 内核启动期间获得了以下内容:

    (笑声)
    EMIFA CS3、A2CR = 0x0010009d
       SS = 0
       EW = 0
       W_SETUP = 0
       W_STROBE = 1
       W_HOLD = 0
       R_Setup = 0
       R_STROBE = 1
       R_HOLD = 1
       TA = 3.
       ASIZE = 1
    (笑声)
    NAND:找到器件、制造商 ID:0x2C、芯片 ID:0xcc
    NAND:Micron MT29F4G16ABADAM4
    NAND:512 MIB、SLC、擦除大小:128 KiB、页大小:2048、OOB 大小:64
    Davinci_n 和 Davinci_nand.1:chip.ecc.mode = NAND_ECC_HW_OOB_FIRST
    Davinci_n 和 Davinci_nand.1:chip.ecc.strength = 4位
    Davinci_n 和 Davinci_nand.1:chip.ecc.size = 512
    Davinci_n 和 Davinci_nand.1:chip.ecc.bytes = 10
    Davinci_n 和 Davinci_nand.1:chip.ecc.layout.eccbytes = 40
    Davinci_n 和 Davinci_nand.1:chip.ecc.layout.eccpos = 24、...、63
    Davinci_n 和 Davinci_nand.1:chip.ecc.layout.oobavail = 0
    (笑声)

    我还使用了"MTD-utils"中的测试程序(例如"nandbiterrs"或"nandpagetest"或"flash_readtest")。
    我始终收到错误消息例如:

    root@qmonixx:~#/usr/libexec/mtd-utils/flash_readtest /dev/mtd0
    读取测试页
    libmdd:错误!:无法将64个 OOB 字节写入地址512 (OOB 偏移量512)- mtd0 OOB 大小仅为64字节
    读取块0第1页中的 OOB 时出错

    我敦促大家提供帮助。
    如果有任何提示、我将不胜感激!

    此致、
    Jan-Marc。

     

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

    您是否使用最新的处理器 SDK Linux:
    www.ti.com/.../processor-sdk-omapl138

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

    感谢你的答复。

    我们不使用 TI SDK。
    我们使用"YoctoProject"创建 BSP (引导加载程序"u-boot"、Linux 内核和根文件系统)。

    引导加载程序"u-boot"的当前版本为"2017.07"
    内核的当前版本为"4.4.25"
    我们使用的是来自"kernel.org 的"主线 Linux 内核"。

    引导程序和 Linux 内核在处理 NAND 闪存方面必须存在差异。
    可能可以在文件"drivers/MTD/nand/Davinci_nand.c"中找到差异。
    不幸的是,我不知道如何解决这个问题。

    我知道 TI 维护自己版本的 Linux 内核("ti-linux")和引导加载程序"u-boot"("ti-uboot")。
    这些版本中是否已处理此问题?
    您能告诉我问题在哪个版本的"ti-linux"或"ti-u-boot"中得到了解决吗?

    如果有任何建议,我会很感激!

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

    [报价]这些版本中是否已处理此问题?
    您能告诉我问题在哪个版本的"ti-linux"或"ti-u-boot"中得到了解决吗?

    我没有收到有关此类行为的投诉、也无法告诉您 TI 版本是否会遇到此类行为。 您可以比较内核/u-boot 驱动程序、但它们应该相同。 在我看来,问题是 DTS 文件中的 nand 配置。

    您可以看到如何在 da850-lcdk.dts 中设置 nand:
    aemif{(&A)
    pinctrl-names ="default";
    pinctrl-0 =<&N 和_pines>;
    状态="正常";
    CS3{
    #address-cells =<2>;
    大小单元格=<1>;
    时钟范围;
    范围;

    TI、cs-chipselect =<3>;

    NAND@2000000、0{
    兼容="ti、davinci-nand";
    #address-cells =<1>;
    大小单元格=<1>;
    REG =<0 0x02000000 0x02000000
    1 0x00000000 0x00008000>;

    TI、Davinci-chipselect =<1>;
    TI、Davinci-mask-ale =<0>;
    TI、Davinci-mask-cle =<0>;
    TI、Davinci-mask-chipsel =<0>;

    TI、Davinci-nand-buswidth =<16>;
    TI、Davinci-ECC-mode ="HW";
    TI、Davinci-ECC-BITS =<4>;
    TI、Davinci-nand-use-BBT;

    /*
    * OMAP-L132/L138引导加载程序文档 SPRAB41E 内容如下:
    "要从 NAND 闪存引导、应写入 AIS
    *至 NAND 块1 (默认情况下不使用 NAND 块0)"。
    *同一个文档提到、对于 ROM 的"器件修订版本2.1"、
    *"更新了 NAND 引导模式以提供从块0或块1的引导"。
    *但默认情况下、此处保留了兼容性限制
    *因为它需要新的引导引脚设置
    *在库存 LCDK 中不可能。
    *
    分区{
    兼容="固定分区";
    #address-cells =<1>;
    大小单元格=<1>;

    分区@0{
    标签="u-boot env";
    reg =<0 0x020000>;
    };
    分区@0x020000 {
    /* LCDK 默认从此分区引导*/
    标签="u-boot";
    REG =<0x020000 0x080000>;
    };
    分区@0x0a0000{
    标签="可用空间";
    reg =<0x0a0000 0>;
    };
    };
    };
    };
    };

    确保在内核中使用相同的设置。

    此致、
    Yordan