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/processor-SDK-AM335X:在最新的 TI SDK 中未检测到 NAND

Guru**** 2608365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584818/linux-processor-sdk-am335x-nand-not-detected-in-latest-ti-sdk

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

您好!

我正在开发最新的 TI SDK ti-processor-sdk-linux-am335x-evm-03.02.00.05-linux-x86-64安装程序、并希望为 我的定制板配置 NAND 闪存 IC S34ML08G1。

我已在 u-boot/board/ti/AM335x/mux.c 中配置 GPMC 线路、但未检测到 nand、如下面的日志所示。 请大家告诉我缺少的配置。

U-Boot 2016.05-00305-g3b08611-m脏(2017年3月29日- 12:07:45 +0530)

CPU :AM335X-GP 修订版2.1

在 show_board_info 中
型号:TI AM335x BeagleBone Black
      启用看门狗
DRAM: 256 MIB
NAND: 0 MIB
MMC:  OMAP SD/MMC:0、OMAP SD/MMC:1.
正在读取 uboot.env

谢谢、此致

Deshvir Malik

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

    您好、Deshvir、

    能否指定您使用的 u-boot 配置文件? 您是否尝试使用"AM335x_EVM_nandboot_defconfig"配置文件构建 u-boot?

    还要检查 CONFIG_NAND 预处理器开关的定义情况。

    BR
    Tsvetolin Shulev

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

    e2e.ti.com/.../0143_2E00_.config.txtHiTsvetolin、

    我将告诉您我的编译方式。

    1.对于 u-boot、我将使用以下命令:

    将 arch=arm cross_compile=arm-linux-gnueabihf- am335x_evm_config 全部设置为

    我已附加生成的.config 文件

    但是对于内核编译、我将使用如下所述的特定配置文件

    使 arch=arm cross_compile=arm-linux-gnueabihf- tisdk_am335x-evm_defconfig

    CONFIG_NAND 预处理器开关未定义。

    谢谢、此致

    Deshvir Malik

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

    尊敬的 Tsvetolin:

    我在 u-boot 中完成了 NAND 的引脚复用、似乎检测到 NAND、但这次会出现新错误、如红色字体所示。  

    您能否就此错误提出建议?

    U-Boot 2016.05-00305-g3b08611-脏(2017年3月30日- 13:02:13 +0530)

    CPU :AM335X-GP 修订版2.1

    在 show_board_info 中
    型号:TI AM335x BeagleBone Black
          启用看门狗
    DRAM: 256 MIB
    NAND: NAND:错误:OOB 不足:需要=106
    0 MIB
    MMC:  OMAP SD/MMC:0、OMAP SD/MMC:1.
    正在读取 uboot.env

    谢谢、此致

    Deshvir Malik

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

    错误消息"nand:error:insufficient OOB:require=106"是由于在更新 ECC 信息之前检查 ECC 机制要求失败造成的。 如果在./u-boot/drivers/mtd/nand/omap_gpmc.c 文件中使用硬件错误代码校正,则执行此检查,但可以在3个不同的位置打印消息。 为了进一步调试、您可以添加其他打印件。 我建议您尝试使用软件 ECC 作为权变措施。

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

    尊敬的 Tsvetolin:

    我已经修改了"u-boot/drivers/MTD/nand/omap_gpmc.c"处的代码、并将错误名称命名为 error1、error2、error3和 erro4。

    它将出现 OMAP-ECC_BCH16_CODE_HW 的 swich 案例、但预计为 OMAP-ECC_BCH8_CODE_HW。

    我已使用       中的#define CONFIG_NAND_OMAP-ECCSCHEME OMA_ECC_BCH8_CODE_HW_DETECT_SW 修改 OMAP-ECC_BCH8_CODE_HW_DETECT_SW

    include/configs/am335x_evm.h,但仍面临相同的错误

    NAND: NAND:错误4:OOB 不足:要求=106
    0 MIB

    下面是供参考的 OMAP-GPMC.c 代码:

    静态 int omap_select_ecc_scheme (struct nand_chip *nand、

    enum omap_ecc ecc_scheme、unsigned int pagesize、unsigned int oobsize){

    struct omap_nand_info *info = nand->priv;

    struct nand_ecclaoout * ecclaooouble =&omap_ecclaouble;

    int eccsteps = pagesize / sector_Bytes;

    int i;

    开关(ECC_scheme){

    //开关(OMAP-ECC_BCH8_CODE_HW){

    OMAP-ECC_HAM1_CODE_SW 案例:

    调试("nand: Selected OMA_ECC_HAM1_CODE_SW\n");

    /*对于此 ECC 方案,ecc.bytes,ecc.layout,... 是的

    *在 nand_scan_tail ()中初始化、因此只需设置 ecc.mode */

    INFO->CONTROL = NULL;

    NAN->ECC.MODE = NAND_ECC_SOFT;

    NANN->ECC.Layout =空;

    NAN->ECC.SIZE = 0;

    中断;

    OMAP-ECC_HAM1_CODE_HW 案例:

    调试("nand: Selected OMA_ECC_HAM1_CODE_HW\n");

    /*在更新 ECC 信息之前检查 ECC 机制要求*/

    如果((3 * eccsteps)+ BADBLOCK_MARGER_LENGTH > oobsize){

    printf ("nand:error1:OOB 不足:require=%d\n"、(

    (3 * eccsteps)+ BADBLOCK_MARGER_LENGTH);

    return -EINVAL;

    INFO->CONTROL = NULL;

    /*填充 ECC 特定字段*/

    memset (&N 和->ECC、0、sizeof (struct nand_ecc_ctrl));

    NANN->ECC.MODE = NAND_ECC_HW;

    NAN->EC.Strength = 1;

    NAN->ECC.SIZE =扇区字节;

    NAN->ECC.Bytes = 3;

    NANN->ecc.hwctl = OMA_ENABLE_hwecc;

    NAN->ECC.correct = OMA_correct_data;

    NANN-> ecc.calculate = OMAP-CAUARGE_ECC;

    /*定义 ECC 布局*/

    ecclaout->eccbytes = nand->ecc.bytes * eccsteps;

    对于(i = 0;i < ecclaout->eccbytes; i++){

    if (nand->options & NAND_BUSWIDTH_16)

    ecclaout->eccpos[i]= i + 2;

    其他

    ecclaout->eccpos[i]= i + 1;

    ecclaout->oobfree[0]。offset = i + BADBLOCK_MARGER_LENGTH;

    ecclaout->oobfree[0]。length = oobsize - ecclaout->eccbytes -

    BADBLOCK_MARGER_LENGTH;

    中断;

    OMAP-ECC_BCH8_CODE_HW_DETECT_SW 案例:

    #ifdef CONFIG_BCH

    调试("nand: Selected OMA_ECC_BCH8_CODE_HW_DETECT_SW\n");

    /*在更新 ECC 信息之前检查 ECC 机制要求*/

    如果((13 * eccsteps)+ BADBLOCK_MARGER_LENGTH > oobsize){

    printf ("nand:error2:OOB 不足:require=%d\n"、(

    (13 * eccsteps)+ BADBLOCK_MARGER_LENGTH);

    return -EINVAL;

    /*检查 BCH S/W 库是否可用于错误检测*/

    INFO->CONTROL = INIT_BCH (13、8、0x201b);

    if (!info->control){

    printf ("nand: error:could not init_BCH ()\n");

    return -ENODEV;

    /*填充 ECC 特定字段*/

    memset (&N 和->ECC、0、sizeof (struct nand_ecc_ctrl));

    NANN->ECC.MODE = NAND_ECC_HW;

    NAN->ECC.strength = 8;

    NAN->ECC.SIZE =扇区字节;

    NANN->ECC.Bytes = 13;

    NANN->ecc.hwctl = OMA_ENABLE_hwecc;

    NAN->ECC.correct = OMA_correct_data_Bch_SW;

    NANN-> ecc.calculate = OMAP-CAUARGE_ECC;

    /*定义 ECC 布局*/

    ecclaout->eccbytes = nand->ecc.bytes * eccsteps;

    ecclaout->eccpos[0]= BADBLOCK_MARGER_LENGTH;

    对于(i = 1;i < ecclaout->eccbytes; i++){

    if (i % nand->ecc.bytes)

    ecclaout->eccpos[i]=

    ecclaout->eccpos[i - 1]+ 1;

    其他

    ecclaout->eccpos[i]=

    ecclaout->eccpos[i - 1]+ 2;

    ecclaout->oobfree[0]。offset = i + BADBLOCK_MARGER_LENGTH;

    ecclaout->oobfree[0]。length = oobsize - ecclaout->eccbytes -

    BADBLOCK_MARGER_LENGTH;

    中断;

    其他

    printf ("nand:错误:ecc\n"config_BCH 必需);

    return -EINVAL;

    #endif

    OMAP-ECC_BCH8_CODE_HW 案例:

    #ifdef CONFIG_NAND_OMAP-ELM

    调试("nand: Selected OMA_ECC_BCH8_CODE_HW\n");

    /*在更新 ECC 信息之前检查 ECC 机制要求*/

    如果((14 * eccsteps)+ BADBLOCK_MARGER_LENGTH > oobsize){

    printf ("nand:error3:OOB 不足:require=%d\n"、(

    (14 * eccsteps)+ BADBLOCK_MARGER_LENGTH);

    return -EINVAL;

    /*为 ECC 错误检测初始化 ELM */

    Elm_init();

    INFO->CONTROL = NULL;

    /*填充 ECC 特定字段*/

    memset (&N 和->ECC、0、sizeof (struct nand_ecc_ctrl));

    NANN->ECC.MODE = NAND_ECC_HW;

    NAN->ECC.strength = 8;

    NAN->ECC.SIZE =扇区字节;

    NANN->ECC.Bytes = 14;

    NANN->ecc.hwctl = OMA_ENABLE_hwecc;

    NAN->ECC.correct = OMA_correct_data_BCH;

    NANN-> ecc.calculate = OMAP-CAUARGE_ECC;

    NAN->ECC.READ_PAGE = OMAP-READ_PAGE_BCH;

    /*定义 ECC 布局*/

    ecclaout->eccbytes = nand->ecc.bytes * eccsteps;

    对于(i = 0;i < ecclaout->eccbytes; i++)

    ecclaout->eccpos[i]= i + BADBLOCK_MARGER_LENGTH;

    ecclaout->oobfree[0]。offset = i + BADBLOCK_MARGER_LENGTH;

    ecclaout->oobfree[0]。length = oobsize - ecclaout->eccbytes -

    BADBLOCK_MARGER_LENGTH;

    中断;

    其他

    printf ("nand:错误:ecc\n"config_NAND_OMAP-ELM 必需);

    return -EINVAL;

    #endif

    OMAP-ECC_BCH16_CODE_HW 案例:

    #ifdef CONFIG_NAND_OMAP-ELM

    调试("与:使用 OMAP-ECC_BCH16_CODE_HW\n");

    /*在更新 ECC 信息之前检查 ECC 机制要求*/

    如果((26 * eccsteps)+ BADBLOCK_MARGER_LENGTH > oobsize){

    printf ("nand:error4:OOB 不足:require=%d\n"、(

    (26 * eccsteps)+ BADBLOCK_MARGER_LENGTH);

    return -EINVAL;

    /*为 ECC 错误检测初始化 ELM */

    Elm_init();

    /*填充 ECC 特定字段*/

    NANN->ECC.MODE = NAND_ECC_HW;

    NAN->ECC.SIZE =扇区字节;

    NANN->ECC.Bytes = 26;

    NAN->EC.Strength = 16;

    NANN->ecc.hwctl = OMA_ENABLE_hwecc;

    NAN->ECC.correct = OMA_correct_data_BCH;

    NANN-> ecc.calculate = OMAP-CAUARGE_ECC;

    NAN->ECC.READ_PAGE = OMAP-READ_PAGE_BCH;

    /*定义 ECC 布局*/

    ecclaout->eccbytes = nand->ecc.bytes * eccsteps;

    对于(i = 0;i < ecclaout->eccbytes; i++)

    ecclaout->eccpos[i]= i + BADBLOCK_MARGER_LENGTH;

    ecclaout->oobfree[0]。offset = i + BADBLOCK_MARGER_LENGTH;

    ecclaout->oobfree[0]长度= oobsize - nand->ecc.bytes -

    BADBLOCK_MARGER_LENGTH;

    中断;

    其他

    printf ("nand:错误:ecc\n"config_NAND_OMAP-ELM 必需);

    return -EINVAL;

    #endif

    默认值:

    调试("nand:错误:ECC 方案未启用或不受支持\n");

    return -EINVAL;

    /* nand_scan_tail ()设置 ham1 SW ECC;HW ECC 布局由驱动程序设置*/

    if (ecc_scheme!= OMA_ECC_HAM1_CODE_SW)

    NAN->ecc.layout = ecclaoay;

    INFO->ECC_scheme = ECC_scheme;

    返回0;

    谢谢、此致

    Deshvir Malik