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

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

edgeWi-Fi/Bluetooth 가 내장된 HP Stream 7 5709 태블릿(TL;dr: Bay Trail, Intel Atom Z3735G System-on-Chip)에 Alpine Linux(향후 3.15) x86이 설치되어 있습니다. rtl8723bsWi-Fi에 사용해 왔습니다. -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 장치 관리자 트리에서 볼 수 있는 것과 일치합니다. "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 기반 장치 열거의 첫 번째 베이 경로 Internal UART 아래에 /sys/devicesBluetooth 장치가 있는 것을 확인했습니다.OBDA872380860F0A:00

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

그러나 주변에 몇 가지 추가 pr_info()항목을 뿌리면 모든 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

모든 기능을 갖춘 새 커널 패키지를 설치하고 나면

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

고쳐 쓰다:

이후 커널에서는 Bluetooth 컨트롤러가 처음에는 출력에 명시된 대로 부팅 중에 표시되지만 dmesg이후에는 사라지고 더 이상 출력이 없습니다. 하지만 켜면 dmesgBluetooth 장치 및 컨트롤러가 사라지는 것을 볼 수 있습니다 bluetoothctl.

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

이는 Bluetooth 활성화와 절전을 위한 안전한 기본 구성의 조합인 것 같습니다.

계층 구조를 통해 컨트롤러의 전원을 명시적으로 활성화하면 /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

관련 정보