sysfs は /proc/acpi/button/lid/LID/state を置き換えます。

sysfs は /proc/acpi/button/lid/LID/state を置き換えます。

procfsACPI は新しいカーネルバージョンでは廃止されました。何sysfsを交換するのか、ふたボタンの状態を読むためのきちんとした方法がわかりません。これを行う新しい方法は何ですか?

答え1

要約:この正確な機能は、低ラップトップ品質とNDAパスファームウェアの欠陥のために永遠に消えました。しかし、解決策があります。

~によるとこのスレッドLinuxカーネルのバグトラッカーでは、ラップトップのファームウェアが多すぎると、起動時に内部カバー状態変数が0に初期化されます。閉鎖。カバーが閉じた状態では誰もノートブックを開くことができないという事実にもかかわらず(電源を入れる前に常にファームウェアで確認されます)、実際の状態とファームウェアで報告された状態は明らかに一致しません。

したがって、カーネルはファームウェアが静的に報告した状態を完全に無視します。セルフステータスを維持するためにデバイスが起動した後、ファームウェアのACPI割り込みイベントにのみ依存してステータス変更を報告します。特に明記しない限り、開いている状態であると仮定します。

rootユーザーカーネルの状態は、対応する入力デバイスを呼び出して直接確認できます。 Cコードは簡単ですが、evtest以下のように既存のユーティリティを引き続き使用できます。スチュアートP.ベントレーの答え:

evtest --query "/dev/input/EVENT_N" "EV_SW" "SW_LID" && echo "open" || echo "closed"

権限のないユーザーlogindステータスは、D-Bus(v240以降)のsystemdを介してのみ照会できます。

dbus-send --system --print-reply=literal \
    --dest="org.freedesktop.login1" "/org/freedesktop/login1" \
    "org.freedesktop.DBus.Properties.Get" \
        string:"org.freedesktop.login1.Manager" string:"LidClosed" | \
            awk 'NR == 1 { print $3 == "true" ? "closed" : "open" }'

または

busctl get-property "org.freedesktop.login1" "/org/freedesktop/login1" \
    "org.freedesktop.login1.Manager" "LidClosed" | \
        awk 'NR == 1 { print $2 == "true" ? "closed" : "open" }'

答え2

私にも同じ問題があります。残念ながら、そのような問題はないようです(少なくとも私のシステムが設定された方法では)。 ㅏ2010年に、Linuxカーネルメーリングリストにパッチが提出されました。これにより、GPIOスイッチの状態を照会するためにsysfsにファイルが追加されますが、パッチは撤回されたようです提出者にioctl()この記事の閲覧要求を通知した後(EVIOCG*)。

私がしようとしている解決策は次のとおりです。テストスイッチ状態の問合せ

sudo evtest --query /dev/input/event5 EV_SW SW_LID

しかし、rootアクセスを必要としないこのソリューションのバージョンがあれば良いでしょう。

関連情報