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