Brak bluetooth w ThinkPad T430 (BCM20702A1)

Spis treści

W moim laptopie Lenovo ThinkPad T430 jest obecny bluetooth Broadcom Corp. BCM20702 Bluetooth 4.0 o vid/pid 0a5c:21e6 . Niestety to urządzenie nie działa za dobrze na Debianie z powodu braku odpowiedniego firmware (plik BCM20702A1-0a5c-21e6.hcd ), którego jak na złość nie ma w repozytorium tej dystrybucji. Przydałoby się coś na to poradzić, by zmusić tę kartę/adapter do pracy pod linux.

Brak pliku firmware

Podczas startu Debiana, na ekranie monitora (czy też w logu systemowym) można doszukać się poniższych komunikatów świadczących o braku potrzebnego firmware:

kernel: usb 1-1.4: new full-speed USB device number 4 using ehci-pci
kernel: usb 1-1.4: New USB device found, idVendor=0a5c, idProduct=21e6, bcdDevice= 1.12
kernel: usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 1-1.4: Product: BCM20702A0
kernel: usb 1-1.4: Manufacturer: Broadcom Corp
kernel: usb 1-1.4: SerialNumber: 74E54320FEA9
kernel: usb 1-1.4: Device is not authorized for usage
kernel: usb 1-1.4: authorized to connect
kernel: Bluetooth: hci0: BCM: chip id 63
kernel: Bluetooth: hci0: BCM: features 0x07
mtp-probe[127320]: checking bus 1, device 4: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.4"
kernel: Bluetooth: hci0: BCM20702A
kernel: Bluetooth: hci0: BCM20702A1 (001.002.014) build 0000
kernel: bluetooth hci0: firmware: failed to load brcm/BCM20702A1-0a5c-21e6.hcd (-2)
kernel: bluetooth hci0: firmware: failed to load brcm/BCM20702A1-0a5c-21e6.hcd (-2)
kernel: bluetooth hci0: Direct firmware load for brcm/BCM20702A1-0a5c-21e6.hcd failed with error -2
kernel: Bluetooth: hci0: BCM: Patch brcm/BCM20702A1-0a5c-21e6.hcd not found

Z reguły by zmusić jakiś sprzęt cierpiący na brak firmware do działania pod Debianem, wystarczy doinstalować mu stosowny pakiet mający w nazwie firmware-* . Nawet jeśli nie wiadomo, który do końca plik wgrać, to zawsze można spróbować przeszukać pakiety przy pomocy apt-file i ustalić tę paczkę, której potrzebujemy. Niestety w przypadku tego adaptera wbudowanego w mój laptop, apt-file zwraca pusty wynik, czyli wygląda na to, że w repozytorium Debiana nie ma stosownego pakietu, który by zawierał plik BCM20702A1-0a5c-21e6.hcd .

Poniżej znajdują się jeszcze dokładne informacje na temat tego adaptera bluetooth otrzymane via lsusb :

# lsusb -vvv -d 0a5c:21e6

