Controlador de plataforma Linux extra de la serie Samsung Galaxy Book.
Estado actual:
La intención es replicar de alguna manera en Linux lo que Samsung ha hecho en Windows con lo que creo que están haciendo los siguientes componentes:
SCAI
ACPI para controlar muchas de estas configuraciones.SamsungSystemSupportEngine.exe
que parece manejar muchas cosas en el lado del espacio de usuario/aplicación, incluyendo: Este es un controlador de plataforma de kernel nuevo y (actualmente) completamente fuera del árbol destinado a imitar lo que parece estar haciendo el controlador de dispositivo del sistema Samsung System Event Controller de Windows (es decir, comunicarse con el dispositivo SCAI
ACPI para controlar estas funciones adicionales). ). Una vez que se hayan agregado más funciones y se haya probado, mi intención es intentar enviar el controlador para agregarlo al kernel.
Actualmente están implementadas las siguientes características:
fan_speed_rpm
más un nuevo dispositivo hwmonEs posible implementar las siguientes características, pero requieren depuración y desarrollo adicionales:
SAM0427
Los dispositivos compatibles con este controlador de plataforma deben ser cualquier dispositivo donde sudo dmidecode --type 3
informe Manufacturer: SAMSUNG ELECTRONICS CO., LTD.
y Type: Notebook
, ADEMÁS de que el dispositivo ACPI SCAI
esté presente con ID de dispositivo ACPI que coincidan con la lista proporcionada en el controlador ( SAM0427
, SAM0428
, SAM0429
y SAM0430
al momento de escribir este artículo). Esto cubre la mayoría de los portátiles de la serie "Samsung Galaxy Book" disponibles actualmente, pero también podría incluir otros.
La intención es que cada función dentro del controlador de la plataforma intente probar si es compatible o no de alguna manera antes de habilitar la función. Algunos dispositivos tienen hardware ligeramente diferente y/o se comportan de manera ligeramente diferente; Si tiene un dispositivo en el que el controlador desactiva una determinada función que cree que debería ser compatible, ¡cree un problema!
También he visto que Windows usa el mismo controlador para SAM0426
(usado por dispositivos como el Notebook 9 Pro 15" y/o similares), por lo que sospecho que gran parte de este controlador probablemente también funcione para estos dispositivos. Si tiene uno de estos dispositivos y desea probar este controlador con él, cree un problema para obtener ayuda y compartir sus hallazgos.
El controlador de la plataforma admite los siguientes parámetros del módulo:
kbd_backlight
: habilita el control de retroiluminación del teclado (activado de forma predeterminada) (bool)battery_threshold
: habilita el control del umbral de carga de la batería (predeterminado activado) (bool)performance_mode
: habilita el control del modo de rendimiento (predeterminado activado) (bool)allow_recording
: habilita el control para permitir o bloquear el acceso a la cámara y al micrófono (activado de forma predeterminada) (bool)fan_speed
: habilita la velocidad del ventilador (predeterminado activado) (bool)i8042_filter
: Habilita la captura de eventos de teclas de acceso rápido del teclado (predeterminado activado) (bool) En general, la intención de estos parámetros es permitir habilitar o deshabilitar varias funciones proporcionadas por el controlador, especialmente en los casos en que una característica particular parece causar problemas con su dispositivo. La disponibilidad de los diversos atributos de la plataforma de "configuración" ( usb_charge
, start_on_lid_open
, etc.) siempre estará habilitada si parecen ser compatibles y no se puede deshabilitar en este momento.
Nota: ¡Plantee un problema si descubre que necesita deshabilitar una determinada función para evitar un problema que cause con su dispositivo!
Compile el módulo fuera del árbol pero con los módulos del kernel actualmente cargados:
make -C /lib/modules/ ` uname -r ` /build M= $PWD
Instale este módulo en los módulos de su kernel actualmente cargados:
sudo make -C /lib/modules/ ` uname -r ` /build M= $PWD modules_install
sudo depmod
Nota: si desea habilitar los mensajes de depuración, puede agregar
samsung_galaxybook.dyndbg=+p
o similar a sus parámetros de arranque.
Cargue el módulo (incluida la habilitación de mensajes de depuración):
sudo modprobe samsung-galaxybook dyndbg=+p
Descargue el módulo:
sudo rmmod samsung-galaxybook
Desinstale el módulo:
sudo rm /lib/modules/ ` uname -r ` /updates/samsung-galaxybook.ko *
Este módulo se puede instalar con dkms y proporciona instalación automática para cada nuevo kernel.
Agregar módulo al árbol dkms:
sudo dkms add /path/to/module/directory/samsung-galaxybook-extras
Módulo de construcción:
sudo dkms build samsung-galaxybook/extras
Instalar módulo:
sudo dkms install samsung-galaxybook/extras
Desinstalar módulo:
sudo dkms uninstall samsung-galaxybook/extras
Si desea firmar el controlador para evitar el mensaje samsung_galaxybook: module verification failed: signature and/or required key missing - tainting kernel
, entonces deberá firmar el módulo siguiendo cualquier proceso típico para su distribución. Para distribuciones basadas en Debian (incluido Ubunutu), puede instalar el paquete linux-source
para su kernel actual y utilizar las claves y scripts incluidos para firmar el módulo de la siguiente manera:
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
Hay mensajes mucho más detallados disponibles si habilita la impresión de mensajes de depuración. Esto se puede hacer usando la depuración dinámica siempre que CONFIG_DYNAMIC_DEBUG
de su kernel actual esté habilitado. Más información sobre cómo utilizar esta característica está disponible en la documentación del Kernel: Depuración dinámica
A continuación se muestran algunos ejemplos:
# 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
También puede agregar el parámetro samsung_galaxyboo.dyndbg
con cualquier valor deseado (por ejemplo, +p
) a los parámetros de la línea de comando de inicio o al archivo de configuración modprobe.d
si desea que se habilite automáticamente.
Los parámetros del módulo se pueden utilizar para habilitar o deshabilitar la mayoría de las funciones. Por ejemplo, lo siguiente recargaría el módulo solo con los indicadores de configuración principales ( usb_charge
, start_on_lid_open
, etc.) y la clase LED kbd_backlight, y todas las demás funciones se desactivarían:
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
Tenga en cuenta que estos también se pueden agregar a los parámetros de arranque (por ejemplo, samsung_galaxybook.fan_speed=off
).
Una observación general que he hecho es que, de hecho, hay bastantes errores en el firmware de Samsung para estos dispositivos, por ejemplo:
¡Sería fantástico si pudiéramos obtener ayuda de Samsung con respecto a esto!
Samsung ha decidido utilizar el dispositivo de teclado principal para enviar también la mayoría de los eventos de teclas de acceso rápido. Si el controlador desea capturar y actuar sobre estas teclas de acceso rápido, entonces tendremos que hacer algo como usar un filtro i8402 para "captar" los eventos clave.
También descubrí que algunos de los eventos de teclas de acceso rápido tienen conflictos, por lo que es un territorio un poco complicado.
La tecla de acceso rápido de retroiluminación del teclado recorrerá todos los niveles de brillo de retroiluminación disponibles en forma circular, comenzando nuevamente en 0 cuando se alcance el máximo (es decir, 0, 1, 2, 3, 0, 1, ...).
La acción se activará al presionar la tecla de acceso rápido, ya que el evento informado por la tecla presionada parece ser el mismo evento para el progreso de carga de la batería (¡y por lo tanto las cosas se vuelven un poco locas cuando comienzas a cargar!).
La tecla de acceso rápido también debería activar el evento de cambio de hardware para el LED, que en GNOME (y probablemente en otros) muestra automáticamente una ventana emergente OSD agradable con el nivel de luz de fondo correcto mostrado.
La tecla de acceso rápido bloquear grabación alternará la función allow_recording
, que bloquea el acceso a la cámara y al micrófono integrados.
La tecla de acceso directo al modo de rendimiento también recorrerá todos los perfiles de plataforma disponibles en forma circular (bajo consumo, silencioso, equilibrado, rendimiento, bajo consumo, silencioso, ...).
Actualmente no hay ninguna ventana emergente OSD, pero el evento se puede capturar desde el dispositivo de entrada "Botones adicionales del Samsung Galaxy Book" si lo desea.
Hay un nuevo dispositivo de entrada creado "botones adicionales del Samsung Galaxy Book" que enviará eventos de entrada para algunas notificaciones del dispositivo ACPI:
SAM0428
)SAM0428
) Se crea una nueva clase de LED llamada samsung-galaxybook::kbd_backlight
que se puede controlar mediante sysfs
en /sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
(valores de 0 a 3) o mediante muchas de las utilidades estándar como brightnessctl
, light
, etc.
También parece seleccionarse automáticamente en GNOME 45.x en el panel, donde puede hacer clic en la flecha al lado Keyboard
y ajustar el control deslizante.
Tenga en cuenta que la configuración "apagar automáticamente la luz de fondo del teclado después de X segundos" en Windows en realidad está controlada por el servicio de aplicaciones de Samsung y no por el controlador del dispositivo; Hay una característica similar en GNOME (y probablemente en otras) donde cambia al nivel mínimo después de un cierto período de inactividad (por ejemplo, de 3 a 1 cuando está inactivo y luego vuelve a 3 cuando reanuda), pero independientemente de esto La característica probablemente debería controlarse en el espacio de usuario de alguna manera y no mediante el controlador del kernel.
Tenga en cuenta también que la mayoría de estos dispositivos tienen un sensor de luz ambiental que también afecta a la retroiluminación del teclado. Este comportamiento no es posible de controlar en Windows y todavía no he encontrado nada en ACPI que parezca poder desactivar esta función. Lo que esto significa es que a veces podrías pensar que la retroiluminación del teclado se apaga aleatoriamente o ha dejado de funcionar, pero la realidad es que se apaga debido a este sensor de luz ambiental. Una forma de comprobar cuándo sucede esto (para asegurarse de que en realidad es el sensor de luz ambiental el que ha provocado que se apague la retroiluminación del teclado) es simplemente cubrir el sensor de alguna manera (con el dedo, por ejemplo) y ver si el las luces se vuelven a encender.
Este controlador de plataforma agregará la configuración del umbral final del control de carga de la batería, pero no tiene acceso para configurar el umbral de inicio. Esta función suele denominarse "ahorro de batería" en las diversas aplicaciones de Samsung en Windows, pero en Linux implementaremos los atributos estándar agregados al dispositivo de batería que reconoce UPower.
Si el usuario desea mantener la interoperabilidad con Windows, debe establecer el valor en 80 para representar "encendido" o 0 para representar "apagado", ya que estos son los valores reconocidos por las diversas aplicaciones y servicios de Samsung basados en Windows como " encendido" o "apagado". De lo contrario, el dispositivo aceptará cualquier valor entre 0 (apagado) y 99 como porcentaje en el que desea que la batería deje de cargarse. Si intenta establecer un valor de 100, el controlador también aceptará esta entrada, pero simplemente establecerá el valor del atributo en 0 (es decir, 100% se interpreta como "desactivar el ahorro de batería").
Hay un nuevo atributo de dispositivo creado en /sys/class/power_supply/BAT1/charge_control_end_threshold
que se puede leer o escribir.
# 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
Nota: He notado que si actualmente está enchufado mientras la batería ya está en el
charge_control_end_threshold
deseado, luego desactiva esta función (es decir, desea cargar completamente al 100%, por lo que establece el valor en 0), la carga no parece para iniciar automáticamente. En este caso, puede que sea necesario desconectar y volver a conectar el cable de carga. El controlador de Windows parece estar haciendo algunas trampas con el dispositivo de batería ACPI que aún no he resuelto del todo; Supongo que así es como hicieron que funcionara mejor en Windows.
También hay un evento de entrada enviado al teclado estándar y al dispositivo ACPI que se genera cuando el control de carga está habilitado y la carga alcanza el charge_control_end_threshold
deseado; el evento se ha asignado al evento BATTERY
para que se puedan mostrar las notificaciones (consulte la sección de reasignación del teclado a continuación para obtener información adicional al respecto).
Para activar o desactivar la configuración "Iniciar al abrir la tapa" (la computadora portátil se encenderá automáticamente al abrir la tapa), hay un nuevo atributo de dispositivo creado en /sys/devices/platform/samsung-galaxybook/start_on_lid_open
que se puede leer desde o escrito a. Un valor de 0 significa "apagado", mientras que un valor de 1 significa "encendido".
# 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
Para activar o desactivar el modo "Carga USB" (permite que los puertos USB proporcionen energía incluso cuando la computadora portátil está apagada), hay un nuevo atributo de dispositivo creado en /sys/devices/platform/samsung-galaxybook/usb_charge
que puede ser leído o escrito. Un valor de 0 significa "apagado", mientras que un valor de 1 significa "encendido".
# 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
Mis propias observaciones sobre cómo parece funcionar esta característica (que en realidad no tiene nada que ver con este controlador en sí):
Para activar o desactivar la configuración "Permitir grabación" (permite o bloquea el uso de la cámara y el micrófono integrados), hay un nuevo atributo de dispositivo creado en /sys/devices/platform/samsung-galaxybook/allow_recording
que se puede leer desde o escrito a. Un valor de 0 significa "apagado", mientras que un valor de 1 significa "encendido".
El manual del usuario de Samsung llama a esta configuración "modo de grabación de bloqueo", pero como el valor necesario es 1 para "no bloqueado" y 0 para "bloqueado" (es decir, el valor de 1 frente a 0 parece "al revés" en comparación con el nombre), Parecía un nombre inapropiado llamarlo así para este conductor. Parece tener más sentido que 1 signifique "permitido" y 0 signifique "no permitido"; De esta manera, es de esperar que sea más obvio para el usuario de este controlador lo que realmente sucederá cuando se cambie este valor.
# 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
Diferentes dispositivos tienen diferente número de ventiladores y diferentes métodos para poder leer correctamente su estado. Samsung parece haber implementado el método de dispositivo de ventilador estándar ACPI _FST
para la mayoría de las implementaciones, pero no los otros métodos opcionales en la especificación ACPI que harían que el kernel agregue automáticamente el atributo fan_speed_rpm
. Además de esto, parece que hay algunos errores en el firmware que a menudo generan una excepción cuando intentas ejecutar este método ACPI. Este comportamiento también se ve en Windows (que se genera una excepción ACPI cuando se intenta verificar la velocidad del ventilador), y no he podido ver las velocidades del ventilador usando varias aplicaciones de monitoreo de hardware mientras usaba Windows con este dispositivo.
Este controlador de plataforma intenta resolver todos los ventiladores PNP que están disponibles en ACPI y agregar soporte para leer su velocidad usando la siguiente lógica de decisión:
_FST
y parece estar funcionando (devuelve un valor de velocidad mayor que 0)? En caso afirmativo, agréguele un atributo fan_speed_rpm
y como canal de entrada del ventilador al dispositivo hwmon.FANS
(nivel de velocidad del ventilador) en el controlador integrado y la tabla FANT
(tabla de nivel de velocidad del ventilador) en el ventilador? Si es así, agregue fan_speed_rpm
a este dispositivo de ventilador, además como canal de entrada de ventilador al dispositivo hwmon, y cree la lista de velocidades de ventilador personalizadas según la siguiente lógica (derivada de la lectura del DSDT y del intento de interpretar la intención de cómo funciona el ventilador). _FST
original parece querer funcionar). La velocidad del ventilador se puede monitorear usando sensores hwmon o leyendo el atributo sysfs fan_speed_rpm
.
# 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
Para dispositivos donde el método _FST
no funciona correctamente, se utiliza la siguiente lógica para derivar velocidades posibles para cada nivel disponible informado por el campo FANS
.
FANT
("¿tabla de ventiladores"?) que parece ser una especie de lista de posibles velocidades de RPM a las que el ventilador puede funcionar para cada "nivel" diferente (0 a 5).FANS
("¿velocidad del ventilador"?) que parece proporcionar el "nivel" actual en el que está funcionando el ventilador. He asumido que los valores de FANT
son números enteros que representan los valores de RPM reales (de todos modos, parecen razonables), pero no puedo estar cien por ciento seguro de que esta suposición sea correcta. Sería interesante obtener confirmación de Samsung o si alguien tiene una forma de medir la velocidad real del ventilador.
El ventilador puede estar completamente apagado (0) o en uno de los niveles representados por las velocidades en FANT
. Este controlador lee los valores de FANT
en lugar de codificar los niveles asumiendo que podrían ser valores diferentes y una cantidad diferente de niveles para diferentes dispositivos. Como referencia, los valores que veo con mi Galaxy Book2 Pro son:
Además de esto, en el método _FST
de Samsung parece estar agregando 0x0a
(10) a cada valor antes de intentar informarlos, y ese nivel 3 y 4 deberían tener el mismo valor, mientras que el nivel 5 debería ser el cuarto valor de FANT
. Sin embargo, la observación de la vida real sugiere que los niveles 3 y 4 son de hecho diferentes, y que el nivel 5 parece ser significativamente más ruidoso que el nivel 4. Debido a esto, este conductor simplemente "adivinará" que los niveles 3 y 4 son en realidad tal como están. listado en FANT
, y que el último nivel es quizás 1000 RPM más rápido que el nivel 4 (¡a menos que alguien pueda encontrar algo mejor que esto!).
Hay un SSDT de prueba disponible en el archivo gb_test_fans_ssdt.dsl que incluye un conjunto de dispositivos de ventilador PNP ACPI "falsos" que se pueden usar para probar cómo funciona el controlador en diferentes escenarios. Esto se puede construir y cargar dinámicamente, pero también deberá eliminar y volver a cargar el módulo del controlador de la plataforma para probar cómo los manejará.
# 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
Nota: deberá reiniciar para eliminar estos dispositivos falsos.
Para modificar el "modo de rendimiento", el controlador implementa la interfaz platform_profile
. La asignación de los "modos de rendimiento" de Samsung a su perfil de plataforma respectivo se realiza dinámicamente en función de una asignación en el código del controlador que lee en qué modos se informa que son compatibles con ACPI. Se da preferencia para intentar mapear perfiles low-power
, balanced
y performance
, ya que estos parecen ser los perfiles más comunes utilizados (y a veces incluso requeridos) por varias herramientas del espacio de usuario.
El resultado de la asignación se imprimirá en el registro del kernel cuando se cargue el módulo. Luego, los perfiles admitidos se pueden recuperar desde /sys/firmware/acpi/platform_profile_choices
, mientras que /sys/firmware/acpi/platform_profile
se puede usar para leer o escribir el perfil deseado.
Ejemplos:
# 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
Nota: Para coincidir con la lógica del controlador de Windows, así como para evitar causar problemas con otras funciones, el controlador actualmente siempre configurará el modo de rendimiento en "Optimizado" cada vez que se inicialice (por ejemplo, al iniciar).
Debería ser posible configurar el modo de rendimiento de inicio que desee o guardar y restaurar el modo entre reinicios; puede usar un script de inicio o instalar TLP, power-profiles-daemon o similar.
Esto fue un poco difícil de probar, pero intenté ver si estos diferentes modos realmente hacían un cambio mensurable configurando cada modo diferente y luego ejecutando una prueba de esfuerzo rápida usando lo siguiente:
sudo stress-ng --cpu 0 --cpu-load 100 --metrics-brief --perf -t 20
Tenga en cuenta que parecen pasar al menos unos segundos antes de que la configuración realmente parezca activarse.
Al final, lo que descubrí fue que definitivamente podía notar una diferencia en el resultado cuando usaba el modo "silencioso" (0), porque el número resultante de operaciones completadas en la prueba de esfuerzo fue significativamente menor cuando usaba el modo "silencioso" (casi medio).
Subjetivamente, siento que experimenté que el volumen del ventilador era bastante menor en el modo "silencioso" en comparación con los otros dos, pero realmente no noté ninguna diferencia importante en la cantidad de operaciones completadas en la prueba de esfuerzo. Optimizado y Alto Rendimiento me parecieron casi lo mismo. También noté que podría haber cierta aceleración cuando los núcleos alcanzan cerca de 100 ° C, por lo que tal vez eso sea parte del problema por el cual no pude notar la diferencia (no estoy seguro de qué es seguro ajustar). ¡Esto también podría ser simplemente un mecanismo de prueba defectuoso!
El archivo proporcionado 61-keyboard-samsung-galaxybook.hwdb es una copia de la sección relevante para estos dispositivos del último 60-keyboard.hwdb que se puede usar con versiones anteriores de systemd. Consulte systemd/issues/34646 y systemd/pull/34648 para obtener información adicional.
Nota: La tecla "Modo de rendimiento" (Fn+F11) viene como una notificación ACPI y es manejada por el controlador de la plataforma
samsung-galaxybook
.
Puede instalar este archivo de mapeo de la siguiente manera:
sudo cp 61-keyboard-samsung-galaxybook.hwdb /etc/udev/hwdb.d/
sudo systemd-hwdb update
sudo udevadm trigger