как использовать rtl8723bs bluetooth в linux 5.10

как использовать rtl8723bs bluetooth в linux 5.10

У меня установлен Alpine Linux edge(будущая версия 3.15) x86 на планшете HP Stream 7 5709 (кратко: Bay Trail, система на чипе Intel Atom Z3735G), в котором есть встроенный rtl8723bsWi-Fi/Bluetooth, который я уже использую для 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имеющаяся версия, поэтому я просто создал на него символическую ссылку, и он отлично заработал со стандартным драйвером, больше ничего не требовалось.

А как насчет Bluetooth?

Согласно базовым описаниям rtl8723bs, его Wi-Fi подключается к системе с помощью SDIO, но его Bluetooth подключается через UART, и это согласуется с тем, что я вижу в дереве диспетчера устройств в Windows на этой системе; UART, к которому он подключен, является одним из встроенных в процессор Atom «HS-UART» (8086:0F0A).

Помимо модулей по умолчанию ядра 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или ванильную hciattachверсию bluez-deprecated, которая работала бы лучше, чем эта.

Еще расследование:

Я вижу, что перечисление устройств на основе ACPI ниже /sys/devicesимеет устройство Bluetooth как OBDA8723, под первым отсеком следа внутренний UART 80860F0A:00.

Драйвер h5( bluetooth/hci_h5.c) предоставляет таблицу ACPI с одной записью для OBDA8723, и судя по тому, что система автоматически решает загрузить модуль btrtl, я ожидаю, что он, по крайней мере, в какой-то степени приближается к тому месту, где ему нужно, чтобы вступить в силу.

Однако, разбросав несколько дополнительных pr_info()s вокруг hci_h5, я вижу, что в то время как основная функция драйвера h5_init()запускается при Bluetoothпервоначальной загрузке всех драйверов serdev, ее h5_btrtl_setup(), на которую она ссылается в структуре указателей функций, переданных с таблицей ACPI, никогда не запускается.

О черт:

И на самом деле 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

Устройства HS-UART, которые можно перечислить с помощью ACPI и которые имеют драйверы, будут автоматически созданы в ядре 5.10, собранном с помощью CONFIG_SERIAL_DEV_CTRL_TTYPORT, и этого достаточно для автоматической настройки этого контроллера Bluetooth без дополнительных шагов присоединения. Вам не нужны никакие дополнительные утилиты, такие как те, что есть на GitHub для старых версий. Но вам нужно иметь требуемую конфигурацию ядра -- CONFIG_SERIAL_DEV_CTRL_TTYPORTrequire 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, и я мог затем запустить bluetoothслужбу, предоставляемую bluez, и использовать ее bluetoothctlдля поиска и настройки устройств Bluetooth.

Обновлять:

Обратите внимание, что в более поздних ядрах контроллер Bluetooth изначально появится во время загрузки, как отмечено в dmesgвыходных данных, но затем исчезнет, ​​и в дальнейшем вывода не будет dmesg, но вы можете увидеть, как исчезают ваши устройства Bluetooth и контроллер, 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

Я перенес эту проблему в отдельный вопрос, поскольку сообщение об ошибке уникально и само по себе является хорошей решаемой проблемой: Как решить проблему неудачных попыток подключения `bluez` с `br-connection-adapter-not-powered`

tl;dr: После редактирования /etc/bluetooth/main.confи настройки AutoEnable=trueв разделе [Policy], а затем перезапуска bluezконтроллер снова появится, dmesgесли он был отключен, и останется включенным.

Связанный контент