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.
TRM7.1 GPMC章节,查一下GPMC_CONFIG7_i的寄存器。其中i代表你使用的是片选几。也可以参考这个链接:http://blog.csdn.net/swallow71701/article/details/22793191
首先,NAND是通过stream的方式进行通信,所以NAND和GPMC通信没有地址线,只有数据线。
其次,我理解你的意思是不是说,NAND的地址空间,和规划出的GPMC地址空间,可能不一致;真实的NAND的地址空间,是要看NAND的大小?
如果是这个意思的话,你是可以通过配置GPMC_CONFIG7_i这个寄存器的【11-8】bit,来配置GPMC空间的大小,即为你NAND的空间大小,最小16MB,最大256MB,确保这个地址空间是match的。
谢谢回复!!
你的意思是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使用空间。
请问我下面的理解是否正确:
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()这个函数的代码