安卓tf卡无法使用现象
系统:安卓4.4
硬件:arm设备
t卡: 64GB 10 A1 microSD
出货后有用户反馈一批sdcard/tf卡用不了.
tf卡
Trans-flash Card(TF卡),2004年正式更名为Micro SD Card
当前产品用的是闪迪与金士顿的卡.
分析过程
拆了7台问题机,除一张t卡坏了外,其余卡插到电脑上后再放到设备上恢复正常。
出厂才几个月,卡未见破损等不良现象。
- 一张电脑上识别为容量30多M,无法格式化,卡坏了。
- 一张已经使用了144M, 说明这张卡是使用后出问题的。
2.1 拆机后,把卡从设备上拿走后再放到设备上,重新开机,无效;
2.2 放电脑上插拔了下(不打开t卡,不格式化)再放回设备后正常。 - 一张卡,放电脑上插拔(不格式化,新建了文本,说明放电脑上时卡就是能正常读写的)再放回设备后正常。
- 其余未来得及实验就直接在电脑上进行格式化了,再放回设备后也正常。
- 也与原厂沟通,也只是给了个兼容性的列表出来,也无法提供有效帮助.
解决
开启kernel中的SD_INIT的宏
CONFIG_MMC_PARANOID_SD_INIT=y
这样内核在检测sd卡失败后会自动重新初始化检测.
代码
kernel/drivers/mmc/core/sd.c
搜索CONFIG_MMC_PARANOID_SD_INIT可以看到一些关联代码,这里截取detect函数部分
/*
* Card detection callback from host.
*/
static void mmc_sd_detect(struct mmc_host *host)
{
int err = 0;
#ifdef CONFIG_MMC_PARANOID_SD_INIT
int retries = 5; // 检测失败后的重试次数
#endif
BUG_ON(!host);
BUG_ON(!host->card);
mmc_get_card(host->card);
/*
* Just check if our card has been removed.
*/
#ifdef CONFIG_MMC_PARANOID_SD_INIT
while(retries) {
err = mmc_send_status(host->card, NULL);
if (err) {
retries--;
udelay(5);
continue;
}
break;
}
if (!retries) {
printk(KERN_ERR "%s(%s): Unable to re-detect card (%d)\n",
__func__, mmc_hostname(host), err);
}
#else
err = _mmc_detect_card_removed(host);
#endif
mmc_put_card(host->card);
if (err) {
mmc_sd_remove(host);
mmc_claim_host(host);
mmc_detach_bus(host);
mmc_power_off(host);
mmc_release_host(host);
}
}
图片引用自 SD卡在嵌入式系统设计中的简单总结
存储卡市场
随着智能手机、平板电脑等移动设备的普及,以及高清视频、高分辨率照片和大型应用程序的广泛使用,手机存储卡市场规模持续扩大。据市场报告预测,到2025年,全球存储卡市场规模将达到120亿美元,显示出该市场在过去几年中保持稳定增长态势。其中,手机存储卡市场份额最高,超过45%,成为推动整个存储卡市场增长的主要动力。在中国市场,镁光(Kingston)、芝奇(Samsung)和闪迪(SanDisk)等企业占据了大部分份额,市场份额超过60%。
作者: 帅得不敢出门 原创文章谢绝转载收录