В серию Samsung Galaxy Book добавлен драйвер платформы Linux.
Текущий статус:
Цель состоит в том, чтобы в некоторой степени повторить в Linux то, что Samsung сделал в Windows, и, по моему мнению, делают следующие компоненты:
SCAI
ACPI для управления многими из этих настроек.SamsungSystemSupportEngine.exe
, которая, похоже, обрабатывает довольно много вещей на стороне пользовательского пространства/приложения, в том числе: Это новый и (на данный момент) совершенно нестандартный драйвер платформы ядра, предназначенный для имитации того, что, по-видимому, делает драйвер системного устройства Windows контроллера системных событий Samsung (а именно, взаимодействует с устройством SCAI
ACPI для управления этими дополнительными функциями). ). Как только будут добавлены дополнительные функции и они будут протестированы, я намерен попытаться добавить драйвер в ядро.
На данный момент реализованы следующие функции:
fan_speed_rpm
sysfs плюс новое устройство hwmonСледующие функции могут быть реализованы, но требуют дополнительной отладки и разработки:
SAM0427
Устройствами, поддерживаемыми этим драйвером платформы, должны быть любые устройства, о которых сообщает sudo dmidecode --type 3
Manufacturer: SAMSUNG ELECTRONICS CO., LTD.
и Type: Notebook
, ПЛЮС, что устройство ACPI SCAI
присутствует с идентификаторами устройств ACPI, соответствующими списку, указанному в драйвере ( SAM0427
, SAM0428
, SAM0429
и SAM0430
на момент написания этой статьи). Это относится к большинству доступных в настоящее время ноутбуков серии Samsung Galaxy Book, но может включать и другие.
Цель состоит в том, чтобы каждая функция в драйвере платформы пыталась каким-либо образом проверить, поддерживается она или нет, прежде чем эта функция будет включена. Некоторые устройства имеют немного другое оборудование и/или ведут себя немного по-другому; Если у вас есть устройство, драйвер которого отключает определенную функцию, которая, по вашему мнению, должна поддерживаться, создайте проблему!
Я также заметил, что Windows использует тот же драйвер для SAM0426
(используется такими устройствами, как Notebook 9 Pro 15 дюймов и/или аналогичные), поэтому я подозреваю, что большая часть этого драйвера, вероятно, также работает для этих устройств. Если он у вас есть из этих устройств и хотите протестировать с его помощью этот драйвер, создайте задачу, чтобы получить помощь и поделиться своими выводами.
Драйвер платформы поддерживает следующие параметры модуля:
kbd_backlight
: Включить управление подсветкой клавиатуры (по умолчанию включено) (bool)battery_threshold
: Включить контроль порога заряда батареи (по умолчанию включено) (bool)performance_mode
: Включить управление режимом производительности (по умолчанию включено) (bool)allow_recording
: Включить элемент управления, чтобы разрешить или заблокировать доступ к камере и микрофону (по умолчанию включено) (bool)fan_speed
: Включить скорость вентилятора (по умолчанию включено) (bool)i8042_filter
: включить захват событий горячих клавиш клавиатуры (по умолчанию включено) (bool) В общем, цель этих параметров — разрешить включение или отключение различных функций, предоставляемых драйвером, особенно в тех случаях, когда определенная функция вызывает проблемы с вашим устройством. Доступность различных атрибутов платформы «настройки» ( 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
с любым желаемым значением (например, +p
) в параметры командной строки загрузки или в файл конфигурации modprobe.d
, если вы хотите, чтобы он включался автоматически.
Параметры модуля можно использовать для включения или отключения большинства функций. Например, следующее перезагрузит модуль только с флагами основных настроек ( usb_charge
, start_on_lid_open
и т. д.) и классом светодиодов kbd_backlight, а все остальные функции будут отключены:
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
).
Я сделал одно общее наблюдение: на самом деле в прошивке Samsung для этих устройств довольно много ошибок, например:
Было бы здорово, если бы мы действительно могли получить помощь от Samsung в этом вопросе!
Samsung решила использовать основную клавиатуру для отправки большинства событий горячих клавиш. Если драйвер желает перехватить эти горячие клавиши и действовать по ним, нам придется сделать что-то вроде использования фильтра i8402, чтобы «перехватывать» ключевые события.
Я также обнаружил, что некоторые события горячих клавиш вызывают конфликты, так что это довольно сложная территория.
Горячая клавиша подсветки клавиатуры циклически переключает все доступные уровни яркости подсветки, начиная с 0 при достижении максимума (т. е. 0, 1, 2, 3, 0, 1, ...).
Действие будет запущено при нажатии горячей клавиши, поскольку событие, сообщаемое нажатием клавиши, похоже, совпадает с событием процесса зарядки аккумулятора (и, таким образом, когда вы начинаете заряжать, все становится немного сумасшедшим!).
Горячая клавиша также должна вызывать событие изменения оборудования для светодиода, которое в GNOME (и, вероятно, других) автоматически отображает красивое всплывающее окно OSD с правильным уровнем подсветки.
Горячая клавиша блокировки записи включает allow_recording
, которая блокирует доступ к встроенной камере и микрофону.
Горячая клавиша режима производительности также циклически переключает все доступные профили платформы (низкое энергопотребление, тихий, сбалансированный, производительность, низкое энергопотребление, тихий и т. д.).
В настоящее время всплывающее меню OSD отсутствует, но при желании событие можно записать с устройства ввода «Дополнительные кнопки Samsung Galaxy Book».
Появилось новое устройство ввода, созданное «Дополнительные кнопки Samsung Galaxy Book», которое будет отправлять события ввода для нескольких уведомлений с устройства ACPI:
SAM0428
)SAM0428
) Создается новый класс светодиодов под названием samsung-galaxybook::kbd_backlight
, которым можно управлять через sysfs
в /sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
(значения от 0 до 3) или с помощью многих стандартных утилит, таких как brightnessctl
, light
и т. д.
Похоже, что в GNOME 45.x он также автоматически подбирается на панели, где вы можете щелкнуть стрелку рядом Keyboard
и отрегулировать ползунок.
Обратите внимание, что настройка «автоматическое отключение подсветки клавиатуры через X секунд» в Windows на самом деле контролируется службой приложений Samsung, а не самим драйвером устройства; есть аналогичная функция в GNOME (и, опять же, вероятно, в других), где она переключается на минимальный уровень после определенного периода простоя (например, с 3 на 1, когда вы бездействуете, а затем обратно на 3, когда вы возобновляете работу), но независимо от этого эта функция, вероятно, должна как-то управляться в пользовательском пространстве, а не драйвером ядра.
Также обратите внимание, что большинство этих устройств имеют датчик внешней освещенности, который также влияет на подсветку клавиатуры. Такое поведение невозможно контролировать в Windows, и я еще не нашел в ACPI ничего, что могло бы отключить эту функцию. Это означает, что иногда вы можете подумать, что подсветка клавиатуры просто случайно выключается или перестает работать, но на самом деле она выключается из-за этого датчика внешней освещенности. Один из способов проверить, когда это происходит (чтобы убедиться, что именно датчик внешней освещенности стал причиной отключения подсветки клавиатуры) — просто прикрыть датчик каким-либо образом (например, пальцем) и посмотреть, свет снова включается.
Этот драйвер платформы добавит настройку порога завершения контроля заряда батареи, но не имеет доступа для установки порога запуска. Эта функция обычно называется «экономией заряда батареи» в различных приложениях Samsung в Windows, но в Linux мы реализуем стандартные атрибуты, добавляемые к аккумуляторному устройству, которые распознаются UPower.
Если пользователь хочет сохранить совместимость с Windows, ему следует установить значение 80 для обозначения «включено» или 0 для обозначения «выключено», поскольку эти значения распознаются различными приложениями и службами Samsung на базе 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 Charge» (позволяет 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 означает «включено».
В руководстве пользователя Samsung этот параметр называется «Режим блокировки записи», но поскольку необходимое значение равно 1 для «не заблокировано» и 0 для «заблокировано» (т. е. значение 1 против 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
Различные устройства имеют разное количество вентиляторов и разные методы для успешного считывания их статуса. Похоже, что Samsung реализовала стандартный метод вентиляторного устройства ACPI _FST
для большинства различных реализаций, но не реализовала другие дополнительные методы в спецификации ACPI, которые заставляли бы ядро автоматически добавлять атрибут fan_speed_rpm
. Вдобавок ко всему, похоже, что в прошивке есть некоторые ошибки, которые часто вызывают исключение при попытке выполнить этот метод ACPI. Такое поведение также наблюдается в Windows (при попытке проверить скорость вращения вентилятора выдается исключение ACPI), и мне не удалось увидеть скорость вращения вентилятора с помощью различных приложений для мониторинга оборудования при использовании Windows с этим устройством.
Этот драйвер платформы пытается распознать все вентиляторы PNP, доступные в ACPI, и добавить поддержку чтения их скорости, используя следующую логику принятия решения:
_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).FANS
(«скорость вентилятора»?), которое, кажется, дает текущий «уровень», на котором работает вентилятор. Я предположил , что значения из FANT
являются целыми числами, которые представляют фактические значения оборотов в минуту (во всяком случае, они кажутся разумными), но не могу быть на сто процентов уверен, что это предположение верно. Было бы интересно получить подтверждение от Samsung или есть ли у кого-нибудь способ измерить фактическую скорость вентилятора.
Вентилятор может быть либо полностью выключен (0), либо находиться на одном из уровней, представленных скоростями в FANT
. Этот драйвер считывает значения из FANT
вместо жесткого кодирования уровней, предполагая, что это могут быть разные значения и разное количество уровней для разных устройств. Для справки, значения, которые я вижу на своем Galaxy Book2 Pro:
Вдобавок ко всему, в методе _FST
от Samsung, похоже, к каждому значению добавляется 0x0a
(10) перед попыткой сообщить о них, и уровни 3 и 4 должны иметь одинаковое значение, а уровень 5 должен быть четвертым значением из FANT
. Однако реальные наблюдения показывают, что уровни 3 и 4 на самом деле разные, и что уровень 5 кажется значительно громче, чем уровень 4. Из-за этого этот водитель просто «догадается», что уровни 3 и 4 на самом деле такие, какие есть. указан в FANT
, и что последний уровень может быть на 1000 об/мин быстрее, чем уровень 4 (если только кто-нибудь не сможет найти что-то лучше этого!).
В файле 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
. Сопоставление «режимов производительности» Samsung с соответствующим профилем платформы выполняется динамически на основе сопоставления в коде драйвера, который считывает, какие режимы поддерживаются 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