Uma abordagem mais refinada consiste em criar uma regra udev
, acionada apenas quando o hardware correto estiver presente, para iniciar o comando btattach
necessário de um systemd service
. Isso está mesclando os conceitos das duas respostas anteriores.
Para o chipset específico mencionado na pergunta, a regra udev
é simplesmente assim:
$ cat /etc/udev/rules.d/99-bluetooth-btattach.rules
KERNEL=="BCM2E55:00", RUN+="/bin/systemctl --no-block start btattach-broadcom-ttyS1.service"
com BCM2E55: 00 sendo o identificador de hardware ACPI do chipset Bluetooth correspondente.
O serviço systemd, compatível apenas com chipsets que aparecem como filhos do nó do dispositivo ttyS1 (visível via sysfs em /sys/devices/platform/80860F0A:00/tty/ttyS1/device/BCM2E55:00$
), pode permanecer muito simples assim:
$ cat /etc/systemd/system/btattach-broadcom-ttyS1.service
[Unit]
Description=Start btattach, needed to enable Bluetooth for some UART-based Bluetooth Broadcom chipsets
[Service]
Type=simple
# A delay is needed, 1s seems enough
ExecStartPre=/bin/sleep 1s
ExecStart=/usr/bin/btattach --bredr /dev/ttyS1 -P bcm
Esse systemd service
funcionará como está para outros chipsets da Broadcom (daí o parâmetro -P bcm
) aparecendo como um filho de ttys1 (daí o /dev/ttyS1
); apenas a regra udev
precisa ser preenchida para incluir os identificadores ACPI de outras variantes do chipset.
Para os chipsets Broadcom que se conectam a um nó ttyS * diferente, outro systemd service
semelhante pode ser criado para cobrir este caso (ou talvez os parâmetros corretos possam ser compartilhados da regra do udev para o serviço systemd).
A reinicialização da mesa mostra que o comando btattach
foi executado corretamente na inicialização:
$ ps auxw | grep btattach
root 2059 0.0 0.0 6372 720 ? Ss 23:17 0:00 /usr/bin/btattach --bredr /dev/ttyS1 -P bcm
e o Bluetooth está realmente ativado e funcionando! As configurações do Gnome Bluetooth listam dispositivos conectados e varridos e a execução de $ bluetoothctl
a partir de uma linha de comando mostra corretamente o controlador.
Surpreendentemente, ao remover o comando sleep 1s inicial usado para simplesmente atrasar o comando real, o Bluetooth não está funcionando e não está habilitado corretamente, apesar de btattach
ainda parecer estar sendo executado corretamente na lista de processos em segundo plano.
Não tenho certeza de entender exatamente o que está acontecendo: há uma questão de tempo em jogo e, certamente, uma dependência necessária para esperar, antes de ser lançado o btattach ...