Bus 001 Device 007: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         1
  bDeviceProtocol         1
  bMaxPacketSize0        64
  idVendor           0x0a5c Broadcom Corp.
  idProduct          0x21e6 BCM20702 Bluetooth 4.0 [ThinkPad]
  bcdDevice            1.12
  iManufacturer           1 Broadcom Corp
  iProduct                2 BCM20702A0
  iSerial                 3 74E54320FEA9
  bNumConfigurations      1
  Configuration Descriptor:
	bLength                 9
	bDescriptorType         2
	wTotalLength       0x00da
	bNumInterfaces          4
	bConfigurationValue     1
	iConfiguration          0
	bmAttributes         0xe0
	  Self Powered
	  Remote Wakeup
	MaxPower                0mA
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        0
	  bAlternateSetting       0
	  bNumEndpoints           3
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x81  EP 1 IN
		bmAttributes            3
		  Transfer Type            Interrupt
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0010  1x 16 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x82  EP 2 IN
		bmAttributes            2
		  Transfer Type            Bulk
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0040  1x 64 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x02  EP 2 OUT
		bmAttributes            2
		  Transfer Type            Bulk
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0040  1x 64 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        1
	  bAlternateSetting       0
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x83  EP 3 IN
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0000  1x 0 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x03  EP 3 OUT
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0000  1x 0 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        1
	  bAlternateSetting       1
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x83  EP 3 IN
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0009  1x 9 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x03  EP 3 OUT
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0009  1x 9 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        1
	  bAlternateSetting       2
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x83  EP 3 IN
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0011  1x 17 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x03  EP 3 OUT
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0011  1x 17 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        1
	  bAlternateSetting       3
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x83  EP 3 IN
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0019  1x 25 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x03  EP 3 OUT
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0019  1x 25 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        1
	  bAlternateSetting       4
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x83  EP 3 IN
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0021  1x 33 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x03  EP 3 OUT
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0021  1x 33 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        1
	  bAlternateSetting       5
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass      1
	  bInterfaceProtocol      1
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x83  EP 3 IN
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0031  1x 49 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x03  EP 3 OUT
		bmAttributes            1
		  Transfer Type            Isochronous
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0031  1x 49 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        2
	  bAlternateSetting       0
	  bNumEndpoints           2
	  bInterfaceClass       255 Vendor Specific Class
	  bInterfaceSubClass    255 Vendor Specific Subclass
	  bInterfaceProtocol    255 Vendor Specific Protocol
	  iInterface              0
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x84  EP 4 IN
		bmAttributes            2
		  Transfer Type            Bulk
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0020  1x 32 bytes
		bInterval               1
	  Endpoint Descriptor:
		bLength                 7
		bDescriptorType         5
		bEndpointAddress     0x04  EP 4 OUT
		bmAttributes            2
		  Transfer Type            Bulk
		  Synch Type               None
		  Usage Type               Data
		wMaxPacketSize     0x0020  1x 32 bytes
		bInterval               1
	Interface Descriptor:
	  bLength                 9
	  bDescriptorType         4
	  bInterfaceNumber        3
	  bAlternateSetting       0
	  bNumEndpoints           0
	  bInterfaceClass       254 Application Specific Interface
	  bInterfaceSubClass      1 Device Firmware Update
	  bInterfaceProtocol      1
	  iInterface              0
	  Device Firmware Upgrade Interface Descriptor:
		bLength                             9
		bDescriptorType                    33
		bmAttributes                        5
		  Will Not Detach
		  Manifestation Tolerant
		  Upload Unsupported
		  Download Supported
		wDetachTimeout                   5000 milliseconds
		wTransferSize                      64 bytes
		bcdDFUVersion                   1.10
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status:     0x0001
  Self Powered

Pozyskanie pliku BCM20702A1-0a5c-21e6.hcd

Na szczęście nie jest tak źle jak mogłoby się wydawać, bo plik firmware jak najbardziej istnieje, tylko póki co nikt z Debiana nie pokusił się by zrobić stosowną paczkę i udostępnić ją ludziom do łatwej instalacji w ich systemach. Dlatego też musimy ten plik pozyskać manualnie i wgrać go w stosowne miejsce, by bluetooth zaczął nam działać. Odpalamy zatem terminal, logujemy się na root, przechodzimy do katalogu /lib/firmware/ i pobieramy potrzebny nam plik przy pomocy wget :

# cd /lib/firmware/
# mkdir brcm/ && cd brcm/
# wget https://github.com/winterheart/broadcom-bt-firmware/blob/master/brcm/BCM20702A1-0a5c-21e6.hcd

I to w zasadzie cała robota. Trzeba by oczywiście jeszcze zrestartować maszynę, by ten firmware został załadowany, ewentualnie przeładować moduł btusb . Można też przełączyć hardware kill switch (przełącznik sprzętowy) od WiFi/BT, który jest po prawej stronie obudowy tego ThinkPad'a. Tak czy inaczej, teraz ten firmware powinien zostać już poprawnie załadowany, co można zobaczyć w logu:

kernel: usb 1-1.4: new full-speed USB device number 7 using ehci-pci
kernel: usb 1-1.4: New USB device found, idVendor=0a5c, idProduct=21e6, bcdDevice= 1.12
kernel: usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 1-1.4: Product: BCM20702A0
kernel: usb 1-1.4: Manufacturer: Broadcom Corp
kernel: usb 1-1.4: SerialNumber: 74E54320FEA9
kernel: usb 1-1.4: Device is not authorized for usage
kernel: usb 1-1.4: authorized to connect
mtp-probe[135654]: checking bus 1, device 7: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.4"
mtp-probe[135654]: bus: 1, device: 7 was not an MTP device
mtp-probe[135657]: checking bus 1, device 7: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.4"
mtp-probe[135657]: bus: 1, device: 7 was not an MTP device
systemd[1]: Reached target bluetooth.target.
kernel: Bluetooth: hci0: BCM: chip id 63
kernel: Bluetooth: hci0: BCM: features 0x07
kernel: Bluetooth: hci0: BCM20702A
kernel: Bluetooth: hci0: BCM20702A1 (001.002.014) build 0000
kernel: bluetooth  hci0: firmware: direct-loading firmware brcm/BCM20702A1-0a5c-21e6.hcd
kernel: Bluetooth: hci0: BCM20702A1 (001.002.014) build 1757
kernel: Bluetooth: hci0: Broadcom Bluetooth Device

Z racji, że instalowaliśmy ten firmware manualnie, to trzeba pamiętać o jego aktualizacji bo jakiś czas.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.