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.

am335x evm外接两个8位的nand flash



各位高手,大家好:

     我用的是am335x evm板子的内核源码,我现在自己做了一块板,想外接两个8位的nand flash芯片,原理图如下:

,现在CS0控制的第一块8位的nand flash已经通了,我是通过修改初始化代码以后就通了,我想请教那位高手CS1控制的第二块8位的nand flash如何调试,还有就是上面的原理图这样设计有问题吗?主要是想知道能否通过调用第一块8位的nand flash所用的函数来实现,还请各位大侠赐教,谢谢

  • 除了片选外,都是共用的,只是地址不同而已,所以可以共用那些函数

  • 原理图看起来没什么问题

    函数是可以共用的,测试一下呗

    有问题一起讨论

  • 各位,再请教一下,如果我用cs1控制另一个nand flash,我是不是需要再写一个设备文件,mux_pin初始化,能否直接用下面的初始化:

    因为这两片nandflash的AD线和信号线都是共用的,能否加我QQ(516719865),进行讨论一下,谢谢。

  • 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)
    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();
    }

    参考这个函数,它只添加了CS0,你可以把CS1也添加进去

  • Jian Feng1,你好,

                你的意思是说直接加到这个函数(evm_nand_init)中,还是在重写一个新函数,还有我上面的nand_pin_mux那样初始化有问题吗?因为除了CS0与CS1不共用,其它的都是共用,应该不能单独对这两个nandflash进行初始化,如果这样就会重复初始化的。能否帮我把CS0和CS1在nand_pin_mux和evm_nand_init()简单写一下,我可以参考一下,谢谢

  • nand_pin_mux 只是初始化了管脚

    evm_nand_init中最后会调用omap_init_gpmc 往Platform-bus上添加一个omap-nand 的设备,这样这个nand才能真正的初始化

    研究一下evm_nand_init这个函数时怎么工作的就明白了

  • 您 好,

          我最近研究过,omap_init_gpmc 主要进入gpmc.c这个文件,对gpmc进行初始化,但是一直不太明白是怎么把CS0传进去的,还请帮忙看一下如何把CS1传进行,谢谢。

  • Jian Feng1 说:

    nand_pin_mux 只是初始化了管脚

    evm_nand_init中最后会调用omap_init_gpmc 往Platform-bus上添加一个omap-nand 的设备,这样这个nand才能真正的初始化

    研究一下evm_nand_init这个函数时怎么工作的就明白了

    标红色的地方写错了,omap_init_gpmc是添加了一个omap-gpmc的设备,gpmc函数最后

    for (p = gpmc_device->pdata; p; gpmc_device++, p = gpmc_device->pdata)
    if (gpmc_device->flag & GPMC_DEVICE_NAND)
    gpmc_nand_init((struct omap_nand_platform_data *) p);

    这里依次判断cs的类型是否为nand,是的话就调用gpmc_nand_init完成nand的初始化,并注册omap-nand设备

    改动就比较简单了,我手上没有两块nand的板子,你试一下

    board-flash.c

    #define MAX_NAND_NUM 2
    static struct omap_nand_platform_data omap_nand_data[MAX_NAND_NUM] = {
    //.gpmc_t = &nand_default_timings,
    };

    struct omap_nand_platform_data *
    __init omap_nand_init(struct mtd_partition *nand_parts, u8 nr_parts, u8 cs,
    int nand_type, struct gpmc_timings *gpmc_t)
    {
    if( cs >= MAX_NAND_NUM)
    return NULL;
    omap_nand_data[cs].cs = cs;
    omap_nand_data[cs].parts = nand_parts;
    omap_nand_data[cs].nr_parts = nr_parts;
    omap_nand_data[cs].devsize = nand_type;
    omap_nand_data[cs].gpmc_t = gpmc_t;

    return &omap_nand_data[cs];
    }

    board-am335xevm.c

    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 },
    };

    int i;

    setup_pin_mux(nand_pin_mux);

    for(i=0;i<2;i++){
    pdata = omap_nand_init(am335x_nand_partitions,
    ARRAY_SIZE(am335x_nand_partitions), i, 0,
    &am335x_nand_timings);
    if (!pdata)
    return;
    pdata->ecc_opt =OMAP_ECC_BCH8_CODE_HW;
    pdata->elm_used = true;
    gpmc_device[i].pdata = pdata;
    gpmc_device[i].flag = GPMC_DEVICE_NAND;

    }

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

  • Jian Feng1,您好,

        根据你给的提示,现在CS1也加进去了,还有

    #define MAX_NAND_NUM 2
    static struct omap_nand_platform_data omap_nand_data[MAX_NAND_NUM] = {
    //.gpmc_t = &nand_default_timings,
    };

    是需要注释掉吗?

  • 此帖最佳答案可以参考http://e2e.ti.com/support/arm/sitara_arm/f/791/t/246997.aspx这个网址,从调试到实现,上面写的很清楚。

  • 各位大侠,早上好:

              根据上面的帖子的原理图,我想实现一个gpmc与nandflash芯片通讯和一个gpmc与FPGA模拟的nandflash通讯,具体步骤如下:

             1.通过GPMC的CS0与nandflash(K9F1G08U0D)通讯,这个容易调试,已经通了。

              2.通过GPMC的CS1与FPGA模拟nandflash的读时序和写时序进行通讯,这一步一直也没有调通,还请各位大侠帮忙。

              我一直比较疑惑的是,CS1的初始化和与FPGA模拟nandflash的设备文件,现在CS0和CS1都是共用其它信号,初始化应该初始化一次是比较好的。

    初始化代码如下:

    Initialization code is as follows:

    /* Pin mux for nand flash module */
    static struct pinmux_config nand_pin_mux[] = {
    {"gpmc_ad0.gpmc_ad0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad1.gpmc_ad1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad2.gpmc_ad2", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad3.gpmc_ad3", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad4.gpmc_ad4", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad5.gpmc_ad5", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad6.gpmc_ad6", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_ad7.gpmc_ad7", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_wait0.gpmc_wait0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_wpn.gpmc_wpn", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},
    {"gpmc_csn0.gpmc_csn0", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    {"gpmc_advn_ale.gpmc_advn_ale", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    {"gpmc_oen_ren.gpmc_oen_ren", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    {"gpmc_wen.gpmc_wen", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    {"gpmc_ben0_cle.gpmc_ben0_cle", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    {NULL, 0},

    }

    static void evm_nand_init(int evm_id, int profile)
    {
    struct omap_nand_platform_data *pdata;
    struct omap_nand_platform_data *pdata1;
    struct gpmc_devices_info gpmc_device[2] = {
    { NULL, 0 },
    { NULL, 0 },
    };
    pr_info("file:%s,func:%s,line:%d\n",__FILE__,__func__,__LINE__); 
    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)
    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;
    pr_info("file:%s,func:%s,line:%d cs:%d\n",__FILE__,__func__,__LINE__,pdata->cs);
    pdata1 = omap_nand_init(am335x_nand_partitions,
    ARRAY_SIZE(am335x_nand_partitions), 1, 0,
    &am335x_nand_timings);
    if (!pdata1)
    return;
    pdata1->ecc_opt =OMAP_ECC_BCH8_CODE_HW;
    pdata1->elm_used = true;
    gpmc_device[1].pdata = pdata1;
    gpmc_device[1].flag = GPMC_DEVICE_NAND;
    pr_info("file:%s,func:%s,line:%d cs:%d\n",__FILE__,__func__,__LINE__,pdata->cs);
    omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
    omap_init_elm();