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.
各位大侠,早上好:
根据上面的帖子的原理图,我想实现一个gpmc与nandflash芯片通讯和一个gpmc与FPGA模拟的nandflash通讯,具体步骤如下:
1.通过GPMC的CS0与nandflash(K9F1G08U0D)通讯,这个容易调试,已经通了。
2.通过GPMC的CS1与FPGA模拟nandflash的读时序和写时序进行通讯,这一步一直也没有调通,还请各位大侠帮忙。
我一直比较疑惑的是,CS1的初始化和与FPGA模拟nandflash的设备文件,现在CS0和CS1都是共用其它信号,初始化应该初始化一次是比较好的。
原理图如下:
初始化代码如下:
/* 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_csn1.gpmc_csn1", 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();
请各位指点一下,谢谢
建议你仔细看一下AM335x的TRM中关于GPMC的章节,里面描述的很详细了。GPMC接FPGA的应用比较多了,通信同步的、异步的都有。经常出现问题的地方是,对片选1设备地址区域的划分。一定要把GPMC章节中的内容读懂,做起来不难的。
PS:你给的代码段中有很多信息都没有,GPMC_CONFIG1~7的内容都确认过吗?
你好,因为原理图的其它信号都是复用的,比如gpmc_AD0~gpmc_AD7都是复用的,要是单独的话,我就可以重新写一个设备再对时序进行初始化,如果多次对gpmc_AD0~gpmc_AD7这些信号初始化会不会出问题?
AM335x的TRM中关于GPMC的章节看了好多次总是不太明白,所以上来问问高手可以帮我讲讲,谢谢
你好,
虽然硬件是通过同样一组AD0-AD7去通讯,但是每个CS片选信号下都有独立的一组寄存器GPMC_CONFIG1_x - GPMC_CONFIG7_x。当你用不同的片选去通讯时,时序就根据对应每个片选下的config寄存器去配置时序。
不知道这样解释,你有没有看明白。