LINUX.ORG.RU

Broadcom Bluetooth

 , , ,


1

2

По мотивам этой темы решил создать отдельную т.к. блютуз устройства от Broadcom встречаются во многих моделях ноутбуков.

Важным условием работы блютуз от Broadcom, является пропатченный модуль ядра btusb на предмет поддержки Broadcom bluetooth и наличие прошивки(firmware) для вашего устройства. В ядрах с kernel.org я этого патча не обнаружил (может плохо искал). В Ubuntu этот патч имеется. В других дистрибутивах не смотрел.

Уникальную для каждого устройства прошивку можно найти в распакованных драйверах для Windows, в одном из файлов с расширением .hex (назовём его hex-firmware). Hex-firmware необходимо конвертировать в hcd-firmware с помощью утилиты hex2hcd.

Для поиска firmware в распакованных Windows-драйверах, разработал скрипт brcmbtefw. Загрузить можно отсюда.
Скрипт на основе результата lsusb, ищет hex-firmware соответствующий вашему устройству и конвертирует его в формат hcd с помощью утилиты hex2hcd.
Скрипту необходимо передать в качестве параметра имя inf-файла драйверов Broadcom bluetooth для Windows (XP, 7, 8).
Заметил, что на настоящее время, firmware x32 и x64 идентичны.

Итак нам понадобятся:

  1. Утилита hex2hcd (https://github.com/jessesung/hex2hcd)
    Скачать исходник https://github.com/jessesung/hex2hcd/archive/master.zip
    Распаковать архив, зайти в директорию и выполнить:
    $ make
    Копируем hex2hcd в директорию /usr/local/bin
    $ sudo cp hex2hcd /usr/local/bin

  2. Драйвера Broadcom bluetooth для Windows.
    Я cкачал для Windows 8.1 по ссылке: http://download.lenovo.com/ibmdl/pub/pc/pccbbs/mobiles/h9bn03ww.exe
    С помощью wine запускаем скачанный exe, чтобы распаковать драйвер на диск.
    Путь распаковки оставим по умолчанию, в моём случае это C:\DRIVERS\WIN\COMBT
    В конце распаковки снимаем флажок «Install Broadcom bluetooth Combo Driver for Windows now».

  3. Скрипт brcmbtefw
    Скачать, распаковать и выполнить:
    $ ./brcmbtefw /path/file.inf
    где вместо /path/file.inf укажите inf-файл драйверов Broadcom bluetooth для Windows.
    В моём случае так:
    $ ./brcmbtefw ~/.wine/dosdevices/c:/DRIVERS/WIN/COMBT/Win64/bcbtums-win8x64-brcm.inf
    В результате скрипт создаст в домашней директории пользователя файл с расширением hcd (hcd-firmware) вида:
    fw-vid_pid.hcd, где вместо vid и pid будут идентификатор производителя и идентификатор продукта вашего устройства полученного от lsusb.

  4. Необходимо скопировать полученный hcd-firmware в директорию /lib/firmware
    В моём случае было так:
    $ sudo cp fw-105b_e065.hcd /lib/firmware

Врезультате после перезагрузки, я получил работающий блютуз.

Замечены проблемы:
Иногда блютуз устройство не определяется при включении компьютера.
В dmesg появляются строки:

$ dmesg|grep -i blue
...
[   10.363287] Bluetooth: hci0 command 0xfc2e tx timeout
...
[   18.366106] Bluetooth: fail to load firmware
Помогает уход-выход из ждущего или спящего режима. Думаю что это баг ядра.

P.s.: Все действия производились на Xubuntu 12.04.4.
$ uname -a
Linux PCBL 3.11.0-19-generic #33~precise1-Ubuntu SMP Wed Mar 12 21:17:09 UTC 2014 i686 i686 i386 GNU/Linux

★★★★★

Разбор полётов...

При осмотре btusb.c, обнаружил, что в нём перечислены не все обнаруженные в Windows-драйверах устройства, для которых нужна прошивка.

$ cat btusb.c | grep "BTUSB_BCM_PATCHRAM"

#define BTUSB_BCM_PATCHRAM	0x800
	{ USB_DEVICE(0x13d3, 0x3388), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_DEVICE(0x13d3, 0x3389), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_DEVICE(0x413c, 0x8197), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_DEVICE(0x413c, 0x8143), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_DEVICE(0x04ca, 0x2007), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_DEVICE(0x105b, 0xe065), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_VENDOR_AND_INTERFACE_INFO(0x0489, 0xff, 0x01, 0x01), .driver_info = BTUSB_BCM_PATCHRAM },
	{ USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01), .driver_info = BTUSB_BCM_PATCHRAM },
	if (id->driver_info & BTUSB_BCM_PATCHRAM)

Если vid и pid вашего устройства отсутствует в btusb.c, то, возможно вам поможет добавление его самостоятельно в исходник модуля по аналогии с имеющимися, с последующей перекомпиляцией ядра и его установка.

Получить все имеющиеся firmwares можно с помощью утилиты brcmbtefw добавив опцию "-a":

$ ./brcmbtefw -a /path/file.inf
В результате, в домашней директории пользователя появятся прошивки для всех устройств Broadcom bluetooth.

Возможно, если все их vid и pid по аналогии добавить в исходник btusb.c, и все прошивки поместить в /lib/firmware или отдельный пакет, то после установки этого пакета, любой Broadcom bluetooth из вышеперечисленных будет работать.

