三星 Galaxy Book 系列附加 Linux 平台驱动程序。
目前状态:
其目的是在 Linux 中复制三星在 Windows 中所做的事情,我认为以下组件正在做的事情:
SCAI
ACPI 设备交互以控制许多此类设置。SamsungSystemSupportEngine.exe
的服务,该程序似乎处理用户空间/应用程序方面的很多事情,包括:这是一个新的(当前)完全树外内核平台驱动程序,旨在模仿Samsung 系统事件控制器Windows 系统设备驱动程序似乎正在执行的操作(即与SCAI
ACPI 设备通信以控制这些额外功能) )。添加更多功能并经过测试后,我的目的是尝试提交要添加到内核的驱动程序。
目前已实现以下功能:
fan_speed_rpm
sysfs 属性以及新的 hwmon 设备进行风扇速度监控以下功能可能可以实现,但需要额外的调试和开发:
SAM0427
的型号的屏幕亮度此平台驱动程序支持的设备应该是sudo dmidecode --type 3
报告的任何设备Manufacturer: SAMSUNG ELECTRONICS CO., LTD.
Type: Notebook
,此外,ACPI 设备SCAI
ACPI 设备 ID 与驱动程序中给出的列表匹配(撰写本文时为SAM0427
、 SAM0428
、 SAM0429
和SAM0430
)。这涵盖了大多数当前可用的“Samsung Galaxy Book”系列笔记本电脑,但也可能包括其他笔记本电脑。
目的是平台驱动程序中的每个功能在启用该功能之前都会尝试以某种方式测试它是否受支持。某些设备的硬件略有不同和/或行为方式略有不同;如果您的设备的驱动程序禁用了您认为应该支持的某些功能,请创建一个问题!
我还发现 Windows 对SAM0426
使用相同的驱动程序(由 Notebook 9 Pro 15" 和/或类似设备使用),因此我怀疑该驱动程序的大部分内容可能也适用于这些设备。如果您有一个这些设备,并想用它来测试这个驱动程序,请创建一个问题来寻求帮助并分享您的发现。
平台驱动程序支持以下模块参数:
kbd_backlight
:启用键盘背光控制(默认打开)(布尔)battery_threshold
:启用电池充电阈值控制(默认打开)(布尔)performance_mode
:启用性能模式控制(默认打开)(布尔)allow_recording
:启用控件以允许或阻止访问摄像头和麦克风(默认打开)(布尔)fan_speed
:启用风扇速度(默认打开)(布尔)i8042_filter
:启用捕获键盘热键事件(默认打开)(布尔)一般来说,这些参数的目的是允许启用或禁用驱动程序提供的各种功能,特别是在特定功能似乎导致设备出现问题的情况下。各种“设置”平台属性( usb_charge
、 start_on_lid_open
等)的可用性将始终启用(如果它们似乎受支持),并且此时无法禁用。
注意:如果您发现需要禁用某些功能以避免设备出现问题,请提出问题!
在树外但针对当前加载的内核模块编译模块:
make -C /lib/modules/ ` uname -r ` /build M= $PWD
将此模块安装到当前加载的内核模块中:
sudo make -C /lib/modules/ ` uname -r ` /build M= $PWD modules_install
sudo depmod
注意:如果您希望启用调试消息,则可以添加
samsung_galaxybook.dyndbg=+p
或类似的启动参数。
加载模块(包括启用调试消息):
sudo modprobe samsung-galaxybook dyndbg=+p
卸载模块:
sudo rmmod samsung-galaxybook
卸载模块:
sudo rm /lib/modules/ ` uname -r ` /updates/samsung-galaxybook.ko *
该模块可以与 dkms 一起安装,并为每个新内核提供自动安装。
将模块添加到 dkms 树:
sudo dkms add /path/to/module/directory/samsung-galaxybook-extras
构建模块:
sudo dkms build samsung-galaxybook/extras
安装模块:
sudo dkms install samsung-galaxybook/extras
卸载模块:
sudo dkms uninstall samsung-galaxybook/extras
如果您想对驱动程序进行签名以避免出现消息samsung_galaxybook: module verification failed: signature and/or required key missing - tainting kernel
,那么您将需要按照您的发行版的典型流程对模块进行签名。对于基于 Debian 的发行版(包括 Ubunutu),您可以为当前内核安装linux-source
软件包,并使用包含的密钥和脚本对模块进行签名,如下所示:
sudo rmmod samsung-galaxybook
/usr/src/ ` uname -r ` /debian/scripts/sign-module sha512 /usr/src/ ` uname -r ` /debian/certs/signing_key.pem /usr/src/ ` uname -r ` /debian/certs/signing_key.x509 samsung-galaxybook.ko
sudo cp samsung-galaxybook.ko /lib/modules/ ` uname -r ` /updates/samsung-galaxybook.ko
sudo modprobe samsung-galaxybook dyndbg=+p
如果您启用打印调试消息,则可以使用更详细的消息。如果当前内核的CONFIG_DYNAMIC_DEBUG
已启用,则可以使用动态调试来完成此操作。有关如何使用此功能的更多信息,请参阅内核文档:动态调试
以下是一些示例:
# enable printing all messages from the module when loading it
sudo modprobe samsung-galaxybook dyndbg=+p
# enable printing all messages from the module after it has been loaded
echo " module samsung_galaxybook +p " | sudo tee /sys/kernel/debug/dynamic_debug/control
您还可以将参数samsung_galaxyboo.dyndbg
添加到启动命令行参数或modprobe.d
配置文件(如果您希望自动启用),并添加任何所需的值(例如+p
)。
模块参数可用于启用或禁用大多数功能。例如,以下代码将仅使用核心设置标志( usb_charge
、 start_on_lid_open
等)和 kbd_backlight LED 类重新加载模块,并且所有其他功能将被禁用:
sudo rmmod samsung-galaxybook
sudo modprobe samsung-galaxybook dyndbg=+p kbd_backlight=on battery_threshold=off performance_mode=off allow_recording=off fan_speed=off i8042_filter=off
请注意,这些也可以添加到启动参数中(例如samsung_galaxybook.fan_speed=off
)。
我的一个普遍观察是,三星这些设备的固件实际上存在很多错误,例如:
如果我们真的能从三星那里得到一些帮助,那就太好了!
三星决定使用主键盘设备来发送大部分热键事件。如果驱动程序希望捕获这些热键并对其进行操作,那么我们将不得不执行一些操作,例如使用 i8402 过滤器来“捕获”按键事件。
我还发现一些热键事件存在冲突,因此这是一个有点棘手的领域。
键盘背光热键将以循环方式循环显示所有可用的背光亮度级别,达到最大值时再次从 0 开始(即 0、1、2、3、0、1...)。
该操作将在热键的 keyup 上触发,因为 keydown 报告的事件似乎与电池充电进度的事件相同(因此当您开始充电时事情会变得有点疯狂!)。
热键还应该触发 LED 的硬件更改事件,在 GNOME(以及其他可能的)中,LED 会自动显示一个漂亮的 OSD 弹出窗口,并显示正确的背光级别。
阻止录制热键将切换allow_recording
功能,该功能阻止对内置摄像头和麦克风的访问。
性能模式热键还将以循环方式循环浏览所有可用的平台配置文件(低功耗、安静、平衡、性能、低功耗、安静……)。
目前没有 OSD 弹出窗口,但如果需要,可以从“Samsung Galaxy Book extra Buttons”输入设备捕获该事件。
创建了一个新的输入设备“Samsung Galaxy Book extra Button”,它将发送来自 ACPI 设备的一些通知的输入事件:
SAM0428
型号)SAM0428
型号)创建了一个名为samsung-galaxybook::kbd_backlight
的新 LED 类,可以通过/sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
(值 0 到 3)的sysfs
或许多标准实用程序(例如brightnessctl
、 light
等
它似乎也会在面板中的 GNOME 45.x 中自动拾取,您可以在其中单击Keyboard
旁边的箭头并调整滑块。
请注意,Windows中“X秒后自动关闭键盘背光”的设置实际上是由三星的应用程序服务控制的,而不是由设备驱动程序本身控制的; GNOME 中有一个类似的功能(可能还有其他功能),它会在一定的空闲时间后切换到最低级别(例如,当您空闲时从 3 切换到 1,然后在恢复时返回到 3),但不管怎样功能可能应该以某种方式在用户空间中控制,而不是由内核驱动程序控制。
另请注意,大多数这些设备都有环境光传感器,这也会影响键盘背光。此行为在 Windows 中无法控制,而且我尚未在 ACPI 中找到任何似乎能够禁用此功能的内容。这意味着有时您可能会认为键盘背光只是随机关闭或已停止工作,但实际情况是它是由于环境光传感器而关闭的。测试何时发生这种情况的一种方法(确保实际上是环境光传感器导致键盘背光关闭)是以某种方式覆盖传感器(例如,用手指),然后查看是否灯又亮了。
该平台驱动程序将添加设置电池充电控制结束阈值,但无权设置启动阈值。此功能通常被 Windows 中的各种 Samsung 应用程序称为“电池保护程序”,但在 Linux 中,我们将实现添加到 UPower 识别的电池设备中的标准属性。
如果用户希望保持与 Windows 的互操作性,则应将该值设置为 80 表示“打开”,或设置为 0 表示“关闭”,因为这些值被各种基于 Windows 的三星应用程序和服务识别为“开”或“关”。否则,设备将接受 0(关闭)和 99 之间的任何值作为您希望电池停止充电的百分比。如果您尝试将值设置为 100,则驱动程序也会接受此输入,但只需将属性值设置为 0(即 100% 被解释为“关闭电池保护程序”)。
在/sys/class/power_supply/BAT1/charge_control_end_threshold
处创建了一个新的设备属性,可以读取或写入该属性。
# read current value (percentage the battery will stop charging)
cat /sys/class/power_supply/BAT1/charge_control_end_threshold
# turn on and set to 80%
echo 80 | sudo tee /sys/class/power_supply/BAT1/charge_control_end_threshold
# turn off charge control threshold so that charging will not be stopped before 100%
echo 0 | sudo tee /sys/class/power_supply/BAT1/charge_control_end_threshold
注意:我注意到,如果您当前已插入电源,而电池已经达到所需的
charge_control_end_threshold
,则关闭此功能(即您希望完全充电至 100%,因此将值设置为 0),充电似乎不会自动启动。在这种情况下,可能需要断开并重新连接充电线。 Windows 驱动程序似乎正在对 ACPI 电池设备进行一些恶作剧,我还没有完全弄清楚;我猜想这就是他们如何让它在 Windows 中更加无缝地工作?
还有一个输入事件发送到标准键盘和 ACPI 设备,该事件在启用充电控制并且充电达到所需的charge_control_end_threshold
时生成;该事件已映射到BATTERY
事件,以便可以显示通知(有关此方面的更多信息,请参阅下面的键盘重新映射部分)。
要打开或关闭“打开盖子时启动”设置(打开盖子时笔记本电脑将自动开机),在/sys/devices/platform/samsung-galaxybook/start_on_lid_open
中创建了一个新的设备属性,可以读取该属性来自或写给。值 0 表示“关闭”,而值 1 表示“打开”。
# read current value (0 for disabled, 1 for enabled)
cat /sys/devices/platform/samsung-galaxybook/start_on_lid_open
# turn on (supports values such as: 1, on, true, yes, etc)
echo true | sudo tee /sys/devices/platform/samsung-galaxybook/start_on_lid_open
# turn off (supports values such as: 0, off, false, no, etc)
echo 0 | sudo tee /sys/devices/platform/samsung-galaxybook/start_on_lid_open
要打开或关闭“USB 充电”模式(即使笔记本电脑关闭,USB 端口也能供电),可在/sys/devices/platform/samsung-galaxybook/usb_charge
中创建一个新的设备属性读取或写入。值 0 表示“关闭”,而值 1 表示“打开”。
# read current value (0 for disabled, 1 for enabled)
cat /sys/devices/platform/samsung-galaxybook/usb_charge
# turn on (supports values such as: 1, on, true, yes, etc)
echo true | sudo tee /sys/devices/platform/samsung-galaxybook/usb_charge
# turn off (supports values such as: 0, off, false, no, etc)
echo 0 | sudo tee /sys/devices/platform/samsung-galaxybook/usb_charge
我自己对该功能如何工作的观察(实际上与该驱动程序本身无关):
要打开或关闭“允许录制”设置(允许或阻止使用内置摄像头和麦克风),请在/sys/devices/platform/samsung-galaxybook/allow_recording
中创建一个新的设备属性,可以读取该属性来自或写给。值 0 表示“关闭”,而值 1 表示“打开”。
三星用户手册称此设置为“阻止录制模式”,但由于所需的值为 1 代表“不阻止”,0 代表“阻止”(即 1 vs 0 的值与名称相比感觉“倒退”),因此对于这位司机来说,这样称呼感觉有点用词不当。 1表示“允许”,0表示“不允许”似乎更有意义;这样,希望该驱动程序的用户能够更清楚地了解更改该值时实际发生的情况。
# read current value (0 for disabled, 1 for enabled)
cat /sys/devices/platform/samsung-galaxybook/allow_recording
# turn on (supports values such as: 1, on, true, yes, etc)
echo true | sudo tee /sys/devices/platform/samsung-galaxybook/allow_recording
# turn off (supports values such as: 0, off, false, no, etc)
echo 0 | sudo tee /sys/devices/platform/samsung-galaxybook/allow_recording
不同的设备具有不同数量的风扇,并且为了能够成功读取其状态而采用不同的方法。三星似乎确实为大多数各种实现实现了 ACPI 标准风扇设备方法_FST
,但没有实现 ACPI 规范中的其他可选方法,这会导致内核自动添加fan_speed_rpm
属性。除此之外,固件中似乎存在一些错误,当您尝试执行此 ACPI 方法时,这些错误经常会引发异常。在 Windows 中也可以看到此行为(尝试检查风扇速度时会引发 ACPI 异常),并且在将此设备与 Windows 一起使用时,我无法使用各种硬件监控应用程序查看风扇速度。
此平台驱动程序尝试解析 ACPI 中可用的所有 PNP 风扇,并使用以下决策逻辑添加对读取其速度的支持:
_FST
方法是否存在并且似乎正在工作(返回大于 0 的速度值)?如果是,请向其添加属性fan_speed_rpm
并将其作为 hwmon 设备的风扇输入通道。FANS
(风扇速度级别)字段,风扇上是否存在FANT
(风扇速度级别表)表?如果是这样,请将fan_speed_rpm
添加到此风扇设备,并作为 hwmon 设备的风扇输入通道,并根据以下逻辑构建自定义风扇速度列表(源自读取 DSDT 并尝试解释原来的_FST
似乎想要工作)。可以使用 hwmon 传感器或读取fan_speed_rpm
sysfs 属性来监视风扇速度。
# read current fan speed rpm from sysfs attribute
cat /sys/bus/acpi/devices/PNP0C0B : 00/fan_speed_rpm
# read current fan speed rpm from hwmon device
sensors
对于_FST
方法无法正常工作的设备,使用以下逻辑来导出FANS
字段报告的每个可用级别的可能速度。
FANT
(“风扇表”?),它似乎是风扇可以针对每个不同“级别”(0 到 5)运行的可能 RPM 速度的某种列表。FANS
(“风扇速度”?)的数据字段,它似乎给出了风扇当前运行的“级别”。我假设FANT
的值是代表实际 RPM 值的整数(无论如何,它们看起来很合理),但不能百分百确定这个假设是正确的。得到三星的确认或者是否有人有办法测量风扇的实际速度会很有趣。
风扇可以完全关闭 (0),也可以是FANT
中速度代表的级别之一。该驱动程序从FANT
读取值,而不是对级别进行硬编码,并假设不同设备可能有不同的值和不同数量的级别。作为参考,我在 Galaxy Book2 Pro 上看到的值是:
最重要的是,在三星的_FST
方法中,它似乎在尝试报告每个值之前添加0x0a
(10),并且级别 3 和级别 4 应该具有相同的值,而级别 5 应该是FANT
的第四个值。然而,现实生活中的观察表明,3 级和 4 级实际上是不同的,并且 5 级似乎比 4 级响亮得多。因此,该驾驶员只会“猜测”3 级和 4 级实际上是这样的在FANT
中列出,最后一个级别可能比第 4 级快 1000 RPM(除非有人能找到比这更好的东西!)。
文件 gb_test_fans_ssdt.dsl 中有一个可用的测试 SSDT,其中包括一组“伪造的”PNP ACPI 风扇设备,可用于测试驱动程序在不同场景下的工作方式。这可以动态构建和加载,但您还需要删除并重新加载平台驱动程序模块,以测试它们将如何被处理。
# create fake device table
sudo modprobe acpi_configfs
sudo mkdir /sys/kernel/config/acpi/table/gb_test_fans_ssdt
# build and load the aml
iasl gb_test_fans_ssdt.dsl
cat gb_test_fans_ssdt.aml | sudo tee /sys/kernel/config/acpi/table/gb_test_fans_ssdt/aml
# remove and reload the module (via insmod or modprobe)
sudo rmmod samsung-galaxybook
sudo insmod samsung-galaxybook.ko dyndbg=+p
注意:您需要重新启动才能删除这些假设备。
为了修改“性能模式”,驱动程序实现了platform_profile
接口。三星的“性能模式”到各自平台配置文件的映射是根据驱动程序代码中的映射动态完成的,驱动程序代码读取 ACPI 报告支持的模式。优先尝试映射low-power
、 balanced
和performance
配置文件,因为这些似乎是各种用户空间工具使用(有时甚至需要)的最常见配置文件。
当模块加载时,映射的结果将打印在内核日志中。然后可以从/sys/firmware/acpi/platform_profile_choices
检索支持的配置文件,而/sys/firmware/acpi/platform_profile
可用于读取或写入所需的配置文件。
示例:
# Get supported platform profiles
cat /sys/firmware/acpi/platform_profile_choices
# set platform profile to low-power
echo low-power | sudo tee /sys/firmware/acpi/platform_profile
# get current platform profile
cat /sys/firmware/acpi/platform_profile
注意:为了匹配 Windows 驱动程序中的逻辑,并避免导致其他功能出现问题,驱动程序当前每次在初始化期间(例如启动时)都会将性能模式设置为“优化”。
应该可以设置您自己所需的启动性能模式,或者在重新启动时保存和恢复模式,您可以使用启动脚本或安装 TLP、power-profiles-daemon 或类似的。
这有点难以测试,但我尝试通过设置每种不同的模式,然后使用以下命令运行快速压力测试,看看这些不同的模式是否确实产生了可测量的变化:
sudo stress-ng --cpu 0 --cpu-load 100 --metrics-brief --perf -t 20
请注意,设置似乎至少需要几秒钟才能真正生效。
最后我发现,使用“静默”(0) 模式时,我绝对可以看出结果的差异,因为使用“静默”模式时,压力测试中完成的操作数明显较低(几乎一半)。
主观上,我确实觉得与其他两种模式相比,“安静”模式下的风扇音量要低得多,但我并没有真正注意到压力测试中完成的操作数量有任何重大差异。优化和高性能对我来说几乎是一样的。我也注意到,当核心达到接近 100C 时,可能会发生一些节流,所以这可能是我无法分辨差异的问题的一部分(不确定调整什么是安全的)。这也可能只是一个有缺陷的测试机制!
提供的文件 61-keyboard-samsung-galaxybook.hwdb 是最新 60-keyboard.hwdb 中这些设备的相关部分的副本,可与旧版本的 systemd 一起使用。有关更多信息,请参阅 systemd/issues/34646 和 systemd/pull/34648。
注意: “性能模式”键 (Fn+F11) 作为 ACPI 通知提供,由
samsung-galaxybook
平台驱动程序处理。
您可以按如下方式安装此映射文件:
sudo cp 61-keyboard-samsung-galaxybook.hwdb /etc/udev/hwdb.d/
sudo systemd-hwdb update
sudo udevadm trigger