Linux kernel 如何在MMC/SD卡上强制复位 背景:

Linux kernel 如何在MMC/SD卡上强制复位 背景:,linux-kernel,reset,boot,Linux Kernel,Reset,Boot,我有一个嵌入式系统(我不能改变硬件)和一个自建的Linux系统(我可以完全控制软件) 这个系统有几个(3线,3.3V)串行线路,我无法控制连接的位置(我可以在引导后找到) 问题: 若一些外部设备连接到串行线,直接连接到微控制器(MT7628AN,若有关系)的RX线上的“标记”(通常我无法阻止)足以为系统提供一些电源 唯一重要的地方是SD卡(同样,直接连接到微控制器),它从未完全断电 在这种情况下,我经常在开机时看到: [ 4.679850] mmc0: card never left bu

我有一个嵌入式系统(我不能改变硬件)和一个自建的Linux系统(我可以完全控制软件)

这个系统有几个(3线,3.3V)串行线路,我无法控制连接的位置(我可以在引导后找到)

问题: 若一些外部设备连接到串行线,直接连接到微控制器(MT7628AN,若有关系)的RX线上的“标记”(通常我无法阻止)足以为系统提供一些电源

唯一重要的地方是SD卡(同样,直接连接到微控制器),它从未完全断电

在这种情况下,我经常在开机时看到:

[    4.679850] mmc0: card never left busy state
[    4.684203] mmc0: error -145 whilst initialising SD card
这在引导序列中重复四次,以后的SD设备(
/dev/mmcblk0*
)不可用

如果我稍后编译mmc驱动程序(
mtk_mmc.ko
,如果有必要)和
modprobe mtk_mmc
,也会出现类似的情况

问题: 在初始化序列之前/期间/之后,我是否可以通过软件向MMC发送任何命令序列,以“仿佛”电源已断开,将其完全重置

注: 这尤其糟糕,因为我的根文件系统(部分)位于该MMC卡上,因此任何调整都应该在kernel/initrd中完成


重要的是:所有MMC卡都是:“超越8GB C10 MicroSD HC”。

如果在内核源代码中搜索该错误文本,您会发现这是一个失败命令的结果,该命令之前应该有一个软件重置。你在问一个XY问题。您似乎不理解或不陈述X问题,但假设发布软件重置是解决方案。顺便说一句,仅仅因为MMC和SD卡使用相同的卡连接器并不意味着它们是等效的。MMC和SD卡有各自组织发布的不同标准。“mmc”恰好是这两种卡的Linux设备驱动程序的名称。@sawdust:对不起,我不明白您的意思。I在drivers/mmc/core/sd_ops.c:mmc_send_app_op_cond()中发生了什么问题,它是在drivers/mmc/core/sd.c:mmc_attach_sd()的最开始调用的。我想问题是因为mmc_send_app_op_cond()希望卡能够重新通电,而不是这样的(如果在重新启动时执行真正的通电循环,系统就不会出现问题)。当然我不完全理解,否则我就不会寻求帮助。你能帮我理解我缺少的“X问题”是什么吗?好的,你找到了相关的程序。现在回到调用该例程的场合。在调用该例程的每个实例(我发现两个)之前,都会调用mmc_go_idle(),这会发出软件重置。您看到的错误消息实际上是一个报告,表明软件重置(即空闲命令)从未完成!这就是X问题。我怀疑发布另一个软件重置是解决方案(除非存在某种时间问题)。