schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1924 Location: Schweiz
|
Posted: Mon Jan 05, 2015 8:09 pm Post subject: Bluetooth mit Broadcom BCM43142 |
|
|
Das hier soll eine Art Blog über dieses Erlebnis werden und möglicherweise anderen Helfen die über das selbe Problem stolpern.
Vor einiger Zeit habe ich mir einen neuen Laptop (ThinkPad Edge E545) gekauft der leider ein etwas problematisches WLAN/Bluetooth-Modul (Broadcom BCM43142) hat welches sich dank einer Whitelist im BIOS nicht durch ein anderes ersetzen lässt. Sowohl für das WLAN als auch für Bluetooth liefert der Linux-Kernel keinen funktionierenden Treiber. Zum Glück gibt es aber im Portage-Tree einen Treiber für WLAN (net-wireless/broadcom-sta) was diesen Teil des Problems recht schnell löste. Doch um auch den Bluetooth-Teil zum laufen zu bekommen war schon etwas mehr nötig, unter anderem das lesen etlicher Bugreports und Blogs von denen die meisten englischsprachig waren.
Der Kern des Problems ist hier wohl die Firmware oder die damit verbundenen Lizenzgeschichten seitens Broadcom und die Weigerung der Bluetooth-Devs sich damit auseinander zu setzen. Infolge dessen bietet der Kernel normalerweise keinen Support für dieses Modul an und man muss ihn erst zur Mitarbeit "überreden".
Inzwischen gibt es dazu auch einen Bugreport: https://bugzilla.kernel.org/show_bug.cgi?id=73411
Hier die Lösung auf Deutsch:
Um das Modul erfolgreich benutzen zu können muss man erst mal herausfinden welche Firmware geladen werden soll, und um das zuverlässig herauszufinden führt kein Weg an einer (zumindest vorübergehenden) Installation von Windows vorbei. Sobald ein Windows vorhanden und der Originaltreiber von Broadcom installiert ist lässt es sich in den Treibereinstellungen erkennen welche Firmware der Chip benötigt (siehe Bild). Diese Firmware muss dann von der Festplatte kopiert und mit dem Tool hex2hcd in ein für den Linux-Kernel passendes Format konvertiert werden.
[*]ACHTUNG: Das verändern des Kernel ist inzwischen nicht mehr notwendig aber die passende Firmware wird immer noch benötigt.
Nun muss man dem Kernel-Treiber noch beibringen mit dem Device richtig umzugehen und auch die Firmware zu laden. Dazu habe ich einen Patch erstellt bei dem je nach Situation nur noch die Device-ID angepasst werden muss:
Code: | --- drivers/bluetooth/btusb.c 2014-12-16 18:39:45.000000000 +0100
+++ drivers/bluetooth/btusb.c 2015-01-05 19:28:52.472361091 +0100
@@ -107,6 +107,9 @@ static const struct usb_device_id btusb_
{ USB_DEVICE(0x0b05, 0x17cb) },
{ USB_DEVICE(0x413c, 0x8197) },
+ /* Broadcom BCM43142A0 */
+ { USB_DEVICE(0x04ca, 0x2007), .driver_info = BTUSB_BCM_PATCHRAM },
+
/* Foxconn - Hon Hai */
{ USB_VENDOR_AND_INTERFACE_INFO(0x0489, 0xff, 0x01, 0x01) }, |
[*]ACHTUNG: Bei neueren Kernelversionen muss die Firmware mit dem Namen "BCM.hcd" abgelegt werden.
Danach kopiert man die Firmware noch an den rechten Ort "/lib/firmware/brcm/BCM43142A0-04ca-2007.hcd" im Dateisystem und schon sollte auch Bluetooth funktionieren.
Ich selbst habe bis jetzt folgendes erfolgreich getestet:
- Geräte suchen/finden
- Geräte verbinden
- OBEX Dateitransfer
- Audio Übertragung (Boxen, und Headsets)
- PAN-Netzwerkverbindungen (Bluetooth-Tethering)
Hoffentlich hilft das anderen weiter und für eine Diskussion bezüglich dieser ziemlich ärgerlichen Sache bin ich auch zu haben. Hier noch ein par Infos zu meinem Modul:
Code: | 02:00.0 Network controller: Broadcom Corporation BCM43142 802.11b/g/n (rev 01)
Subsystem: Lenovo Device 0611
Flags: bus master, fast devsel, latency 0, IRQ 17
Memory at f0200000 (64-bit, non-prefetchable) [size=32K]
Capabilities: <access denied>
Kernel driver in use: wl
Kernel modules: wl |
Code: | Bus 008 Device 002: ID 04ca:2007 Lite-On Technology Corp.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 1
bDeviceProtocol 1
bMaxPacketSize0 64
idVendor 0x04ca Lite-On Technology Corp.
idProduct 0x2007
bcdDevice 1.12
iManufacturer 1 Broadcom Corp
iProduct 2 BCM43142A0
iSerial 3 B8EE6592A390
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 218
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
Device Status: 0x0001
Self Powered |
_________________ Lenovo - ThinkPad P16s Gen 2 - 21K9CTO1WW |
|