superuser ★★★★★
() автор топика

Респект и уважение!

Заметил, что на настоящее время, firmware x32 и x64 идентичны.

Они всегда будут идентичны, потому-что фирмварь загружается в контроллер, а не в операционку.

Deleted
()

[ 18.366106] Bluetooth: fail to load firmware

А если принудительно загрузить фирмварь через brcm_patchram_plus_usb?

Deleted
()
Ответ на: комментарий от superuser

Если vid и pid вашего устройства отсутствует в btusb.c, то, возможно вам поможет добавление его самостоятельно в исходник модуля по аналогии с имеющимися, с последующей перекомпиляцией ядра и его установка.

Можно обойтись без перекомпиляции ядра.

install btusb /sbin/modprobe --ignore-install btusb && echo 'VID PID' > /sys/bus/usb/drivers/btusb/new_id

в /etc/modprobe.d/bcrm.conf

Deleted
()
Ответ на: комментарий от Deleted

Не хватает навыков, чтобы это работало после выхода из ждущего и спящего режимов. И аналогичный функционал имеется в пропатченном модуле ядра btusb.

superuser ★★★★★
() автор топика
3 января 2015 г.

Начиная с версии ядра 3.16, в модуль btusb включили все необходимые патчи,
но всё еще требуется устанавливать прошивку(firmware), но уже по другому адресу...
В моём случае модуль btusb берёт прошивку по пути:

/lib/firmware/brcm/BCM43142A0-105b-e065.hcd 
Зачем усложнили, непонятно (где брать точное наименование? в моем случае BCM43142A0...) Похоже кто-то занимается вредительством - простым пользователям создаёт проблемы.

superuser ★★★★★
() автор топика
15 мая 2015 г.
Ответ на: help от token

Скрипт не видит INF файл. Вы запускали Wine под рутом? Если да, то возможно, в этом ошибка.

superuser ★★★★★
() автор топика
Ответ на: комментарий от superuser

ДОПОЛНЕНИЕ. Хотя все патчи и внесли в модуль btusb ванильного ядра, как всегда чего-то не хватает, а именно не внесли все идентификаторы vid и pid в таблицу btusb_table. Поэтому, если для вашего блютуз-устройства требуется firmware, то вам необходимо проверить наличие vid и pid вашего устройства в модуле btusb.c в таблице btusb_table. Добавить их самомтоятельно при их отсутствии и собрать ядро или модуль. В моём случае, (при сборке ядра с kernel.org) пришлось добавить идентификаторы 0x105b, 0xe065 :

static const struct usb_device_id btusb_table[] = {
	/* Generic Bluetooth USB device */
	{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
...

{ USB_DEVICE(0x105b, 0xe065), .driver_info = BTUSB_BCM_PATCHRAM },

...

	{ }	/* Terminating entry */
};

Если вы используете Ubuntu и производные от неё, то строчка
 USB_DEVICE(0x105b, 0xe065), .driver_info = BTUSB_BCM_PATCHRAM }, 
для устройства BCM43142A0 там уже имеется.

superuser ★★★★★
() автор топика
Ответ на: комментарий от superuser

help

superuser, извини меня за идиотский вопрос, есть значит модуль btusb.c, в этом модуле должна быть таблица btusb_table, которую надо отредактировать а точнее внести идентификаторы vid и pid (недостающие) этот модуль находится в ядре или этот модуль нужно создать и внести при компиляции потому как я его там этот модуль не нашел.

http://itmages.ru/image/view/2553967/9e8b23e6

http://itmages.ru/image/view/2553964/1dc03e56

Broadcom Bluetooth BCM20702 Windows 7 32_64

http://download.lenovo.com/pccbbs/mobiles/j6be02ww.exe

token
()
Ответ на: help от token

В вашем случае надо:
1) Добавить строку

  { USB_DEVICE(0x04ca, 0x2007), .driver_info = BTUSB_BCM_PATCHRAM }, 
Исходник модуля искать /<path-to-linux-src>/drivers/bluetooth/btusb.c
Скомпилировать ядро (или модуль отдельно), установить.
2) Загрузиться с этим ядром и узнать путь к hcd-firmware которое ищет модуль командой:
$ dmesg | grep "\.hcd" 
3) Поместить hcd-firmware по нужному адресу.
4) Перезагрузится или перезагрузить модуль btusb.

superuser ★★★★★
() автор топика
Ответ на: help от token

Если используете свежее ядро от Ubuntu, то строка для вашего устройства там имеется тоже.

superuser ★★★★★
() автор топика
Ответ на: комментарий от superuser

help

Спасибо дружище, все понял, буду пробовать, как сделаю отпишусь! Еще раз спасибо!

token
()
23 июня 2015 г.

Update: модуль в ядре 4.1 ищет hcd-firmware для моего устройства по адресу
/lib/firmware/brcm/BCM.hcd

superuser ★★★★★
() автор топика
Последнее исправление: superuser (всего исправлений: 1)
22 января 2016 г.
Ответ на: комментарий от nZemekis

Если модуль не находит hcd-firmware, то ругается в dmesg. Смотреть так:

$ dmesg | grep "\.hcd" 
Если не ошибаюсь, то в последних версиях ядер, hcd-firmware надо положить в директорию /lib/firmware/brcm/

superuser ★★★★★
() автор топика
Последнее исправление: superuser (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.