Chromebook(Arch Linux ARM)에서 Bluetooth가 작동하지 않는 이유는 무엇입니까?

Chromebook(Arch Linux ARM)에서 Bluetooth가 작동하지 않는 이유는 무엇입니까?

Chromebook C201에 Arch Linux ARM을 설치했습니다. 블루투스를 작동시키려고 노력했지만 성공하지 못했는데 문제가 무엇인지 모르겠습니다.

출력은 dmesg시스템이 온보드 Bluetooth 컨트롤러를 성공적으로 찾고 초기화하고 있음을 나타내는 것 같습니다.

$ dmesg | grep Blue
[    4.058823] Bluetooth: Core ver 2.22
[    4.058865] Bluetooth: HCI device and connection manager initialized
[    4.058873] Bluetooth: HCI socket layer initialized
[    4.058877] Bluetooth: L2CAP socket layer initialized
[    4.058886] Bluetooth: SCO socket layer initialized
[    4.061738] Bluetooth: Generic Bluetooth SDIO driver ver 0.1
[    4.971101] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    4.971104] Bluetooth: BNEP filters: protocol multicast
[    4.971113] Bluetooth: BNEP socket layer initialized

내가 알 수 있는 한, Bluetooth에 필요한 커널 모듈은 부팅 시에도 로드되는 것으로 보입니다.

$ lsmod | grep ^b
bnep                   20480  2
btsdio                 16384  0
bluetooth             352256  9 btsdio,bnep

나는 /sys/class/bluetooth다음을 가지고 있습니다 :

$ ls /sys/class/bluetooth
hci0

그래서 일종의 블루투스 장치가 있는 것 같습니다.

bluez및 패키지가 설치되어 bluez-utils있고 블루투스가 활성화되어 있으며 실행 중인지 확인했습니다.

$ systemctl status bluetooth.service
● bluetooth.service - Bluetooth service
   Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor preset:>
   Active: active (running) since Sun 2019-02-03 07:22:15 EST; 6h ago
     Docs: man:bluetoothd(8)
 Main PID: 324 (bluetoothd)
   Status: "Running"
    Tasks: 1 (limit: 4915)
   Memory: 2.4M
   CGroup: /system.slice/bluetooth.service
           └─324 /usr/lib/bluetooth/bluetoothd

또한 블루투스 컨트롤러가 rfkill에 의해 차단되지 않았는지 확인했습니다.

$ rfkill list
0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
1: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no

bluetoothctl그러나 (또는 ​​)을 실행하려고 하면 Bluetooth 어댑터를 찾을 수 없습니다 blueman.

$ bluetoothctl
Agent registered
[bluetooth]# list
[bluetooth]#

시도해볼 다른 것이 생각나지 않습니다. 뭔가 빠졌나요?


편집하다:

주어진 유일한 대답으로는 문제가 해결되지 않았으며 현상금에서 추가 가시성을 얻었음에도 불구하고 질문에 대한 응답이 거의 없는 것 같았습니다. 그렇다면 거기에 있어야 할 모든 것이 올바르게 자리잡고 있는 것 같다고 추론해야 할까요? 이는 그럴 가능성이 더 높다는 것을 의미하는가?허점, 아마도 bluez나 커널 모듈에 있을까요?

답변1

C201에서 감지된 SDIO 연결 Bluetooth 모듈은 미끼입니다. C201에서는 이 드라이버를 사용 하면 안 됩니다 btsdio. 실제로 커널에 등록되는 제대로 작동하지 않는 호스트 컨트롤러를 처리할 필요가 없도록 C201에서 모듈을 완전히 비활성화하거나 블랙리스트에 추가하는 것이 좋습니다.

C201의 BCM4354 Bluetooth 모듈은 UART를 통해 연결되며 및 드라이버를 사용하여 액세스할 수 hci-uart있습니다 btbcm. hci-uart드라이버( )에서 Broadcom 지원이 활성화되어 있는지 확인하세요 CONFIG_BT_HCIUART_BCM=y. 이러한 드라이버는 장치를 Bluetooth 하위 시스템과 연결하기 위해 추가 시작 단계가 필요합니다. 예를 들어 실행할 수 있습니다.

# btattach -S 3000000 -B /dev/ttyS0 -p bcm
Attaching Primary controller to /dev/ttyS0
Switched line discipline from 0 to 15
Device index 0 attached

그러면 등록된 장치가 표시됩니다. 이 모듈을 작동하려면 독점 펌웨어가 필요합니다. BCM4354_003.001.012.0358.0746.hcd사전 설치된 OS 이미지에서 파일을 가져와 커널이 찾을 수 있도록 저장 했습니다 /lib/firmware/brcm/BCM4354.hcd.

추가 조사에 따르면 btattach의 전송 속도 옵션은 실제로 아무 작업도 수행하지 않는 것으로 보이므로 Bluetooth 컨트롤러는 약간 느린 115kbaud로 연결됩니다. 올바른 방법은 장치 트리에 컨트롤러를 추가하는 것 같습니다. 그래서 Linux 5.2의 장치 트리 소스 코드에 다음 패치를 적용했고 모든 것이 더 사용 가능한 3Mbaud 속도로 실행되었습니다(보너스로 더 이상 btattach를 실행하지 않으며 모든 것이 부팅 시 자동으로 등록됩니다).

CONFIG_SERIAL_DEV_CTRL_TTYPORT=y이 기능이 작동하려면 serdev 장치 트리 기능을 활성화해야 합니다 .

diff --git a/arch/arm/boot/dts/rk3288-veyron.dtsi b/arch/arm/boot/dts/rk3288-veyron.dtsi
index 1252522392c7..36000dbb8dda 100644
--- a/arch/arm/boot/dts/rk3288-veyron.dtsi
+++ b/arch/arm/boot/dts/rk3288-veyron.dtsi
@@ -57,7 +57,7 @@
        clocks = <&rk808 RK808_CLKOUT1>;
        clock-names = "ext_clock";
        pinctrl-names = "default";
-       pinctrl-0 = <&bt_enable_l>, <&wifi_enable_h>;
+       pinctrl-0 = <&wifi_enable_h>;

        /*
         * Depending on the actual card populated GPIO4 D4 and D5
@@ -71,8 +71,7 @@
         * - BT_I2S_WS_BT_RFDISABLE_L
         * - No connect
         */
-       reset-gpios = <&gpio4 RK_PD4 GPIO_ACTIVE_LOW>,
-                 <&gpio4 RK_PD5 GPIO_ACTIVE_LOW>;
+       reset-gpios = <&gpio4 RK_PD4 GPIO_ACTIVE_LOW>;
    };

    vcc_5v: vcc-5v {
@@ -402,6 +401,16 @@
    /* Pins don't include flow control by default; add that in */
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
+
+   bluetooth {
+       compatible = "brcm,bcm43438-bt";
+       max-speed = <3000000>;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&bt_enable_l>;
+
+       shutdown-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>;
+   };
 };

 &uart1 {

답변2

bluez 버전이 5.50-6보다 이전인 경우 알려진 문제가 있습니다. https://bugs.archlinux.org/task/61386

우연히도 5.50-6은 (Intel) Chromebook에서 실행되고 있습니다.

관련 정보