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/AM3352:NAND 固件更新问题

Guru**** 2578945 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595002/linux-am3352-nand-firmware-update-issue

器件型号:AM3352

工具/软件:Linux

大家好

我的定制板使用 Macronix MX30LF1GE8AB nand 闪存、具有128MiB、SLC、页面大小= 2048、OOB 大小= 64

和其他信息:

页面大小   2048b

OOB 大小    64b

擦除大小   为131072b

子页大小  512b

选项       0x4000000c

BBT 选项   0x8000

现在、我想在用户空间升级固件、因此我编写如下代码:

fd = open ("/dev/mtdN、O_RDWR|O_sync);
assert (//* open check */);

do{

do_erase (fd、0x20000);//擦除128k */

do{
wlen =写入(fd、buf+offser、1k);
fsync (FD);
}while (//*运行128次*/);

}while (//*所有固件大小*/); 

但是、当写入126倍的 Nand 闪存写入时、假设只输入1个字节的数据线、

但我的代码显示有1k 字节数据、

日志显示如下:

用户空间:wlen 返回1024字节

驱动程序:NAND 驱动程序操作:NAND_WRITE 1字节 NAND:尝试写入非页对齐数据

USER_SPACE 写入返回1k、但驱动程序仅显示1字节数据写入

我的 rootfs 格式是 ubifs,所以我使用 fsync ()来同步它!

请~我的位置

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Phil、

    我将看一下这个、然后返回我的反馈。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新更多信息、
    当我重新启动时、uboot 显示如下日志:
    NAND:位翻转校正@OOB=6
    NAND:位翻转已更正@DATA=379
    NAND:位翻转已更正@DATA=303
    NAND:位翻转校正了@DATA=24
    NAND:位翻转校正@数据=509
    NAND:位翻转校正了@DATA=110
    NAND:位翻转已更正@DATA=428
    …………
    …………
    …………
    我的内核工作正常、但无法加载屋顶、我的屋顶格式为 ubifs
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更多信息:

    我在内核中修改 nand flash EEC 配置(4.4.32)

    在 arch/arm/mach-omap2/board-flash.c 中:

    无效

    __init board_nand_init (struct mtd_partition *nand_parts、u8 nr_parts、u8 cs、

            int nand_type、struct GPMC_timings * GPMC_t)

      board_nand_data.cs   = cs;

      Board_nand_data.parts   = nand_parts;

      Board_nand_data.nr_parts  = nr_parts;

      board_nand_data.devsize  = nand_type;

    - board_nand_data.ecc_opt = OMAP-ECC_HAM1_CODE_SW;

    + board_nand_data.ecc_opt = OMAP-ECC_BCH8_code_HW

      GPMC_nand_init (&board_nand_data、GPMC_t);

    和状态变化:

    USER_SPACE:  

        wlen =写入(fd、buf、1024);// wlen 返回1K

    内核空间:

    在 driver/MTD/nand/nand_base.c 中

         静态 int nand_write (...)

         写入大小 len = 1024

         写入大小 len = 1  (发生两次!?)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一下、我正在通过 ubboot 刷写 rootfs (ubifs) img、但通过 Linux 刷写会出错
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Phil、

    您是否尝试过使用 MTD 实用程序及其命令行实用程序(如 nand_write ( processors.wiki.ti.com/.../Mtdutils )? 您可以将它们与您自己的 NAND 写入应用进行比较、看看两者之间的区别。 检查 MTD 实用程序中函数 MTD_write()的源代码,该实用程序执行 Nand 写入操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复 、我参考了 MTD_WRITE:

    在 MTD_WRITE (){

    if (OOB){

      // fillin write_request_ops

      (笑声)

      …

      RET = ioctl (FD、MEMWRITE、&ops);

      (笑声)

       MTD_WRITE_OOB ();

    if (data){

      /*lseek 数据*/

      RET =写入(FD、数据、len);//wirte 数据

    我认为不需要在我的代码中执行 OOB 操作? 对吧?

    它就像我的代码一样、

    我用十六进制格式打印线"再见"数据、即0x0a

    始终为0x0a、 是否可以获得任何线索?

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

    您好、Phil、

    建议您尝试在电路板中使用 MTD 实用程序。 从 Linux 终端、您能不能

    # flash_eraseall /dev/mtdX
    # nandwrite -p /dev/mtdX 图像

    nanddump /dev/mtdX

    如果没有要写入的 OOB 数据、我认为无需使用应用程序中的 OOB。
    其中 X 是所需的分区号。