Linux SD卡:如何强制内核在不移除SD卡的情况下再次读取WP pin

Linux SD卡:如何强制内核在不移除SD卡的情况下再次读取WP pin,linux,embedded-linux,mount,udev,automount,Linux,Embedded Linux,Mount,Udev,Automount,我有以下udev规则将sd卡的第一个分区装载到/mnt/sdcard KERNEL=="mmcblk0p1", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="sdcard", RUN+="/usr/bin/mount_sdcard" KERNEL=="mmcblk0", ACTION=

我有以下udev规则将sd卡的第一个分区装载到/mnt/sdcard

KERNEL=="mmcblk0p1", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="sdcard", RUN+="/usr/bin/mount_sdcard"

KERNEL=="mmcblk0", ACTION=="remove", RUN+="/usr/bin/unmount_sdcard"
我的
/usr/bin/mount_sdcard
可执行文件是:

#!/bin/sh

# log event
logger -t mount_sdcard -p user.warn "New SD Card detected"

# mount to /mnt/sdcard
mount_result=`mount $DEVNAME /mnt/sdcard 2>&1`

# On errors, send error to log
echo $mount_result | logger -t mount_sdcard -p user.error

if [ "x$mount_result" = "x" ]
then
    # print filesystem type
    stat -f /mnt/sdcard | grep Type | cut -d: -f4 | logger -t mount_sdcard -p user.warn

    # print space left on device
    df -h /dev/sdcard | logger -t mount_sdcard -p user.warn
fi
此代码工作正常,当插入sd卡时,分区已装入读写(rw)

但如果sd卡在引导时已经存在,则分区将以只读(ro)方式装入

在这种情况下,如果不手动卸下并重新插入sd卡,则无法装入分区读写

我试图卸载,然后再次装载。我尝试使用remount选项:
mount-o remount,rw/dev/mmcblk0p1
,它似乎可以工作,但在运行
mount
命令时分区仍然标记为ro:

/dev/mmcblk0p1 on /mnt/sdcard type ext4 (ro,relatime,data=ordered)
更新:

问题更为精确: 这是在定制硬件上,其中ARM处理器上的WP(写保护)引脚连接到处理器的输出

引导时,此输出将sd卡控制器设置为只读模式,初始化后,此输出反转以允许写入sd卡。 问题是,内核将仅在引导和插入卡时尝试读取此WP pin

==>引导时,内核sd卡控制器将卡设置为ro:

kernel: [    1.723728] mmc0: new high speed SD card at address 59b4
kernel: [    1.738262] mmcblk0: mmc0:59b4 USD   1.87 GiB (ro)
在WP pin发生变化并且卡被移除/重新填充后,内核sd卡控制器将该卡设置为rw:

kernel: [  527.931457] mmc0: new high speed SD card at address 59b4
kernel: [  527.943988] mmcblk0: mmc0:59b4 USD   1.87 GiB

我的问题变了:如何强制内核在不移除sd卡的情况下再次读取WP pin?

我会尝试以下几件事:

  • 运行
    fsck/dev/mmcblk0p1
    。在
    rw
    模式下装载分区失败通常是文件系统状态不干净的标志。这里的情况可能不是这样,因为你可以通过补发卡片正确地挂载它,但最好是安全的

  • 试着通过
    /etc/fstab
    挂载
    /dev/mmcblk0p1
    ,看看是否有效。我知道这不是一个确定的解决方案,但至少您可以将
    mount
    的问题与
    udev
    的问题隔离开来

  • 将开机时SD卡的
    dmesg
    输出与之后重新加载SD卡时的
    dmesg
    输出进行比较。控制器似乎无法在启动时正确初始化,但问题稍后会消失。找出间歇性问题是什么可能会为您解决它


通过使用以下命令重置此卡的控制器,我能够再次读取WP pin:

首先获取控制器:

$ readlink /sys/block/mmcblk0
../devices/soc0/soc/2100000.aips-bus/2194000.usdhc/mmc_host/mmc0/mmc0:59b4/block
然后解开并绑定卡片:

$ echo 2194000.usdhc > /sys/bus/platform/drivers/sdhci-esdhc-imx/unbind
$ echo 2194000.usdhc > /sys/bus/platform/drivers/sdhci-esdhc-imx/bind

您是否尝试过,mount_result=
mount$DEVNAME/mnt/sdcard-o rw 2>&1
尝试卸载然后重新加载相关模块,您的控制器可能会被“重新检测”并重新初始化。不过,您似乎已经找到了解决方案。谢谢,fsck和fstab点不起作用。但问题是:WP引脚在引导后发生变化。现在我需要知道如何在不拔下sd卡的情况下通过内核强制重新加载sd卡。@leszek.hanusz嘿,很高兴你解决了这个问题。也感谢您分享您的解决方案。希望Upvots能尽快退还你的赏金!