3

SD カードの最初のパーティションを /mnt/sdcard にマウントするための次の udev ルールがあります。

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 カードを手動で取り外して再挿入しないと、パーティションの読み取り/書き込みをマウントできません。

アンマウントしてから、再度マウントしようとしました。再マウント オプションを使用しようとしました: これは機能しているように見えますが、コマンドmount -o remount,rw /dev/mmcblk0p1を実行すると、パーティションはまだ ro としてマークされています:mount

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

アップデート:

問題はより正確です。これは、ARM プロセッサの WP (書き込み保護) ピンがプロセッサの出力に配線されているカスタム ハードウェアにあります。

ブート時に、この出力は SD カード コントローラを読み取り専用モードに設定し、初期化後にこの出力が反転されて SD カードへの書き込みが可能になります。問題は、カーネルが起動時とカード挿入時にのみこの WP ピンを読み取ろうとすることです。

==> ブート時に、カーネル 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 ピンが変更され、カードが取り外されて再接続された後、カーネル 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 ピンを再度読み取らせるにはどうすればよいですか?

4

2 に答える 2

3

次のコマンドでこのカードのコントローラーをリセットすることで、WP ピンを再度読み取ることができました。

最初にコントローラーを取得します。

$ 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
于 2016-03-21T16:39:23.660 に答える
1

私が試すいくつかのこと:

  • 実行しfsck /dev/mmcblk0p1ます。モードでのパーティションのマウントの失敗rwは、多くの場合、ファイルシステムの状態がクリーンでないことを示しています。カードを再接続することで正しくマウントできるため、おそらくここでは当てはまりませんが、安全を確保してください。

  • /dev/mmcblk0p1経由でマウントし/etc/fstabて、それが機能するかどうかを確認してください。決定的な解決策ではないことは承知していますが、少なくとも の問題とmountの問題を分離する必要がありますudev

  • dmesgブート時の SD カードに関する出力とdmesg、後でカードを再接続したときの出力を比較します。起動時にコントローラーが正しく初期化されていないように見えますが、問題は後で解消されます。その断続的な問題が何であるかを見つけることで、それが解決されるかもしれません.

于 2016-03-18T09:35:49.397 に答える