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.

AM3359 NandFlash读取设备ID异常

Other Parts Discussed in Thread: AM3359

你好,各位

    硬件:公司自生产的Am3359板,nand型号是MT29F2G08ABAEAWP:E

    软件:使用的内核版本为linux-3.2.0-psp05.06.00.00

    目前问题是,Kernel nand驱动初始化时无法正确读取设备ID;如本来应该是以下结果

        NAND device: Manufacturer ID: 0x2c, Chip ID: 0xda (Micron MT29F2G08ABAEAWP)

    但是实际读取出到的结果却是都为0x0, 然后就会打印“No NAND device found”

    Note:

            1.因为在uboot阶段nand是能正常驱动成功的, 所以nand管脚复用是正确的且nand硬件也是OK的;

            2.内核nand驱动方面的初始化没有做任何修改;目前有一小小区别是,现在是直接在<kernel_dir>/arch/arm /mach-omap2/board-am335xevm.c中调用evm_nand_init来初始化nand,而原来是通过在i2c初始化过程中来调 用evm_nand_init函数来初始化nand的;

   

    期待有遇到过该问题的TI工程师or朋友能帮忙解答下,万分感激!谢谢 。。。

  • 感觉像是管脚配置的问题,检查一下pinmux设置

  • 首先感谢你回答;

    对于管脚的问题我已检查过了,就是跟evm一样设置的;具体设置如下:

    506 /* Pin mux for nand flash module */
    507 static struct pinmux_config nand_pin_mux[] = {
    508 {"gpmc_ad0.gpmc_ad0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    509 {"gpmc_ad1.gpmc_ad1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    510 {"gpmc_ad2.gpmc_ad2", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    511 {"gpmc_ad3.gpmc_ad3", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    512 {"gpmc_ad4.gpmc_ad4", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    513 {"gpmc_ad5.gpmc_ad5", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    514 {"gpmc_ad6.gpmc_ad6", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    515 {"gpmc_ad7.gpmc_ad7", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    516 {"gpmc_wait0.gpmc_wait0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    517 {"gpmc_wpn.gpmc_wpn", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},
    518 {"gpmc_csn0.gpmc_csn0", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    519 {"gpmc_advn_ale.gpmc_advn_ale", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    520 {"gpmc_oen_ren.gpmc_oen_ren", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    521 {"gpmc_wen.gpmc_wen", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    522 {"gpmc_ben0_cle.gpmc_ben0_cle", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    523 {NULL, 0},
    524 };

  • 你看看是不是配别的功能,又把NAND的管脚给占用了

  • 除了差pin脚配置外,另外,请查下时序配置的是否正确。

  • 你好,我刚重新检查了管脚方面的配置,没发现nand管脚被占用,就只有上面一处的管脚配置nand的了

  • 你好,Yaoming Qin,你提到的时序的配置,在哪个文件以及怎么设置的,谢谢

  • evm_nand_init

    在哪里执行的?

    可以把PINMUX的Debug打开看看是不是在nand驱动之前执行的

  • 现在是直接在<kernel_dir>/arch/arm /mach-omap2/board-am335xevm.c中调用evm_nand_init来初始化nand,而原来是通过在i2c初始化过程中来调 用evm_nand_init函数来初始化nand的;


    把这个过程详细说明一下,我估计是个很微小的错误。

  • 你好,leo chen,目前nand驱动初始化调用过程如下:

    位置:<kernel_dir>/arch/arm /mach-omap2/board-am335xevm.c

    原先过程:am335x_evm_init

                   -> am335x_evm_i2c_init

                   ...

                   -> __configure_device(..., gen_purp_evm_dev_cfg, ...)

                   -> 最终调用到了evm_nand_init

    目前过程:am335x_evm_init -> evm_nand_init()

    static void evm_nand_init(int evm_id, int profile)
    {
    struct omap_nand_platform_data *pdata;
    struct gpmc_devices_info gpmc_device[2] = {
    { NULL, 0 },
    { NULL, 0 },
    };

    setup_pin_mux(nand_pin_mux);

    pdata = omap_nand_init(am335x_nand_partitions,
    ARRAY_SIZE(am335x_nand_partitions), 0, 0,
    &am335x_nand_timings);
    if (!pdata) {
    printk("%s %s %d: omap_nand_init() err\n", __FILE__, __func__, __LINE__);
    return;
    }
    pdata->ecc_opt =OMAP_ECC_BCH8_CODE_HW;
    pdata->elm_used = true;
    gpmc_device[0].pdata = pdata;
    gpmc_device[0].flag = GPMC_DEVICE_NAND;

    omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
    omap_init_elm();
    }

  • 是的,具体代码如下:

    506 /* Pin mux for nand flash module */
    507 static struct pinmux_config nand_pin_mux[] = {
    508 {"gpmc_ad0.gpmc_ad0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    509 {"gpmc_ad1.gpmc_ad1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    510 {"gpmc_ad2.gpmc_ad2", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    511 {"gpmc_ad3.gpmc_ad3", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    512 {"gpmc_ad4.gpmc_ad4", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    513 {"gpmc_ad5.gpmc_ad5", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    514 {"gpmc_ad6.gpmc_ad6", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    515 {"gpmc_ad7.gpmc_ad7", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    516 {"gpmc_wait0.gpmc_wait0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    517 {"gpmc_wpn.gpmc_wpn", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},
    518 {"gpmc_csn0.gpmc_csn0", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    519 {"gpmc_advn_ale.gpmc_advn_ale", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    520 {"gpmc_oen_ren.gpmc_oen_ren", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    521 {"gpmc_wen.gpmc_wen", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    522 {"gpmc_ben0_cle.gpmc_ben0_cle", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    523 {NULL, 0},
    524 };

    static void evm_nand_init(int evm_id, int profile)
    {
    struct omap_nand_platform_data *pdata;
    struct gpmc_devices_info gpmc_device[2] = {
    { NULL, 0 },
    { NULL, 0 },
    };

    setup_pin_mux(nand_pin_mux);

    pdata = omap_nand_init(am335x_nand_partitions,
    ARRAY_SIZE(am335x_nand_partitions), 0, 0,
    &am335x_nand_timings);
    if (!pdata) {
    printk("%s %s %d: omap_nand_init() err\n", __FILE__, __func__, __LINE__);
    return;
    }
    pdata->ecc_opt =OMAP_ECC_BCH8_CODE_HW;
    pdata->elm_used = true;
    gpmc_device[0].pdata = pdata;
    gpmc_device[0].flag = GPMC_DEVICE_NAND;

    omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
    omap_init_elm();
    }

  • 其实个人觉得跟pinmux的关系不大,因为使用同一设置pinmux,uboot能驱动起来,而kernel的驱动在读取nand的设备id时没能读取正常,从而导致驱动初始化失败的。总隐隐约约漏了某些细微的设置。

  • 目前过程:am335x_evm_init -> evm_nand_init()

    详细一点的,在哪里

  • 你好,Jian Feng1 ,目前过程就是在<kernel_dir>/arch/arm /mach-omap2/board-am335xevm.c文件中函数am335x_evm_init里直接调用 evm_nand_init()驱动初始化函数。如:

    static void __init am335x_evm_init(void)

    {

        ...

        am335x_evm_init;

        ...

    }

  • 把am335x_evm_init贴出来看一下

  • Jian Feng1 ,你好,下面是函数的具体代码;(可以加qq说吗,这是我的qq2998035664)

    static void __init am335x_evm_init(void)
    {
    am33xx_cpuidle_init();
    omap_serial_init();
    am335x_rtc_init(sDefault_id,sDefault_profile);
    am335x_evm_i2c_init();
    mcasp1_init(sDefault_id,sDefault_profile);
    evm_nand_init(sDefault_id,sDefault_profile);
    mmc0_init(sDefault_id,sDefault_profile);

    omap_sdrc_init(NULL, NULL);
    usb_musb_init(&musb_board_data);
    omap_board_config = am335x_evm_config;
    omap_board_config_size = ARRAY_SIZE(am335x_evm_config);
    /* Create an alias for icss clock */
    if (clk_add_alias("pruss", NULL, "pruss_uart_gclk", NULL))
    pr_warn("failed to create an alias: icss_uart_gclk --> pruss\n");
    /* Create an alias for gfx/sgx clock */
    if (clk_add_alias("sgx_ck", NULL, "gfx_fclk", NULL))
    pr_warn("failed to create an alias: gfx_fclk --> sgx_ck\n");
    }

  • 我试了一下,在你那个位置初始化Nand是可以正常扫描到Nand的

    int __init omap_mux_init_signal(const char *muxname, int val)
    {
    struct omap_mux_partition *partition = NULL;
    struct omap_mux *mux = NULL;
    u16 old_mode;
    int mux_mode;

    mux_mode = omap_mux_get_by_name(muxname, &partition, &mux);
    if (mux_mode < 0)
    return mux_mode;

    old_mode = omap_mux_read(partition, mux->reg_offset);
    mux_mode |= val;
    pr_debug("%s: Setting signal %s 0x%04x -> 0x%04x\n",
    __func__, muxname, old_mode, mux_mode);
    omap_mux_write(partition, mux_mode, mux->reg_offset);

    return 0;
    }

    把mux.c中的这个函数中的pr_debug修改为pr_err,然后把启动信息贴出来看一下

  • 你用的NAND型号和GPEVM板是一致的,所以timming不需要什么修改。

    在U-boot下是可以识别的,所以硬件的问题不大。

    我觉得你还是在driver初始化中仔细检查下NAND所需要的所有管脚,是不是某一个管脚被挪为它用了,比如当成GPIO或者中断了。

    你为什么不直接修改和调用am335x_evm_setup(),而是把里面各个模块的初始化函数都单独拿出来调用呢?

  • 按照您说的修改后的nand signal打印信息如下:

    [ 0.080810] [test] setup_pin_mux call ,,,,,,,,,,,,,,,,,,,,,,,start
    [ 0.080902] omap_mux_init_signal: Setting signal gpmc_ad0.gpmc_ad0 0x0020 -> 0x0030
    [ 0.080932] omap_mux_init_signal: Setting signal gpmc_ad1.gpmc_ad1 0x0020 -> 0x0030
    [ 0.080963] omap_mux_init_signal: Setting signal gpmc_ad2.gpmc_ad2 0x0020 -> 0x0030
    [ 0.080993] omap_mux_init_signal: Setting signal gpmc_ad3.gpmc_ad3 0x0020 -> 0x0030
    [ 0.080993] omap_mux_init_signal: Setting signal gpmc_ad4.gpmc_ad4 0x0020 -> 0x0030
    [ 0.081024] omap_mux_init_signal: Setting signal gpmc_ad5.gpmc_ad5 0x0020 -> 0x0030
    [ 0.081054] omap_mux_init_signal: Setting signal gpmc_ad6.gpmc_ad6 0x0020 -> 0x0030
    [ 0.081085] omap_mux_init_signal: Setting signal gpmc_ad7.gpmc_ad7 0x0020 -> 0x0030
    [ 0.081115] omap_mux_init_signal: Setting signal gpmc_wait0.gpmc_wait0 0x0030 -> 0x0030
    [ 0.081146] omap_mux_init_signal: Setting signal gpmc_wpn.gpmc_wpn 0x0010 -> 0x0037
    [ 0.081176] omap_mux_init_signal: Setting signal gpmc_csn0.gpmc_csn0 0x0010 -> 0x0008
    [ 0.081207] omap_mux_init_signal: Setting signal gpmc_advn_ale.gpmc_advn_ale 0x0010 -> 0x0008
    [ 0.081237] omap_mux_init_signal: Setting signal gpmc_oen_ren.gpmc_oen_ren 0x0010 -> 0x0008
    [ 0.081268] omap_mux_init_signal: Setting signal gpmc_wen.gpmc_wen 0x0010 -> 0x0008
    [ 0.081268] omap_mux_init_signal: Setting signal gpmc_ben0_cle.gpmc_ben0_cle 0x0010 -> 0x0008
    [ 0.081298] [test] setup_pin_mux call ,,,,,,,,,,,,,,,,,,,,,,,,end
    [ 0.081329] [test] arch/arm/mach-omap2/board-am335xevm.c evm_nand_init 1372: omap_nand_init() ok

  • 附件是启动信息打印

  • Jian Feng1,你好,上面回复时我给附件了,里面就是打印信息,没看到吗?

  • 看起来没什么问题。

    你把Nand初始化放到I2C回调函数里面试过了吗?

    可以用TI编译好的内核试一下看能否检查到Nand

  • 1、直接调用am335x_evm_setup也不好使,至于现在单独拿出来是为了调试更加清晰(个人认为从代码的逻辑来看,单独拿出来与调用am335x_evm_setup是没有区别的的;)

    2、问个问题,若是在uboot端已对nand进行正确的管脚复用了,那么如果在kernel端不对管脚进行复配置---而仅进行nand驱动的初始化的话,此时nand管脚配置应该是对的吧?若是这样的话,因为Nand在uboot时是好使的,从而说明硬件以及管脚复用是没问题的,而内核nand驱动方面我也没做任何修改;在这样的情况下,uboot没问题、管脚复用也没问题、内核也没问题,但就是没能发现nand,很矛盾。

  • 直接放不行的,因为公司的板管脚复用有变化,如mmc就是其中一个;

    我下午试下使用TI最初始的SDK代码,然后在uboot以及kernel端仅进行mmc和nand的管脚配置以及驱动初始化,看是否正常;

  • 你看看看原理图,GPMC连接的NAND的那些走线上,有没有连接别的东西。

    有一种可能,就是进入到kernel以后,有一些外设使能,会影响到NAND上的信号,包括简单的GPIO。这是一种解决问题的思路而已,不是最终答案。

  • 测试一:使用TI最初始的SDK代码(版本为ti-sdk-am335x-evm-05.06.00.00),然后在uboot以及kernel端仅进行mmc和nand的管脚配置以及驱动初始化;

    测试结果:nand not found,与之前错误一致;

    关键修改:

    <uboot_dir>/board/ti/am335x/mux.c (附件:)

    <kernel_dir>/arch/arm/mach-omap2/board-am335xevm.c (附件:

    启动打印信息附件:

  • ----对于“有一种可能,就是进入到kernel以后,有一些外设使能,会影响到NAND上的信号,包括简单的GPIO。这是一种解决问题的思路而已,不是最终答案。”

             之前我也怀疑你提到的,但是从我上面测试一来看,仅使用了mmc以及nand,其他不使用也不配置,而且在管脚复用(board-am335xevm.c)上也没发现有其他的外设使能的存在;(某非还有其他地方我没注意到的???)

    -----而对于“你看看看原理图,GPMC连接的NAND的那些走线上,有没有连接别的东西。”随后我会跟硬件工程师再次确认的;

    谢谢你们的回答;

  • Jian Feng1,你好

    1、问下,你之前测试的板子是什么样的板子啊?

    2、能否帮忙测试下这两个镜像:

  • [ 1.236912] NAND device: Manufacturer ID: 0x01, Chip ID: 0xf1 (AMD S34ML01G1)
    [ 1.244587] Creating 8 MTD partitions on "omap2-nand.0":
    [ 1.250156] 0x000000000000-0x000000020000 : "SPL"
    [ 1.256498] 0x000000020000-0x000000040000 : "SPL.backup1"
    [ 1.263484] 0x000000040000-0x000000060000 : "SPL.backup2"
    [ 1.270454] 0x000000060000-0x000000080000 : "SPL.backup3"
    [ 1.277316] 0x000000080000-0x000000260000 : "U-Boot"
    [ 1.284446] 0x000000260000-0x000000280000 : "U-Boot Env"
    [ 1.291239] 0x000000280000-0x000000780000 : "Kernel"
    [ 1.299718] 0x000000780000-0x000008000000 : "File System"
    [ 1.356537] OneNAND driver initializing
    [ 1.361621] UBI error: ubi_init: UBI error: cannot initialize UBI, error -19
    [ 1.369686] CAN device driver interface
    [ 1.373683] CAN bus driver for Bosch D_CAN controller 1.0

    没有 问题

  • 这是个重要的消息!还有,非常感谢您这两天的帮助,随后我会与硬件人员排除是否硬件的问题;

  • 请问问题的解决有什么进展吗?

  • Jian Feng1,你好;

    我想问下之前你帮忙测试镜像的板子的一些情况:

    1、测试的板子是什么样的板,EVM板?

    2、测试板子Nand的硬件型号是什么,是MT29F2G08ABAEAWP:E吗?(因为我看你的输出信息是AMD S34ML01G1

    BR For You.

  • Jian Zhou,你好;目前问题还没解决,上礼拜通过Jian Feng1帮忙测试我自己编译的镜像文件,结果Nand初始化正常,这表明kernel的驱动是好使的,但有一点的是,从Jian Feng1给出的测试打印信息来看,他测试的nand硬件是AMD S34ML01G1,与我的不一样;虽然有点差异,但我觉得这对“nand驱动是正常”这一观点并没有影响。下面是我硬件的原因图,希望能帮忙看下有没有存在不对的地方

  • 刚通过示波器的测量,发现个问题:在uboot启动阶段能测量到有Nand片选信号,而在kernel阶段却测量不到Nand片选信号。

  • 想问问,问题解决了么?

    我应用过程中也遇到了相似的问题,一开始设备运行正常,但是安装到现场后一段时间,就找不到nand flash了,但是uboot中可以检测到,内核驱动读取出来的ID为0xFF