nand flash erase 函数调用流程

本文跟踪linux4.1源码中driver/mtd/mtdcore.c文件中mtd_erase()函数的调用流程。

当其它模块或文件系统想要某个flash 块时,可通过MTD子系统提供的mtd_erase()函数来操作。
本文只是erase的流程框架,不会详细描述细节。

mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
    //对于nand flash 来说mtd->_erase指向nand_erase()函数。
    mtd->_erase(mtd, instr);
        //检查擦除地址与擦除长度是否是按擦除块对齐,如果不是出错返回。
        return nand_erase_nand(mtd, instr, 0);
            while (len) {
                //检查要擦除的块是否为坏块,如果是坏块,则不擦除,直接退出
                nand_block_checkbad()
                // chip->erase指向single_erase()函数。此函数负责擦除块。
                status = chip->erase(mtd, page & chip->pagemask);
                    //擦除块,需要两条指令,分别为NAND_CMD_ERASE1,NAND_CMD_ERASE2,
                    //发送完成后,再调用chip->waitfunc函数等待erase完成。
                    chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
                        //在发送NAND_CMD_ERASE1时,会附带上要擦除的块地址。
                        //所以这两条chip->cmd_ctrl指令,第一条是用来发送命令的,
                        //第二条是用来发送地址的。
                        chip->cmd_ctrl(mtd, command, NAND_NCE| NAND_CLE|NAND_CTRL_CHANGE);
                        chip->cmd_ctrl(mtd, page_addr >> 16,NAND_NCE | NAND_ALE);
                    chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
                    //chip->waitfunc指向nand_wait()函数。
                    return chip->waitfunc(mtd, chip);
            }
            //如果失败,则调用erase_info->callback()函数。
            if (!ret)
                mtd_erase_callback(instr);
                    instr->callback(instr);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值