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);