如何為依賴 btattach 的最新 Intel 和 Broadcom 晶片組啟用藍牙在啟動時自動?
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
規則,僅在存在正確的硬體時觸發,以btattach
從systemd 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 規則條件時。