Driver da plataforma Linux extras da série Samsung Galaxy Book.
Situação atual:
A intenção é replicar de alguma forma no Linux o que a Samsung fez no Windows com o que acho que os seguintes componentes estão fazendo:
SCAI
ACPI para controlar muitas dessas configurações.SamsungSystemSupportEngine.exe
, que parece lidar com muitas coisas no espaço do usuário/aplicativo, incluindo: Este é um driver de plataforma de kernel novo e (atualmente) completamente fora da árvore, destinado a imitar o que o driver de dispositivo do sistema Windows do Samsung System Event Controller parece estar fazendo (ou seja, comunicar-se com o dispositivo SCAI
ACPI para controlar esses recursos extras ). Depois que mais recursos forem adicionados e testados, minha intenção é tentar enviar o driver para ser adicionado ao kernel.
Os seguintes recursos estão implementados atualmente:
fan_speed_rpm
mais um novo dispositivo hwmonOs seguintes recursos podem ser implementados, mas requerem depuração e desenvolvimento adicionais:
SAM0427
Os dispositivos suportados por este driver de plataforma devem ser qualquer dispositivo onde sudo dmidecode --type 3
reporte Manufacturer: SAMSUNG ELECTRONICS CO., LTD.
e Type: Notebook
, MAIS que o dispositivo ACPI SCAI
está presente com IDs de dispositivos ACPI correspondentes à lista fornecida no driver ( SAM0427
, SAM0428
, SAM0429
e SAM0430
no momento da redação deste artigo). Isso cobre a maioria dos notebooks da série “Samsung Galaxy Book” atualmente disponíveis, mas também pode incluir outros.
A intenção é que cada recurso do driver da plataforma tente testar se é compatível ou não de alguma forma antes de o recurso ser habilitado. Alguns dispositivos possuem hardware ligeiramente diferente e/ou se comportam de maneira ligeiramente diferente; se você tiver um dispositivo em que o driver está desativando um determinado recurso que você acredita que deveria ser suportado, crie um problema!
Também vi que o Windows usa o mesmo driver para SAM0426
(usado por dispositivos como o Notebook 9 Pro 15" e/ou similares), então minha suspeita é que grande parte deste driver provavelmente também funciona para esses dispositivos. Se você tiver um desses dispositivos e deseja testar este driver com ele, crie um problema para obter ajuda e compartilhar suas descobertas.
O driver da plataforma oferece suporte aos seguintes parâmetros do módulo:
kbd_backlight
: Ativa o controle de luz de fundo do teclado (ativado por padrão) (bool)battery_threshold
: Habilita o controle do limite de carga da bateria (padrão ativado) (bool)performance_mode
: Habilita o controle do Modo de Desempenho (padrão ativado) (bool)allow_recording
: Habilite o controle para permitir ou bloquear o acesso à câmera e ao microfone (padrão ativado) (bool)fan_speed
: Habilita a velocidade do ventilador (padrão ativado) (bool)i8042_filter
: Habilita a captura de eventos de teclas de atalho do teclado (padrão ativado) (bool) Em geral, a intenção desses parâmetros é permitir a habilitação ou desabilitação de diversos recursos disponibilizados pelo driver, principalmente nos casos em que determinado recurso pareça causar problemas ao seu dispositivo. A disponibilidade dos vários atributos da plataforma de "configurações" ( usb_charge
, start_on_lid_open
, etc) estará sempre habilitada se parecerem ser suportados e não pode ser desabilitada neste momento.
Observação: levante um problema se achar que precisa desativar um determinado recurso para evitar um problema que ele causa ao seu dispositivo!
Compile o módulo fora da árvore, mas contra os módulos do kernel atualmente carregados:
make -C /lib/modules/ ` uname -r ` /build M= $PWD
Instale este módulo nos módulos do seu kernel atualmente carregados:
sudo make -C /lib/modules/ ` uname -r ` /build M= $PWD modules_install
sudo depmod
Nota: se desejar ativar mensagens de depuração, você pode adicionar
samsung_galaxybook.dyndbg=+p
ou semelhante aos seus parâmetros de inicialização.
Carregue o módulo (incluindo a ativação de mensagens de depuração):
sudo modprobe samsung-galaxybook dyndbg=+p
Descarregue o módulo:
sudo rmmod samsung-galaxybook
Desinstale o módulo:
sudo rm /lib/modules/ ` uname -r ` /updates/samsung-galaxybook.ko *
Este módulo pode ser instalado com dkms e fornece instalação automática para cada novo kernel.
Adicione módulo à árvore dkms:
sudo dkms add /path/to/module/directory/samsung-galaxybook-extras
Módulo de construção:
sudo dkms build samsung-galaxybook/extras
Instalar módulo:
sudo dkms install samsung-galaxybook/extras
Desinstalar módulo:
sudo dkms uninstall samsung-galaxybook/extras
Se você deseja assinar o driver para evitar a mensagem samsung_galaxybook: module verification failed: signature and/or required key missing - tainting kernel
, então você precisará assinar o módulo seguindo qualquer processo típico para sua distribuição. Para distribuições baseadas em Debian (incluindo Ubunutu), você pode instalar o pacote linux-source
para seu kernel atual e usar as chaves e scripts incluídos para assinar o módulo da seguinte forma:
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
Mensagens muito mais detalhadas estarão disponíveis se você ativar a impressão das mensagens de depuração. Isso pode ser feito usando depuração dinâmica, desde que CONFIG_DYNAMIC_DEBUG
do seu kernel atual esteja habilitado. Mais informações sobre como usar esse recurso estão disponíveis na documentação do Kernel: Depuração dinâmica
Aqui estão alguns exemplos:
# 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
Você também pode adicionar o parâmetro samsung_galaxyboo.dyndbg
com qualquer valor desejado (por exemplo, +p
) aos parâmetros da linha de comando de inicialização ou a um arquivo de configuração modprobe.d
se desejar que ele seja ativado automaticamente.
Os parâmetros do módulo podem ser usados para ativar ou desativar a maioria dos recursos. Por exemplo, o seguinte recarregaria o módulo apenas com os sinalizadores de configurações principais ( usb_charge
, start_on_lid_open
, etc) e a classe LED kbd_backlight, e todos os outros recursos seriam desabilitados:
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
Observe que eles também podem ser adicionados aos parâmetros de inicialização (por exemplo, samsung_galaxybook.fan_speed=off
).
Uma observação geral que fiz é que existem muitos bugs no firmware da Samsung para esses dispositivos, por exemplo:
Seria ótimo se pudéssemos obter ajuda da Samsung em relação a isso!
A Samsung decidiu usar o teclado principal para enviar também a maioria dos eventos de teclas de atalho. Se o driver desejar capturar e atuar nessas teclas de atalho, teremos que fazer algo como usar um filtro i8402 para "capturar" os eventos principais.
Também descobri que alguns dos eventos de teclas de atalho têm conflitos, por isso é um território um pouco complicado.
A tecla de atalho da luz de fundo do teclado percorrerá todos os níveis de brilho da luz de fundo disponíveis de forma circular, começando novamente em 0 quando o máximo for atingido (ou seja, 0, 1, 2, 3, 0, 1, ...).
A ação será acionada ao pressionar a tecla de atalho, pois o evento relatado por keydown parece ser o mesmo evento para o progresso do carregamento da bateria (e, portanto, as coisas ficam um pouco malucas quando você começa a carregar!).
A tecla de atalho também deve acionar o evento de alteração de hardware para o LED, que no GNOME (e provavelmente em outros) exibe automaticamente um belo pop-up OSD com o nível de luz de fundo correto exibido.
A tecla de atalho de bloqueio de gravação alternará o recurso allow_recording
, que bloqueia o acesso à câmera e ao microfone integrados.
A tecla de atalho do modo de desempenho também percorrerá todos os perfis de plataforma disponíveis em um método round-robin (baixo consumo de energia, silencioso, balanceado, desempenho, baixo consumo de energia, silencioso, ...).
Atualmente não há pop-up OSD, mas o evento pode ser capturado a partir do dispositivo de entrada "Botões extras do Samsung Galaxy Book", se desejado.
Há um novo dispositivo de entrada criado "botões extras do Samsung Galaxy Book" que enviará eventos de entrada para algumas notificações do dispositivo ACPI:
SAM0428
)SAM0428
) É criada uma nova classe de LED chamada samsung-galaxybook::kbd_backlight
que pode ser controlada via sysfs
em /sys/class/leds/samsung-galaxybook::kbd_backlight/brightness
(valores de 0 a 3) ou por muitos dos utilitários padrão, como brightnessctl
, light
, etc.
Também parece ser selecionado automaticamente no GNOME 45.x no painel, onde você pode clicar na seta ao lado Keyboard
e ajustar o controle deslizante.
Observe que a configuração “desligar automaticamente a luz de fundo do teclado após X segundos” no Windows é, na verdade, controlada pelo serviço de aplicativo da Samsung e não pelo próprio driver do dispositivo; existe um recurso semelhante no GNOME (e novamente, provavelmente em outros) onde ele alterna para o nível mínimo após um certo período ocioso (por exemplo, de 3 para 1 quando você está ocioso e depois volta para 3 quando você retoma), mas independentemente disso O recurso provavelmente deve ser controlado no espaço do usuário de alguma forma e não pelo driver do kernel.
Observe também que a maioria desses dispositivos possui um sensor de luz ambiente que também afeta a luz de fundo do teclado. Esse comportamento não é possível controlar no Windows e ainda não encontrei nada na ACPI que pareça ser capaz de desabilitar esse recurso. O que isso significa é que às vezes você pode pensar que a luz de fundo do teclado está desligando aleatoriamente ou parou de funcionar, mas a realidade é que ela está desligando devido a esse sensor de luz ambiente. Uma maneira de testar quando isso acontece (para ter certeza de que é de fato o sensor de luz ambiente que causou o desligamento da luz de fundo do teclado) é apenas cobrir o sensor de alguma forma (com o dedo, por exemplo) e ver se o as luzes voltam.
Este driver de plataforma adicionará a configuração do limite final do controle de carga da bateria, mas não terá acesso para definir o limite inicial. Esse recurso é normalmente chamado de “economia de bateria” pelos vários aplicativos Samsung no Windows, mas no Linux implementaremos os atributos padrão adicionados ao dispositivo de bateria que são reconhecidos pelo UPower.
Se o usuário desejar manter a interoperabilidade com o Windows, deverá definir o valor como 80 para representar "ligado" ou 0 para representar "desligado", pois esses são os valores reconhecidos pelos vários aplicativos e serviços Samsung baseados em Windows como " ligado" ou "desligado". Caso contrário, o dispositivo aceitará qualquer valor entre 0 (desligado) e 99 como uma porcentagem na qual você deseja que a bateria pare de carregar. Se você tentar definir um valor de 100, o driver também aceitará esta entrada, mas apenas definirá o valor do atributo como 0 (ou seja, 100% é interpretado como "desativar economia de bateria").
Há um novo atributo de dispositivo criado em /sys/class/power_supply/BAT1/charge_control_end_threshold
que pode ser lido ou gravado.
# 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: notei que se você estiver conectado enquanto a bateria já está no
charge_control_end_threshold
desejado e desative esse recurso (ou seja, você deseja carregar totalmente até 100%, então defina o valor como 0), o carregamento não parece para iniciar automaticamente. Pode ser necessário desconectar e reconectar o cabo de carregamento neste caso. O driver do Windows parece estar fazendo alguns truques com o dispositivo de bateria ACPI que ainda não resolvi; Presumo que foi assim que eles fizeram com que funcionasse de maneira mais integrada no Windows.
Há também um evento de entrada enviado ao teclado padrão e ao dispositivo ACPI que é gerado quando o controle de carga é habilitado e a carga atinge o charge_control_end_threshold
desejado; o evento foi mapeado para o evento BATTERY
para que as notificações possam ser exibidas (veja abaixo na seção de remapeamento do teclado para obter informações adicionais sobre isso).
Para ativar ou desativar a configuração "Iniciar com a tampa aberta" (o laptop ligará automaticamente ao abrir a tampa), há um novo atributo de dispositivo criado em /sys/devices/platform/samsung-galaxybook/start_on_lid_open
que pode ser lido de ou escrito para. Um valor 0 significa "desligado", enquanto um valor 1 significa "ligado".
# 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 ativar ou desativar o modo "Carregamento USB" (permite que as portas USB forneçam energia mesmo quando o laptop está desligado), há um novo atributo de dispositivo criado em /sys/devices/platform/samsung-galaxybook/usb_charge
que pode ser lido ou escrito. Um valor 0 significa "desligado", enquanto um valor 1 significa "ligado".
# 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
Minhas próprias observações sobre como esse recurso parece funcionar (que não tem nada a ver com o driver em si, na verdade):
Para ativar ou desativar a configuração "Permitir gravação" (permite ou bloqueia o uso da câmera e do microfone integrados), há um novo atributo de dispositivo criado em /sys/devices/platform/samsung-galaxybook/allow_recording
que pode ser lido de ou escrito para. Um valor 0 significa "desligado", enquanto um valor 1 significa "ligado".
O manual do usuário da Samsung chama essa configuração de "modo de gravação de bloqueio", mas como o valor necessário é 1 para "não bloqueado" e 0 para "bloqueado" (ou seja, o valor de 1 vs 0 parece "inverso" em comparação ao nome), é parecia um nome impróprio chamá-lo assim para este driver. Parece fazer mais sentido que 1 signifique “permitido” e 0 signifique “não permitido”; desta forma, espera-se que seja mais óbvio para o usuário deste driver o que realmente acontecerá quando este valor for alterado.
# 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 têm diferentes números de ventiladores e diferentes métodos para poder ler seu status com êxito. A Samsung parece ter implementado o método de dispositivo de ventilador padrão ACPI _FST
para a maioria das várias implementações, mas não os outros métodos opcionais na especificação ACPI que fariam com que o kernel adicionasse automaticamente o atributo fan_speed_rpm
. Além disso, parece que existem alguns bugs no firmware que geralmente geram uma exceção quando você tenta executar este método ACPI. Esse comportamento também é visto no Windows (uma exceção ACPI é lançada quando se tenta verificar a velocidade do ventilador) e não consegui ver a velocidade do ventilador usando vários aplicativos de monitoramento de hardware ao usar o Windows com este dispositivo.
Este driver de plataforma tenta resolver todos os ventiladores PNP disponíveis na ACPI e adicionar suporte para leitura de sua velocidade usando a seguinte lógica de decisão:
_FST
existe e parece estar funcionando (retorna um valor de velocidade maior que 0)? Se sim, adicione um atributo fan_speed_rpm
a ele e como canal de entrada de ventilador para o dispositivo hwmon.FANS
(nível de velocidade do ventilador) existe no controlador embarcado e a tabela FANT
(tabela de nível de velocidade do ventilador) existe no ventilador? Nesse caso, adicione fan_speed_rpm
a este dispositivo de ventilador, além de um canal de entrada de ventilador para o dispositivo hwmon, e construa a lista de velocidades de ventilador personalizadas com base na lógica abaixo (derivada da leitura do DSDT e da tentativa de interpretar a intenção de como o _FST
original parece querer funcionar). A velocidade do ventilador pode ser monitorada usando sensores hwmon ou lendo o atributo 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
Para dispositivos onde o método _FST
não funciona corretamente, a lógica abaixo é utilizada para derivar as velocidades possíveis para cada nível disponível reportado pelo campo FANS
.
FANT
("tabela de ventiladores"?) Que parece ser algum tipo de lista de possíveis velocidades de RPM nas quais o ventilador pode operar para cada "nível" diferente (0 a 5).FANS
("velocidade do ventilador"?) Que parece fornecer o "nível" atual em que o ventilador está operando. Presumi que os valores do FANT
são números inteiros que representam os valores reais de RPM (eles parecem razoáveis, de qualquer maneira), mas não posso ter cem por cento de certeza de que essa suposição esteja correta. Seria interessante obter a confirmação da Samsung ou se alguém tiver uma forma de medir a velocidade real da ventoinha.
A ventoinha pode estar completamente desligada (0) ou em um dos níveis representados pelas velocidades em FANT
. Este driver lê os valores do FANT
em vez de codificar os níveis com a suposição de que poderiam ser valores diferentes e um número diferente de níveis para dispositivos diferentes. Para referência, os valores que vejo no meu Galaxy Book2 Pro são:
Além disso, no método _FST
da Samsung parece estar adicionando 0x0a
(10) a cada valor antes de tentar relatá-los, e que os níveis 3 e 4 devem ter o mesmo valor, enquanto o nível 5 deve ser o 4º valor de FANT
. No entanto, a observação na vida real sugere que os níveis 3 e 4 são de fato diferentes, e que o nível 5 parece ser significativamente mais alto que o nível 4. Devido a isso, este driver irá apenas "adivinhar" que os níveis 3 e 4 são realmente como estão. listado em FANT
e que o último nível é talvez 1000 RPM mais rápido que o nível 4 (a menos que alguém encontre algo melhor que isso!).
Há um SSDT de teste disponível no arquivo gb_test_fans_ssdt.dsl que inclui um conjunto de dispositivos de ventilador PNP ACPI "falsificados" que podem ser usados para testar como o driver funciona em diferentes cenários. Isso pode ser compilado e carregado dinamicamente, mas você também precisará remover e recarregar o módulo do driver da plataforma para testar como eles serão tratados por ele.
# 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: Você precisará reiniciar para remover esses dispositivos falsos.
Para modificar o "modo de desempenho", o driver implementa a interface platform_profile
. O mapeamento dos “modos de desempenho” da Samsung para seu respectivo perfil de plataforma é feito dinamicamente com base em um mapeamento no código do driver que lê quais modos são relatados como suportados pela ACPI. É dada preferência para tentar mapear perfis low-power
, balanced
e performance
, pois esses parecem ser os perfis mais comuns utilizados (e às vezes até exigidos) por várias ferramentas do espaço do usuário.
O resultado do mapeamento será impresso no log do Kernel quando o módulo estiver sendo carregado. Os perfis suportados podem então ser recuperados de /sys/firmware/acpi/platform_profile_choices
, enquanto /sys/firmware/acpi/platform_profile
pode ser usado para ler ou gravar o perfil desejado.
Exemplos:
# 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 corresponder à lógica do driver do Windows, bem como evitar causar problemas com outros recursos, o driver atualmente sempre definirá o modo de desempenho como "Otimizado" sempre durante sua inicialização (por exemplo, na inicialização).
Deve ser possível definir seu próprio modo de desempenho de inicialização desejado ou salvar e restaurar o modo durante as reinicializações. Você pode usar um script de inicialização ou instalar TLP, power-profiles-daemon ou similar.
Foi um pouco difícil de testar, mas tentei ver se esses modos diferentes realmente faziam uma mudança mensurável, definindo cada modo diferente e executando um teste de estresse rápido usando o seguinte:
sudo stress-ng --cpu 0 --cpu-load 100 --metrics-brief --perf -t 20
Observe que parece levar pelo menos alguns segundos antes que a configuração realmente comece a funcionar.
No final, o que descobri foi que definitivamente pude notar uma diferença no resultado ao usar o modo "silencioso" (0), porque o número resultante de operações concluídas no teste de estresse foi significativamente menor ao usar o modo "silencioso" (quase metade).
Subjetivamente, sinto que o volume do ventilador era um pouco menor no modo "silencioso" em comparação com os outros dois, mas não notei nenhuma grande diferença no número de operações concluídas no teste de estresse. Otimizado e alto desempenho pareciam quase iguais para mim. Também notei que pode haver algum afogamento quando os núcleos chegam perto de 100C, então talvez isso seja parte do problema, por que não consegui perceber a diferença (não tenho certeza do que é seguro ajustar). Isso também pode ser apenas um mecanismo de teste defeituoso!
O arquivo fornecido 61-keyboard-samsung-galaxybook.hwdb é uma cópia da seção relevante para esses dispositivos do 60-keyboard.hwdb mais recente, que pode ser usado com versões mais antigas do systemd. Consulte systemd/issues/34646 e systemd/pull/34648 para obter informações adicionais.
Nota: A tecla "Modo de desempenho" (Fn+F11) vem como uma notificação ACPI e é controlada pelo driver da plataforma
samsung-galaxybook
.
Você pode instalar esse arquivo de mapeamento da seguinte maneira:
sudo cp 61-keyboard-samsung-galaxybook.hwdb /etc/udev/hwdb.d/
sudo systemd-hwdb update
sudo udevadm trigger