天嵌 ARM开发社区

 找回密码
 注册
查看: 3583|回复: 2

void nand_init(void) 问题

[复制链接]
guobinname_301 发表于 2012-10-31 14:08:33 | 显示全部楼层 |阅读模式
在下面的函数中有定义base_address[i]);

void nand_init(void)
{
        int i;
        unsigned int size = 0;
        for (i = 0; i < CFG_MAX_NAND_DEVICE; i++) {
                nand_init_chip(&nand_info[i], &nand_chip[i], base_address[i]);
                size += nand_info[i].size;
                if (nand_curr_device == -1)
                        nand_curr_device = i;
        }
}
而base_address[i])最终指向edbedsky.h 中的#define CFG_NAND_BASE  0
问:什么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 | 显示全部楼层
那能先回复第一个问题吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-16 09:47 , Processed in 2.037021 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表