Linux 5.10에서 rtl8723bs 블루투스를 사용하는 방법

Linux 5.10에서 rtl8723bs 블루투스를 사용하는 방법

저는 edge온보드 Wi-Fi/Bluetooth가 있는 HP Stream 7 5709 태블릿(tl;dr: Bay Trail, Intel Atom Z3735G 시스템 온 칩)에 Alpine Linux(향후 3.15) x86을 가지고 있습니다. rtl8723bs이미 Wi-Fi를 사용하고 있으며 정상적으로 작동하고 있습니다.

sl7alp:~$ uname -a
Linux sl7alp 5.10.72-1-lts #2-Alpine SMP Sat, 16 Oct 2021 06:04:30 +0000 i686 Linux

Wi-Fi의 경우 정확한 펌웨어 파일이 /lib/firmware/rtlwifi/rtl8723bs_nic.bin배포판에 없지만 rtl8723bu존재하는 버전과 동일하므로 해당 파일을 심볼릭 링크로 연결했고 기본 드라이버와 잘 작동했으며 다른 것은 필요하지 않았습니다.

하지만 블루투스는 어떻습니까?

주변 의 기본 설명에 따르면 rtl8723bsWi-Fi는 SDIO를 사용하여 시스템에 연결되지만 Bluetooth는 UART를 통해 연결되며 이는 이 시스템의 Windows 장치 관리자 트리에서 볼 수 있는 내용과 일치합니다. 연결된 UART는 "HS-UART" 프로세서(8086:0F0A)에 내장된 Atom 프로세서 중 하나입니다.

Edge 5.10 커널의 기본 모듈 외에도 관련 있는 것처럼 보이는 추가 기능을 켜고 구축하고 설치한 적절한 추가 커널 모듈이 있습니다.

CONFIG_SERIAL_DEV_BUS=m
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y

이후 부팅 시 관련 모듈이 자동으로 로드됩니다.

sl7alp:~$ lsmod | grep serdev
serdev                 20480  1 hci_uart
sl7alp:~$ lsmod | grep hci_uart
hci_uart               49152  0
btrtl                  16384  1 hci_uart
btintel                24576  1 hci_uart
serdev                 20480  1 hci_uart
bluetooth             356352  3 btrtl,hci_uart,btintel

dmesg관련 HS-UART에 대한 출력을 볼 수 있습니다 .

[    1.062751] 80860F0A:00: ttyS1 at MMIO 0x50919000 (irq = 16, base_baud = 2764800) is a 16550A
[    1.079576] 80860F0A:01: ttyS2 at MMIO 0x5091b000 (irq = 17, base_baud = 2764800) is a 16550A

하지만 이렇게 해도 Bluetooth 장치를 자동으로 사용할 수 있게 되는 것은 아닙니다. bluetoothctl컨트롤러를 나열하지 않으며 rfkill아무것도 표시하지 않습니다.

(아마도 오래된 ~ 4.x 커널 시대) 타사 저장소를 찾았습니다.https://github.com/lwfinger/rtl8723bs_bt남은 단계는 UART를 통해 직접 일종의 초기화 핸드셰이크를 수행한 다음 관련 Bluetooth 드라이버 인프라 부분에 깨어나 연결하고 Bluetooth를 처리하도록 지시하는 것입니다. 그러나 해당 저장소를 사용 ./start_bt.sh하면 그냥 오류가 발생했습니다.

Using device /dev/ttyS1 for Bluetooth
Realtek Bluetooth init uart with init speed:115200, final_speed:115200, type:HCI UART H5
Realtek Bluetooth :Realtek hciattach version 2.5
Realtek Bluetooth :3-wire sync pattern resend : 1, len: 8
[...]
Realtek Bluetooth :3-wire sync pattern resend : 40, len: 8
Realtek Bluetooth ERROR: H5 sync timed out

그리고 나는 그것 보다 더 잘 작동하는 명령줄 btattach을 만들 수 없습니다 .hciattachbluez-deprecated

추가 조사:

아래의 ACPI 기반 장치 열거에는 첫 번째 베이 트레일 내부 UART 아래에 /sys/devicesBluetooth 장치가 있는 것으로 나타났습니다 .OBDA872380860F0A:00

드라이버 h5( bluetooth/hci_h5.c)는 에 대한 하나의 항목이 있는 ACPI 테이블을 제공하며 OBDA8723시스템이 자동으로 모듈을 로드하기로 결정한다는 사실로 판단하면 btrtl적어도 어느 정도는 적용해야 할 위치에 도달한 것으로 예상됩니다.

그러나 pr_info()주위에 몇 가지 추가 s를 뿌리면 처음에 모든 serdev 드라이버를 로드할 때 드라이버의 메인이 실행되는 동안 ACPI 테이블과 함께 전달된 함수 포인터의 구조체에서 참조되는 가 실행되지 않는다는 hci_h5것을 알 수 있습니다 .h5_init()Bluetoothh5_btrtl_setup()

아 젠장:

그리고 실제로 serdev의 기능은 serdev_drv_probe()결코 실행되지 않습니다. 왜?

유사한 문제를 해결했다는 보고에 따르면 SERIAL_DEV_CTRL_TTYPORT. 이미 이 기능을 활성화했지만 다음과 같습니다.

에서 drivers/tty/serdev/Kconfig:

config SERIAL_DEV_CTRL_TTYPORT
        [...]
        depends on SERIAL_DEV_BUS != m

즉, 커널을 빌드하려면 모듈로만 활성화되는 것이 아니라 커널( )에 실제로 내장되어 있어야 SERIAL_DEV_CTRL_TTYPORT합니다 .SERIAL_DEV_BUS=y

답변1

ACPI를 사용하여 열거할 수 있고 드라이버가 있는 HS-UART 장치는 로 구축된 5.10 커널에서 자동으로 인스턴스화되며 CONFIG_SERIAL_DEV_CTRL_TTYPORT, 이는 추가 연결 단계 없이 이 Bluetooth 컨트롤러를 자동으로 설정하는 데 충분합니다. 이전 버전의 경우 GitHub에 떠다니는 유틸리티와 같은 추가 유틸리티가 필요하지 않습니다. 그러나 필요한 커널 구성이 필요 CONFIG_SERIAL_DEV_CTRL_TTYPORT합니다 CONFIG_SERIAL_DEV_BUS=y. 즉, serdev모듈로 구축된 것이 아니라 커널에 내장된 require 가 필요합니다.

모든 기능으로 빌드된 새 커널 패키지를 설치하면

CONFIG_SERIAL_DEV_BUS=y
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y

시스템이 컨트롤러를 즉시 감지했습니다.

[    5.809856] Bluetooth: hci0: RTL: examining hci_ver=06 hci_rev=000b lmp_ver=06 lmp_subver=8723
[    5.814460] Bluetooth: hci0: RTL: rom_version status=0 version=1
[    5.814467] Bluetooth: hci0: RTL: loading rtl_bt/rtl8723bs_fw.bin
[    5.815894] Bluetooth: hci0: RTL: loading rtl_bt/rtl8723bs_config-OBDA8723.bin
[    5.838004] Bluetooth: hci0: RTL: cfg_sz 64, total sz 24508
[    6.720942] Bluetooth: hci0: RTL: fw version 0x365d462e

에서는 기본적으로 활성화되었으며 에서 제공하는 서비스를 rfkill시작할 수 있었고 이를 사용하여 블루투스 장치를 찾고 설정할 수 있었습니다.bluetoothbluezbluetoothctl

업데이트:

이후 커널에서는 출력에 명시된 대로 부팅 중에 블루투스 컨트롤러가 처음에 표시되지만 dmesg이후에는 더 이상 출력되지 않고 사라지 지만 블루투스 장치와 컨트롤러를 열면 dmesg사라지는 것을 볼 수 있습니다. bluetoothctl:

[DEL] Device E8:06:88:xx:xx:xx rakslice’s keyboard
[DEL] Controller 08:D8:33:xx:xx:xx BlueZ 5.62 [default]

이는 블루투스 활성화와 절전 기능의 안전한 기본 구성이 결합된 것으로 보입니다.

계층 구조 를 통해 컨트롤러의 전원을 명시적으로 활성화하면 /sys/devices컨트롤러가 계속해서 나타 dmesg납니다 bluetoothctl.

sudo bash -c 'echo on > /sys/devices/platform/80860F0A:00/serial0/serial0-0/power/control'

그러나 여전히 제대로 작동하지 않습니다.

[bluetooth]# connect E8:06:88:xx:xx:xx
Attempting to connect to E8:06:88:xx:xx:xx
Failed to connect: org.bluez.Error.NotReady br-connection-adapter-not-powered

오류 메시지가 독특하고 그 자체로 해결할 수 있는 좋은 문제이기 때문에 해당 문제를 별도의 질문으로 옮겼습니다. `br-connection-adapter-not-powered`로 인해 실패하는 `bluez` 연결 시도를 해결하는 방법

tl;dr: 아래에서 편집 /etc/bluetooth/main.conf및 설정한 후 다시 시작하면 컨트롤러가 오프라인인 경우 다시 나타나서 계속 켜져 있습니다.AutoEnable=true[Policy]bluezdmesg

관련 정보