sysfs 替代 /proc/acpi/button/lid/LID/state

sysfs 替代 /proc/acpi/button/lid/LID/state

procfs新内核版本中已弃用ACPI 。在sysfs应该取代它的中,我不知道有什么干净的方法来读取盖子按钮的状态。这样做的新方法是什么?

答案1

TL;DR:由于笔记本电脑的质量差和有缺陷的珍贵的、专有的、经过 NDA 的固件,这个确切的功能已经永远消失了。但有一个解决方法。

根据这个线程在 Linux 内核错误跟踪器上,太多笔记本电脑的固件在启动时将其内部盖子状态变量初始化为零 - 这意味着关闭。尽管事实上没有人可以在盖子关闭的情况下打开笔记本电脑(这总是在开机前由固件检查),导致真实状态与固件报告的状态之间明显不匹配。

因此,内核完全忽略固件静态报告的状态。为了维护自己的状态,它仅依赖于固件的 ACPI 中断事件来报告设备启动后状态的变化,并假设其处于打开状态,除非另有证明。

根用户可以通过调用适当的输入设备直接检查内核状态。虽然 C 代码很简单,但您仍然可以使用现有实用程序,evtest如下所示斯图尔特·P·本特利的回答:

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

非特权用户logind只能通过D-Bus 上的 systemd 查询状态(自 v240 起):

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

我有同样的问题 - 遗憾的是,似乎没有(至少,对于我的系统设置方式而言)。 A补丁于 2010 年提交至 Linux 内核邮件列表这将向 sysfs 添加文件以查询 GPIO 开关的状态,但是该补丁似乎已被撤回在提交者被告知ioctl()阅读本文的请求后 ( EVIOCG*)。

我要使用的解决方案是使用测试查询开关状态(如果盖子打开则退出 0,如果盖子关闭则退出 10):

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

不过,如果这个解决方案有一个不需要 root 访问权限的版本,那就太好了。

相关内容