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**** 2609895 points
Other Parts Discussed in Thread: AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/653722/linux-am3352-nand-boot-fails

器件型号:AM3352

工具/软件:Linux

大家好。

我使用 AM3352制作了一个内核板、硬件设计参考 BeagleBone Black。 当我将 sysboot [15:0]设置为 01 00 0 10 0 10111时、MLO 和 uboot 可以正常运行、但当我将 sysboot[15:0]设置为 01 00 0 10 0 10011时、控制台串行端口仅具有 CCCC。

我知道控制台打印 CCCC 意味着 sysboot 模式错误或 nand 闪存中没有 MLO。 我使用 CCS 和 JTAG 读取0x44e10040存储器、结果是00400393、这意味着我的 sysboot 模式设置是否正常? 当 sysboot[15:0]为 01 00 00 0 10 0 10011时、当 MMC0有 SD 卡时、电路板也可以从 MMC0启动、在 uboot shell 中、使用 nand dump 0命令读取闪存页0、其中包含日期:

U-Boot# nand dump 0
页00000000转储:
40 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 43 48 53 45 54 49 4e 47 53 00
FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF
FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF
c1 c0 c0 c0 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
AD 80 01 00 04 2f 40 14 00 ea 14 f0 9f e5
14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5
14 f0 9f E5 14 f0 9f E5 20 04 2f 40 24 04 2f 40
28 04 2f 40 2c 04 2f 40 30 04 2f 40 34 04 2f 40
38 04 2f 40 78 56 34 12 00 80 00 fc d0 3f

从 Nand PAGE 0读取的日期与 MLO 文件相同、这意味着 MLO 已写入闪存。 我还将 uimage 和 ubi.img 写入闪存、然后 int uboot shell run nandboot、board 可以从闪存读取 uimage 和 ubi.img 并运行良好。

但是电路板无法从 nand flash 启动、控制台只打印 CCCC……电路板有什么问题?  

nand 闪存为 S34ML02G200TIF000、我是否需要修改 uboot 代码?e2e.ti.com/.../cypress_2800_2G_2D00_S34ML02G200TFI000_2900_.pdf

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

    "CCCC..." 控制台的打印输出并不意味着"sysboot 模式错误或 nand flash 中没有 MLO"。 这只是 UART 引导的同步字符。

    NAND 的页面大小/OOB 大小是多少? 您使用的是什么 ECC? NAND 如何连接?

    请阅读 AM335x TRM 版本 P 的第26.1.8.4节、并检查您是否满足所有要求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Biser

    我的 Nand 闪存的页面为2048字节、OOB 为128字节、ECC 为 BCH8、以下消息来自 Nand 闪存数据表:

    –输入/输出总线宽度:8位

    –页面大小:

    –×8:

    2 GB /4 GB:(2048 + 128)字节;128字节备用区域

    这是原理图:

    我用于修改具有128字节的 uboot 代码:

    AM335x_EVM.h:

    #define CONFIG_SYS_NAND_OOBSIZE 128//64

    OMAP-GPMC.h:

    #define GPMC_NAND_HW_BCH8_ECC_LO布局{\
    eccbytes = 56、\
    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}、\
    .oobfree ={\
    {.offset = 58、\
    .length = 70/*6*/}\

    在 drivers\mtd\n 和\nand_base.c 文件中、修改 nand_get_flash_type 函数:

    /* Calc blocksize */
    MTD->erasesize =(128 * 1024)<<
    (((extid >> 1)& 0x04)|(extid & 0x03));
    总线= 0;
    }否则{
    /* Calc 页面大小*/
    mtd->writesize = 1024 <<(extid & 0x03);
    extid >=2;
    /* Calc oobsize */
    //MTD->oobsize =(8 <<(extid & 0x01))*
    //(MTD->writesize >> 9);
    MTD->oobsize = 128;       //强制 OOB 大小为128
    extid >=2;
    /*计算块大小。 块大小是64KiB 的倍数*/
    mtd->erasesize =(64 * 1024)<<(extid & 0x03);
    extid >=2;
    /*获取总线宽度信息*/
    总线=(extid & 0x01)? NAND_BUSWIDTH_16:0;

    经过这些修改后、没有任何效果。

    我使用 u-boot-2013.01.01-psp06.00.00.00

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的问题与 ECC 有关。 AM335x ROM 代码根据 OOB 大小选择 ECC。 对于128字节的 OOB 大小、ROM 代码将使用 BCH16。
    另一个问题是您使用的 Linux 版本。 PSP 06.00.00.00已停产3年。 TI 不再对其进行维护或提供支持。 请转至新的处理器 SDK: www.ti.com/.../PROCESSOR-SDK-AM335X
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Biser

     Rom 代码如何识别 OOB 大小? 是通过读取 ID 来实现的吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    AM335x TRM 修订版 P 的第26.1.8.4.2节对此进行了说明
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Biser

    我使用新的 SDK:am335x-evm-linux-sdk-arago-src-04.00.00.04.tar

    starting from nand 的函数现在还可以、但在内核启动期间  、OMAP2-nand OMAP2-nand.0存在错误:找到不可纠正的位翻转、我已经检查了内核代码、它发现了一个 ERROR_UNcorrectable:

    在文件驱动程序\MTD\n 和\OMAP2.c 中:

    对于(i = 0;i < eccsteps;i++){

    if (ERR_VEC[I].ERROR_UNcorrectable){

    DEV_ERR(&INFO->PDEV-DEV,

    "发现不可纠正的位翻转\n");

    ERR =-EBADMSG;

    在文件 drivers/MTD/nand/omap_elm.c 中、 当在 elm_error_correction 函数中读取 ELM_LOCATE_STATUS 错误时、ERR_VEC[i].ERROR_UNcorrectable 将设置为 true:

    静态空 elm_error_correction (struct elm_info *信息、
    struct elm_errorvec * err_vec)

    int i、j、errors = 0;
    INT 偏移;
    u32 reg_val;

    对于(i = 0;i < info->ecc_steps;i++){

    /*报告的检查错误*/
    if (err_vec[i].error_reported){
    偏移= ELM_LOCATE_STATUS + ERROR_LOCATE_SIZE * i;
    REG_val = elm_read_reg (info、offset);

    /*检查可纠正的错误或不是*/
    if (reg_val & ecc_corrected_mask)
    偏移= ELM_ERROR_LOCATE_0 +
    error_location_size * i;

    /*可纠正错误的读取计数*/
    ERR_VEC[I].ERROR_COUNT = REG_Val &
    ecc_NB_errors_mask;

    /*更新错误矢量中的错误位置*/
    对于(j = 0;j < err_vec[i].error_count;j++){

    REG_val = elm_read_reg (info、offset);
    ERR_VEC[i]。error_loc[j]= reg_val &
    ecc_error_location_mask;

    /*更新错误位置寄存器*/
    偏移+=4;

    错误+= ERR_VEC[i]。error_count;
    }否则{
    ERR_VEC[I].ERROR_UNcorrectable = true;

    /*清除已处理错误矢量的中断*/
    Elm_write_reg (info、ELM_IRQSTATUS、bit (i));

    /*禁用页面模式*/
    Elm_configure_page_mode (info、i、false);


    为什么我 的 ELM_LOCATE_STATUS 寄存器出错?  如何解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是另一个问题。 请为其打开一个新主题。