Более совершенный подход заключается в создании правила udev
, срабатывающего только при наличии подходящего оборудования, для запуска необходимой команды btattach
из службы systemd
]. Это объединяет концепции двух предыдущих ответов.
Для конкретного набора микросхем, упомянутого в вопросе, правило udev
выглядит просто так:
$ cat /etc/udev/rules.d/99-bluetooth-btattach.rules {{1 }} ЯДРО == "BCM2E55: 00", RUN + = "/ bin / systemctl --no-block start btattach-broadcom-ttyS1.service"
, где BCM2E55: 00 является идентификатором аппаратного ACPI соответствующего набора микросхем Bluetooth.
Служба systemd, совместимая только с наборами микросхем, являющимися дочерними по отношению к узлу устройства ttyS1 (отображается через sysfs в / sys / devices / platform / 80860F0A: 00 / tty / ttyS1 / device / BCM2E55: 00 $
), может оставаться очень простым, например:
$ cat /etc/systemd/system/btattach-broadcom-ttyS1.service
[Unit]
Описание = Start btattach, необходим для включения Bluetooth для некоторых чипсетов Bluetooth Broadcom на базе UART
[Service]
Type = simple
# Требуется задержка, 1 с кажется достаточно {{1} } ExecStartPre = / bin / sleep 1s
ExecStart = / usr / bin / btattach --bredr / dev / ttyS1 -P bcm
Эта служба systemd
будет работать как есть для других наборов микросхем Broadcom (отсюда параметр -P bcm
), являющийся дочерним по отношению к ttys1 (отсюда / dev / ttyS1
); необходимо выполнить только правило udev
, чтобы включить идентификаторы ACPI других вариантов набора микросхем.
Для наборов микросхем Broadcom, подключаемых к другому узлу ttyS *, можно создать другую аналогичную службу systemd
, чтобы охватить этот случай (или, возможно, правильные параметры могут быть переданы из правила udev в службу systemd).
Перезагрузка планшета показывает, что команда btattach
правильно выполняется при загрузке:
$ ps auxw | grep btattach
корень 2059 0,0 0,0 6372 720? Ss 23:17 0:00 / usr / bin / btattach --bredr / dev / ttyS1 -P bcm
и Bluetooth действительно включен и работает! В настройках Gnome Bluetooth перечислены подключенные и просканированные устройства, а запуск $ bluetoothctl
из командной строки правильно отображает контроллер.
Удивительно, но при удалении начальной 1-секундной команды сна, используемой для простой задержки реальной команды, Bluetooth вообще не работает и не включается должным образом, несмотря на то, что btattach
по-прежнему работает правильно в списке фона. процессы.
Еще не уверен, что понимаю, что именно происходит: на карту поставлена проблема времени и, безусловно, необходимая зависимость, которую нужно подождать, прежде чем предполагается запустить btattach ...