TI的am335x的处理器,板子上带有512M的nandflash,通过GPMC总线连接,请问怎样查看nandflash占用GPMC总线的地址空间情况,我还想连其他外设,但是GPMC支持的地址空间最大为512M,请问我该怎么办?
Steven Liu1:
TRM7.1 GPMC章节,查一下GPMC_CONFIG7_i的寄存器。其中i代表你使用的是片选几。也可以参考这个链接:http://blog.csdn.net/swallow71701/article/details/22793191
leo chen:
回复 Steven Liu1:
我觉得nand的地址空间 和 GPMC的地址空间不是一回事
nand占用gpmc的地址空间 主要看他占用gpmc多少地址线
Steven Liu1:
回复 leo chen:
首先,NAND是通过stream的方式进行通信,所以NAND和GPMC通信没有地址线,只有数据线。
其次,我理解你的意思是不是说,NAND的地址空间,和规划出的GPMC地址空间,可能不一致;真实的NAND的地址空间,是要看NAND的大小?
如果是这个意思的话,你是可以通过配置GPMC_CONFIG7_i这个寄存器的【11-8】bit,来配置GPMC空间的大小,即为你NAND的空间大小,最小16MB,最大256MB,确保这个地址空间是match的。
Jian Zhou:
回复 Steven Liu1:
如果你是用Linux驱动,那么请你看一下gpmc_nand_init()这个函数,里面给NAND所占用的CS0片选的地址空间,应该是16M
lei kou:
回复 Steven Liu1:
谢谢回复!!
你的意思是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},};
lei kou:
回复 Jian Zhou:
你好!谢谢回复!!!,这个是函数源码,看不出是占用了多少呀!
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;}
Steven Liu1:
回复 lei kou:
不是这个意思,肯定是占用的。
我前面说的,NAND没有地址线,不是说不占地址空间,而是因为他通过stream mode的方式通信,这种方式不支持地址线寻址。NAND就是这样的设备。
lei kou:
回复 Steven Liu1:
谢谢回复!那请问我要如何查看nandflash占用GPMC的空间呢,因为我现在要通过GPMC连接另外一个外设,如果不清楚nandflsh占用的空间的话,我怕两个外设的地址空间会重合
Steven Liu1:
回复 lei kou:
1. 从Linux源码里面找,ls的朋友给了你提示了。
2. 在板子起来后通过“devmem2 0x50000078”即可查看GPMC_CONFIG_7_0的寄存器配置,结果0xF48,代表基址位0x0800 0000,大小16M,即为0x08000000~0x08FFFFFF为当前的NAND使用空间。
如果还有问题的话,看看这篇文章吧:
STONE:
回复 Steven Liu1:
请问我下面的理解是否正确:
CS0外挂一块512M Nand
如果CONFIG7_0 = 0x050,则表示基地址为0x1000_0000,大小为512M,地址范围为:0x1000 0000~0x1FFF FFFF,但是这个范围实际为256M,所以这样设置仅仅只能访问Nand的前256M空间。要想访问整个Nand空间,需将其设置为0x40。
这样理解对吗?