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.

请问怎样查看nandflash占用GPMC总线的地址空间情况

TI的am335x的处理器,板子上带有512M的nandflash,通过GPMC总线连接,请问怎样查看nandflash占用GPMC总线的地址空间情况,我还想连其他外设,但是GPMC支持的地址空间最大为512M,请问我该怎么办?

  • TRM7.1 GPMC章节,查一下GPMC_CONFIG7_i的寄存器。其中i代表你使用的是片选几。也可以参考这个链接:http://blog.csdn.net/swallow71701/article/details/22793191

  • 我觉得nand的地址空间 和 GPMC的地址空间不是一回事

    nand占用gpmc的地址空间 主要看他占用gpmc多少地址线

  • 首先,NAND是通过stream的方式进行通信,所以NAND和GPMC通信没有地址线,只有数据线。

    其次,我理解你的意思是不是说,NAND的地址空间,和规划出的GPMC地址空间,可能不一致;真实的NAND的地址空间,是要看NAND的大小?

    如果是这个意思的话,你是可以通过配置GPMC_CONFIG7_i这个寄存器的【11-8】bit,来配置GPMC空间的大小,即为你NAND的空间大小,最小16MB,最大256MB,确保这个地址空间是match的。

     

  • 如果你是用Linux驱动,那么请你看一下gpmc_nand_init()这个函数,里面给NAND所占用的CS0片选的地址空间,应该是16M

  • 谢谢回复!!

    你的意思是nand不占用GPMC的地址空间吗?但是nand用的是GPMC的CS0呀!

    这个是源码的引脚初始化:

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

  • 你好!谢谢回复!!!,这个是函数源码,看不出是占用了多少呀!

    int __devinit gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data)
    {
    int err = 0;
    u8 cs = 0;
    struct device *dev = &gpmc_nand_device.dev;

    /* if cs not provided, find out the chip-select on which NAND exist */
    if (gpmc_nand_data->cs > GPMC_CS_NUM)
    while (cs < GPMC_CS_NUM) {
    u32 ret = 0;
    ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);

    if ((ret & 0xC00) == 0x800) {
    printk(KERN_INFO "Found NAND on CS%d\n", cs);
    gpmc_nand_data->cs = cs;
    break;
    }
    cs++;
    }

    if (gpmc_nand_data->cs > GPMC_CS_NUM) {
    printk(KERN_INFO "NAND: Unable to find configuration "
    "in GPMC\n ");
    return -ENODEV;
    }

    gpmc_nand_device.dev.platform_data = gpmc_nand_data;
    gpmc_nand_data->ctrlr_suspend = gpmc_suspend;
    gpmc_nand_data->ctrlr_resume = gpmc_resume;

    printk(KERN_INFO "Registering NAND on CS%d\n", gpmc_nand_data->cs);

    err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE,
    &gpmc_nand_data->phys_base);
    if (err < 0) {
    dev_err(dev, "Cannot request GPMC CS\n");
    return err;
    }

    /* Set timings in GPMC */
    err = omap2_nand_gpmc_retime(gpmc_nand_data);
    if (err < 0) {
    dev_err(dev, "Unable to set gpmc timings: %d\n", err);
    return err;
    }

    /* Enable RD PIN Monitoring Reg */
    if (gpmc_nand_data->dev_ready) {
    gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_RDY_BSY, 1);
    }

    err = platform_device_register(&gpmc_nand_device);
    if (err < 0) {
    dev_err(dev, "Unable to register NAND device\n");
    goto out_free_cs;
    }

    return 0;

    out_free_cs:
    gpmc_cs_free(gpmc_nand_data->cs);

    return err;
    }

  • 不是这个意思,肯定是占用的。

    我前面说的,NAND没有地址线,不是说不占地址空间,而是因为他通过stream mode的方式通信,这种方式不支持地址线寻址。NAND就是这样的设备。

  • 谢谢回复!那请问我要如何查看nandflash占用GPMC的空间呢,因为我现在要通过GPMC连接另外一个外设,如果不清楚nandflsh占用的空间的话,我怕两个外设的地址空间会重合

  • 1. 从Linux源码里面找,ls的朋友给了你提示了。

    2. 在板子起来后通过“devmem2 0x50000078”即可查看GPMC_CONFIG_7_0的寄存器配置,结果0xF48,代表基址位0x0800 0000,大小16M,即为0x08000000~0x08FFFFFF为当前的NAND使用空间。

    如果还有问题的话,看看这篇文章吧:

    http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/25/5633.AM335x-GPMC_216A5757305740573A53DF5712520652E68BE389_.pdf

  • 请问我下面的理解是否正确:

    CS0外挂一块512M Nand

    如果CONFIG7_0 = 0x050,则表示基地址为0x1000_0000,大小为512M,地址范围为:0x1000 0000~0x1FFF FFFF,但是这个范围实际为256M,所以这样设置仅仅只能访问Nand的前256M空间。要想访问整个Nand空间,需将其设置为0x40。

    这样理解对吗? 

  • 我翻看了一下我前面给的信息,可能误导你了。对于NOR flash这种有地址线数据线可以直接寻址的,需要做地址映射的设备,这个地址空间才有意义,上面说的这一些才是有意义的。但NAND flash是使用流控的,和地址映射的方式不一样,通过command进行地址的访问。有点像SD卡的访问一样,不需要做地址的映射。那个地址空间的设置是没多大意义。你只要激活片选,给个16M的空间即可,给大了也没意义,因为NAND不会把数据映射到这个空间里的。

    网上搜一搜NAND操作的方式,可以参考一下这个:NAND FLASH 读写操作 简介

    http://blog.chinaunix.net/uid-26739173-id-3158739.html

  • NAND内部的地址是通过8/16位的数据线上的command进行寻址的,而不是GPMC的地址线寻址的。

    GPMC每个CS的片选空间地址最小是16M,所以给NAND分配了0x00000000开始的16M地址空间,你可以仔细读一下gpmc_cs_request()这个函数的代码