背景
在u-boot中升级镜像,会用到emmc擦除,但是在擦除emmc时,出现了警告:
Caution! Your devices Erase group is 0x400
The erase range would be change to 0x30000~0x303ff
我擦除的起始块地址为:0x30000, 块个数为: 1,但是警告说擦除的范围是 0x30000~0x303ff,明显是擦除了1024个块。
u-boot擦除源码
drivers/mmc/mmc_write.c:79
unsigned long mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt)
{
int err = 0;
struct mmc *mmc = find_mmc_device(dev_num);
lbaint_t blk = 0, blk_r = 0;
int timeout = 1000;
if (!mmc)
return 0;
blk = start;
blk_r = start + blkcnt;
if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size)){
printf("\n\nCaution! Your devices Erase group is 0x%x\n"
"The erase range would be change to "
"0x" LBAF "~0x" LBAF "\n\n",
mmc->erase_grp_size, start & ~(mmc->erase_grp_size - 1),
((start + blkcnt + mmc->erase_grp_size)
& ~(mmc->erase_grp_size - 1)) - 1);
blk = (start & ~(mmc->erase_grp_size - 1));
blk_r = ((start + blkcnt + mmc->erase_grp_size) & ~(mmc->erase_grp_size - 1)) - 1;
}
if(blk_r > mmc->capacity / MMC_MAX_BLOCK_LEN)
blk_r = mmc->capacity / MMC_MAX_BLOCK_LEN;
blk_r = blk_r - blk;
err = mmc_erase_t(mmc, blk, blk_r);
if (err) {
printf("Err: erase mmc error\n");
return 0;
}
/* Waiting for the ready status */
if (mmc_send_status(mmc, timeout))
return 0;
return blk_r;
}
程序中的mmc->erase_grp_size=1024 (0x400),也就是说emmc擦除是1024个块为单位,不能是1个块,在擦除过程中u-boot自动对齐了擦除块。
emmc擦除块大小
在EMMC规范中,规定了擦除块的大小,擦除块的大小定义在EMMC的CSD寄存器中,在emmc上电初始化的时候进行读取:
实际的EMMC擦除大小计算
以东芝的EMMC的CSD寄存器为例计算:
擦除大小 = (0x1f + 1) * (0x1f + 1) = 1024(块)