DSP

nand flash erase 函数调用流程

2019-07-13 18:08发布

本文跟踪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);