接続しているsdカードの認識可否の検出方法

キャリアボードに接続しているSDカードが何かの要因で認識できなくなったことを検出したい場合、どのような方法がありますか?

このトピックの様にカーネルログから検出する方法はあるのでしょうか?
電池が切れた時のrtcの振る舞いについて

tdx-infoの出力内容は下記の通りです。

Software summary

Bootloader: U-Boot

Kernel version: 5.15.129-6.5.0-devel+git.6f8fd49366db #1 SMP PREEMPT Fri Dec 22 11:15:52 UTC 2023
Kernel command line: root=PARTUUID=577cc89f-02 ro rootwait console=tty1 console=ttymxc2,115200 consoleblank=0 earlycon
Distro name: NAME=“TDX Wayland with XWayland”
Distro version: VERSION_ID=6.5.0-devel-20240327230744-build.0
Distro variant: -
Hostname: verdin-imx8mp-15230634

Hardware info

HW model: Toradex Verdin iMX8M Plus on Verdin Development Board

Toradex version: 0063 V1.1B
Serial number: 15230634
Processor arch: aarch64

Hi, I’m the Toradex AI Assistant.

I might make mistakes. Our support team will step in if needed. If I answered your question, please tick the “Solution” checkbox. For follow-up questions to me, please use @ToradexAI in your post.

Did you like my answer? :+1: :-1:


こんにちは!ご質問ありがとうございます。

キャリアボードに接続しているSDカードが何らかの要因で認識できなくなったことを検出するには、以下のような方法が考えられます。

1. カーネルログの監視

SDカードの挿入や取り外し、エラー発生時にはカーネルログにメッセージが出力されます。
具体的には、dmesg コマンドや journalctl -kmmcmmcblksdhci などのキーワードを含むログに注目します。

例えば、カードの認識エラーが発生すると次のようなメッセージが出ることがあります。

mmc0: card XXXX removed
mmc0: error -110 whilst initialising SD card

このようなログを監視することで、SDカードの認識状態を検出できます。

2. デバイスファイルの存在チェック

SDカードが認識されている場合は /dev/mmcblk* のようなデバイスファイルが存在します。
これらのファイルの有無を定期的に確認することで、認識状態を検出できます。
例:

if [ -e /dev/mmcblk1 ]; then
  echo "SDカード認識中"
else
  echo "SDカード未認識"
fi

3. sysfsの監視

/sys/class/mmc_host/ 以下のサブディレクトリ(例:mmc0mmc1)にあるファイル内容や存在を監視することも有効です。

4. udevルールの利用

SDカードの挿抜イベントに合わせてカスタムスクリプトを実行したい場合は、udevルールを作成することもできます。


上記のように、カーネルログを監視する方法は一般的かつ有効ですので、ご要望の内容にも合致しています。

詳細については、以下もご参考ください:

ご質問の内容で追加や具体的な運用例が必要な場合は、お知らせください。

Best regards, Toradex AI Assistant.

電池が切れた時のrtcの振る舞いについてと同様に、Qt5で作成したアプリからSDカードの認識状況を検出したいです。

QProcess process;
process.start("journalctl", {"-k", "-b", "--no-pager"});
process.waitForFinished();

QString output = process.readAllStandardOutput();
return output.contains("oscillator stop detected");

→"oscillator stop detected"をSDカードの認識に関する文字列に変更すればいいでしょうか?
その場合、該当する文字列を教えていただきたいです。

ご連絡ありがとうございます。
お返事が遅くなり申し訳ございません。

カーネルログを確認することでSDカード関連の変化(例えば挿抜)があった場合には検出できますが、
変化がない限りログに出ないため、アプリケーション側での検出としては確実性に欠ける場合があります。

そのため、より確実な方法としてはSDカードが現在認識されているかどうかを
Qtアプリケーションから /dev/ 以下の該当デバイスが存在しているかどうかで判断する方法をおすすめします。どのデバイス名になるかは mount コマンドなどで一度確認していただけると確実です。

Qt5のコード例としては、以下のように QFileInfo クラスを使って /dev/mmcblk1 が存在するかをチェックできます:

#include <QFileInfo>

bool isSdCardAvailable() {
    QFileInfo sdDevice("/dev/mmcblk1");
    return sdDevice.exists();
}

必要に応じて /dev/mmcblk1p1 やマウントポイント(例:/media/sdcard)をチェックする方法もあります。

また、SDカードの抜き差しイベントを監視したい場合は udevinotify を利用するという選択肢もありますが、
アプリケーションの構成によってはシンプルに上記のようなポーリングで十分なケースもあります。

以上、引き続きよろしくお願いいたします。
アルバロ。

お忙しい中ご連絡ありがとうございます。
ご提案いただいたコード例でSDカードの挿抜を検出できました。
ありがとうございました。

1 Like