Systemd

如何為依賴 btattach 的最新 Intel 和 Broadcom 晶片組啟用藍牙在啟動時自動

  • February 3, 2018

Intel 和 Broadcom 的一些最新藍牙晶片組需要btattach在使用者空間執行命令才能正確啟用藍牙(它“附加”BT 晶片組並在需要時觸發所需韌體的載入)。

此類範例是 Lenovo ThinkPad 8 平板電腦上的 Broadcom BCM43241 rev B5 晶片組,它需要以下命令# btattach --bredr /dev/ttyS1 -P bcm,但這適用於連接到 UART 控制器的許多其他藍牙晶片組。

問:在啟動期間觸發所需btattach命令以自動啟用藍牙的最佳推薦方法是什麼?

PS 這個想法是為開始打包btattach命令的 Linux 發行版(如 Debian)做出這樣的修改,因為現在許多最近的設備根本沒有開箱即用的藍牙。這對於沒有或只有很少全尺寸 USB 埠的平板電腦特別有用。

一種更精細的方法是創建一個udev規則,僅在存在正確的硬體時觸發,以btattachsystemd service. 這是合併前面2個答案的概念。

對於問題中提到的特定晶片組,udev規則如下所示:

$ cat /etc/udev/rules.d/99-bluetooth-btattach.rules KERNEL=="BCM2E55:00", RUN+="/bin/systemctl --no-block start btattach-broadcom-ttyS1.service"

BCM2E55 :00是相應藍牙晶片組的硬體 ACPI 標識符。

systemd 服務僅與作為ttyS1設備節點的子節點出現的晶片組兼容(通過 sysfs in 可見/sys/devices/platform/80860F0A:00/tty/ttyS1/device/BCM2E55:00$),可以保持非常簡單,如下所示:

`$ 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`

systemd service對於其他作為ttys1子集(因此是)的 Broadcom 晶片組(因此是-P bcm參數)將按原樣工作;只需完成規則以包含其他晶片組變體的 ACPI 標識符。/dev/ttyS1``udev

對於連接到不同 ttyS* 節點的 Broadcom 晶片組,systemd service可以創建另一個類似的來覆蓋這種情況(或者可以將正確的參數從 udev 規則共享到 systemd 服務)。

重新啟動平板電腦顯示該btattach命令在啟動時正確執行:

$ 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

並且藍牙實際上已啟用並正常工作!Gnome 藍牙設置確實列出了連接和掃描的設備,並且$ bluetoothctl從命令行執行正確顯示了控制器。

令人驚訝的是,當刪除用於簡單地延遲實際命令的初始 1 秒睡眠命令時,藍牙根本無法工作並且未正確啟用,儘管btattach在後台程序列表中似乎仍在正常執行。

還不確定到底發生了什麼:在應該啟動 btattach 之前,存在一個時間問題,當然還有一個需要等待的依賴項……

linux-bluetooth 郵件列表上的討論建議創建一個相應的udev rule,cf。這條消息

對於問題中提到的特定晶片組,一個簡單的 udev 規則如下所示:

$ cat /etc/udev/rules.d/98-bluetooth-attach-broadcom.rule KERNEL=="BCM2E55:00", RUN+="/usr/bin/btattach --bredr /dev/ttyS1 -P bcm"

BCM2E55 :00是相應藍牙晶片組的硬體 ACPI 標識符,顯示為ttyS1設備節點的子節點(通過 sysfs in 可見/sys/devices/platform/80860F0A:00/tty/ttyS1/device/BCM2E55:00$)。每個 ACPI 標識符都需要添加到規則文件中,並帶有適用於每個晶片組變體的相應 /dev/ttyS*。

但是,這種簡單方法的一個已知限制是它只能在很短的時間內工作,如此所述。實際上,該btattach命令會在幾秒/分鐘後被殺死。這是記錄在案的行為udev

udev 不適合啟動守護程序或其他長時間執行的程序;事件處理完成後,分叉的程序,無論是否分離,都將無條件終止。`

因此,不是btattach直接從udev規則本身啟動命令,而是需要btattach間接觸發其他選項以確保它不會被殺死,例如可能通過 systemd 服務。

在進行一些首次測試時,這個簡單的答案可能仍然有用,尤其是在找到正確的 udev 規則條件時。

引用自:https://unix.stackexchange.com/questions/309219