Наверх

Как подключить Bluetooth Ugreen CM390 на Ubuntu / Debian

В августе 2022 командой разработки Home Assistant  был анонсирован новый улучшенный модуль интеграции Bluetooth, теоретически позволяющий подключать Bluetooth устройства напрямую без MQTT брокера, однако работающий пока только с ограниченным списком Bluetooth свистков (ASUS USB-BT400, ASUS USB-BT500, Ugreen CM390 и т.д.).

Поддерживаемые адаптеры

  • ASUS USB-BT400
  • ASUS USB-BT500
  • Avantree DG45
  • Kinivo BTD-400
  • Maxuni BT-50
  • SUMEE BT501
  • UGREEN CM390
  • XDO BT802 (Long Range)
  • ZEXMTE BT-505 (Long Range)
  • ZEXMTE BT-DG54

Неподдерживаемые адаптеры

  • tp-link UB400 - Frequent connection failures
  • tp-link UB500 - Frequent connection failures

Мой безымянный Bluetooth 4 модуль не захотел определяться ассистентом, поэтому было принято решение заменить его на доступный в магазине UGREEN CM390. Естественно, драйвера по умолчанию не подтянулись, и команда hcitool scan упрямо сообщала, что устройств не найдено.

Значит, нужно установить драйвера вручную.

Для начала, при подключённом устройстве, выполним команду lsusb, и убедимся, что операционная система видит USB устройство:

Найдем драйвер для нашего устройства https://www.xmpow.com/pages/download
Скачиваем (Запасная копия в zip формате 20201202_LINUX_BT_DRIVER)

wget https://mpow.s3-us-west-1.amazonaws.com/mpow_BH519A_driver+for+Linux.7z

Распаковываем, заходим в директорию, куда распаковали, и собираем

sudo make install INTERFACE=all

Подключаем / переподключаем свисток в USB порт.

Обсуждение

Возможные проблемы и ошибки

ERROR: Module btusb is not currently loaded

Если вы запустили сборку и увидели следующую ошибку, значит драйвера Bluetooth у вас вообще не установлены, однако инсталлятор пытается их удалить перед тем, как ставить новые

make[1]: вход в каталог «/root/20201202_LINUX_BT_DRIVER/usb»
rmmod btusb
rmmod: ERROR: Module btusb is not currently loaded

mv /lib/modules/5.10.83-std-def-alt1/kernel/drivers/bluetooth/btusb.ko /lib/modules/5.10.83-std-def-alt1/kernel/drivers/bluetooth/btusb_bak r
mmod rtk_btusb
rmmod: ERROR: Module rtk_btusb is not currently loaded

В папке с драйверами следует перейти в подпапку usb, открыть Makefile и закомментировать соответствующие строки после директивы install. Сохраните файл, вернитесь в корень папки с драйверами и запустите сборку заново.

make[3]: *** /lib/modules/4.19.0-22-amd64/build: Нет такого файла или каталога. Останов.

Если вы запустили сборку и увидели следующую ошибку, значит у вас нет заголовков под ядро 4.19 (или того номера, который будет у вас в тексте ошибки). Установите заголовки под ваше текущее ядро и попробуйте запустить сборку еще раз.

sudo apt install linux-headers-$(uname -r)

Ошибка функции hci_uart_init

Следующая ошибка сообщает о несовместимости типов в коде UART драйвера

/20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver/hci_ldisc.o
/20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver/hci_ldisc.c: In function ‘hci_uart_init’:
/20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver/hci_ldisc.c:1149:22: error: assignment to ‘ssize_t (*)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int)’ {aka ‘long int (*)(struct tty_struct *, struct file *, unsigned char *, long unsigned int, void **, long unsigned int)’} from incompatible pointer type ‘ssize_t (*)(struct tty_struct *, struct file *, unsigned char *, size_t)’ {aka ‘long int (*)(struct tty_struct *, struct file *, unsigned char *, long unsigned int)’} [-Werror=incompatible-pointer-types] 1149 | hci_uart_ldisc.read = hci_uart_tty_read;

Как советуют в обсуждении аналогичного драйвера, зайдите в файл hci_ldisc.c, расположеный в папке /20201202_LINUX_BT_DRIVER/uart/bluetooth_uart_driver, найдите строки

static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
                                 unsigned char __user *buf, size_t nr)

и замените их на

static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
                                unsigned char __user *buf, size_t nr,
                                void **cookie, unsigned long offset)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *