guobinname_301 发表于 2012-10-31 14:08:33

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寄存器赋值的过程讲通透的!!!!!


embedsky_lhh 发表于 2012-10-31 15:12:03

这个是有点绕,刚开始都这样,不过要几句话讲清也很难讲请了,还是看芯片手册靠本些

guobinname_301 发表于 2012-10-31 15:46:42

那能先回复第一个问题吗?
页: [1]
查看完整版本: void nand_init(void) 问题