我需要安全地擦除嵌入式系统中的MMC卡。但是,我的ioctl(BLKSECDISCARD)
会返回EOPNOTSUPP
,(BLKDISCARD
也是如此)。
通过读取内核代码,MMC驱动程序通过在QUEUE_FLAG_DISCARD
中设置kernel/linux/drivers/mmc/card/queue.c mmc_queue_setup_discard()
来启用DISCARD,其调用如下:
if (mmc_can_erase(card))
mmc_queue_setup_discard(mq->queue, card);
mmc_can_erase()
中将kernel/linux/drivers/mmc/core/core.c
定义为:
int mmc_can_erase(struct mmc_card *card)
{
if ((card->host->caps & MMC_CAP_ERASE) &&
(card->csd.cmdclass & CCC_ERASE) && card->erase_size)
return 1;
return 0;
}
满足mmc_can_erase()
条件需要什么?
它是卡,控制器,驱动程序,内核构建方式或其他内容的功能吗?
理想情况下,我想启用BLKSECDISCARD
功能,但我不确定我需要做什么,或者即使在我的嵌入式系统上也可以。可以吗?
答案 0 :(得分:2)
card->host->caps
描述了主机控制器的功能。设置此项(假设支持)取决于您使用的控制器,例如SDHCI控制器在sdhci_setup_host()
中的设置。
card->csd.cmdclass
,并指示该卡支持哪些类别的命令。在这种情况下,代码检查擦除类命令。请参阅mmc_decode_csd()
。
card->erase_size
也可以从卡的CSD(如果卡上有CSD,也可以是扩展的CSD)中读取,并在mmc_set_erase_size()
中设置。
这些都不取决于内核的构建方式,而是取决于硬件的功能。要找出哪个(哪些)阻止您使用安全擦除,您需要在内核中添加一些检测以打印这些字段的值。