void nand_init(void) 问题
在下面的函数中有定义base_address);void nand_init(void)
{
int i;
unsigned int size = 0;
for (i = 0; i < CFG_MAX_NAND_DEVICE; i++) {
nand_init_chip(&nand_info, &nand_chip, base_address);
size += nand_info.size;
if (nand_curr_device == -1)
nand_curr_device = i;
}
}
而base_address)最终指向edbedsky.h 中的#define CFG_NAND_BASE0
问:什么CFG_NAND_BASE不是0x4e000000,而定义为 0 ,或者定义成任何值都无所谓?能给点详细的解释吗?请大侠指点!!!
再问个问题在下面的函数中
static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
ulong base_addr)
{
mtd->priv = nand;
nand->IO_ADDR_R = nand->IO_ADDR_W = (void__iomem *)base_addr; board_nand_init(nand);
if (nand_scan(mtd, 1) == 0) {
if (!mtd->name)
mtd->name = (char *)default_nand_name;
} else
mtd->name = NULL;
}
上面的函数中有这样一段代码nand->IO_ADDR_R = nand->IO_ADDR_W = (void__iomem *)base_addr;
紧接着在void board_nand_init(struct nand_chip *chip)函数中也定义了
chip->IO_ADDR_R = (void *)&s3c2440nand->NFDATA;
chip->IO_ADDR_W = (void *)&s3c2440nand->NFDATA;
chip->hwcontrol = s3c2440_nand_hwcontrol;
问上面的 IO_ADDR_R 和 IO_ADDR_W 的值是否是指向NFDATA指针的指针???
第3个问题在int nand_scan (struct mtd_info *mtd, int maxchips)函数中
有一句this->select_chip = nand_select_chip;和 this->select_chip(mtd, 0);
nand_select_chip的完整代码如下
static void nand_select_chip(struct mtd_info *mtd, int chip)
{
struct nand_chip *this = mtd->priv;
switch(chip) {
case -1:
this->hwcontrol(mtd, NAND_CTL_CLRNCE);
break;
case 0:
this->hwcontrol(mtd, NAND_CTL_SETNCE);
break;
default:
BUG();
}
}
其中的hwcontrol在前面指向chip->hwcontrol = s3c2440_nand_hwcontrol
static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd)
{
S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();
struct nand_chip *chip = mtd->priv;
switch (cmd) {
case NAND_CTL_SETNCE
case NAND_CTL_CLRNCE:
printf("%s: called for NCE\n", __FUNCTION__);
break;
case NAND_CTL_SETCLE:
chip->IO_ADDR_W = (void *)&s3c2440nand->NFCMD;
break;
case NAND_CTL_SETALE:
chip->IO_ADDR_W = (void *)&s3c2440nand->NFADDR;
break;
/* NAND_CTL_CLRCLE: */
/* NAND_CTL_CLRALE: */
default:
chip->IO_ADDR_W = (void *)&s3c2440nand->NFDATA;
break;
}
}
请问执行this->select_chip(mtd, 0) 时 下面的语句是如何完成使能nandflash的???
case NAND_CTL_SETCLE:
chip->IO_ADDR_W = (void *)&s3c2440nand->NFCMD;
break;
请大侠们指点,我在这里绕不过去啊,希望能把对Nandflash寄存器赋值的过程讲通透的!!!!!
这个是有点绕,刚开始都这样,不过要几句话讲清也很难讲请了,还是看芯片手册靠本些 那能先回复第一个问题吗?
页:
[1]