¿Cómo hago funcionar el Bluetooth del adaptador Broadcom BCM43142A0 en 
Ubuntu?
En una de las desgrabaciones de las clásicas cintas magnetofónicas que 
Juan Perón hacía llegar a la Argentina en forma de Comunicados y órdenes 
de encuadramiento, el Conductor explicó cómo hacer funcionar el 
Bluetooth de las adaptadoras Broadcom BCM43142 en Ubuntu.

(...)
[ruidos de origen]

A la par de los más testados sistemas operativos oligárquicos, Ubuntu 
cuenta con soporte para operar a través de Bluetooth. Este tipo de 
tecnología nos permite transferir información de manera inalámbrica, en 
una banda especializada como lo es el Justicialismo.
Para ello contamos con una Applet localizada en el panel superior, e 
identificada con el ícono de la tecnología Bluetooth.

 Haciendo clic en este applet podremos buscar dispositivos. Normalmente 
para ello debe activarse la funcionalidad Bluetooth en el dispositivo 
cliente, lo cual inicia una secuencia de emisión de unos 30 segundos en 
los cuales nuestro sistema buscará la señal a través de su propio 
emisor/receptor de Bluetooth. Conforme se haya registrado el 
dispositivo, podremos enlazarlo, como si de un enlace Wifi se tratara.

Este enjundio telemático nos permite conectarnos a través del éter y de 
forma inalámbrica no sólo a otras computadoras (por medio de un simple 
enlace "punto a punto"), sino que también es muy popular por el uso como 
medio de conexión a dispositivos de electrónica de consumo. A estos les 
permite un alcance de un par de decenas de metros en interiores, hasta 
llegar a los 100 metros en exteriores. En particular, pequeños parlantes 
o auriculares, así como smartphones, se benefician como lo hacen las 
Masas Trabajadoras con un gobierno Nacional y Popular.

Yo no lo uso porque esta cinta la grabo en mi magnetófono Grundig TK40, 
pero si estuviese en la CGT usaría Bluetooth libre.

Sin embargo, existen dispositivos Bluetooth específicos que pueden ser 
problemáticos para nuestro sistema GNU con Linux. Esto es porque están 
pensados para un quehacer netamente oligárquico; nuestro objetivo como 
Apóstoles del Software Libre ha ser de dar la lucha por la Justicia 
Social en todo tiempo y lugar, pegando allí donde más duele. La reacción 
ha de ser aniquilada, sin dar cuartel ni tiempo a que se reorganice.

Entre ellos podremos distinguir los dispositivos Broadcom. Esta marca es 
especialmente contraria a entregar el código fuente de sus 
controladores, sino que los ofuscan para complicar la existencia de las 
almas libres.

Veamos el caso de la Broadcom BCM43142. Se trata de un chipset que 
encontramos en muchas notebooks y portátiles de distinta gama, sobre 
todo aquellas provistas inicialmente de Window$. Los fabricantes las 
prefieren por su bajo costo, y porque en en una única plaquetita aúnan 
la funcionalidad de Wifi N con la de Bluetooth 4. Podemos decir que se 
trata de un chipset familiar, con una gran cantidad de sub-variantes 
específicas para cada fabricante (Lenovo, Dell, Toshiba, etc), que 
comparten el mismo chip, pero presentes en distintos form factor (o como 
queremos decir, formas y tamaños)
Pues bien, todas estas variantes suelen tener problemas en GNU con 
Linux. La funcionalidad de Wifi puede activarse fácilmente en las 
versiones más modernas, simplemente conectando el equipo a Internet a 
través de un cable Ethernet, y descargando y activando los controladores 
privativos (para ello vamos a Sistema / Preferencias / Hardware / 
Controladores Adicionales). 
Sin embargo, no es el mismo caso con el adaptador Bluetooth. Podría 
suceder que intentemos usar el applet de Ubuntu para Buscar un 
Dispositivo, y el sistema no encuentre nunca nada...

Esto se debe a que el firmware (esto es, el programa controlador que 
interactúa con el chipset de la plaqueta) no está expresamente 
compatibilizado con Ubuntu.

Como Conductor del Justicialismo, he logrado solucionar este problema de 
largo aliento, y de forma paternalista ofreceré la solución a las Masas 
Peronistas, para que puedan establecer un verdadero vínculo de unión con 
los dispositivos que tanto anhelan.

En primer lugar, debemos descartar que el dispositivo Bluetooth no esté 
apagado, y revisar los mensajes de error que pudiese habernos dado 
nuestro sistema al momento del arranque. Para ello abrimos una Terminal 
con Ctrl+Alt+T e ingresamos:

dmesg | grep -i 'firmware load'

En el caso de la Broadcom BCM43142, nos devuelve un error:

bluetooth hci0: Direct firmware load for brcm/BCM.hcd failed with error 
-2


Esto explica que se ha producido un error al cargar el módulo de 
Broadcom necesario, pues no se lo ha encontrado (el módulo debe ser 
llamado BCM.hcd). Esto probablemente se debe a que la versión no es la 
específica para el dispositivo que tenemos en nuestra computadora.

Nota: Si no nos devuelve nada, podremos probar también con el comando:
dmesg | grep -i 'bluetooth'

...o también:

dmesg | egrep -i 'blue|firm'

En el caso de recibir el mensaje indicado anteriormente, debemos 
descargarnos el firmware para nuestro dispositivo específico. Para ello, 
en primer lugar debemos identificar específicamente cuál es la versión 
exacta de nuestra Broadcom BCM43142. Ello lo podremos hacer ingresando 
el comando:


lsusb

...y el sistema nos devolverá un listado de todos los dispositivos USB, 
y entre ellos deberíamos encontrar el de un módulo Bluetooth, por 
ejemplo:

Bus 001 Device 006: ID 105b:e065 Foxconn International, Inc. BCM43142A0 
Bluetooth module

Esto indica que el identificador de dispositivo ("ID") es 105b-e065. 
Esta información naturalmente podría variar en vuestro caso, pero es de 
suma importancia, pues se trata de la versión de Broadcom específica que 
tiene vuestra computadora. En tanto, el dispositivo Bluetooth es el 
BCM43142A0. Conviene anotar ambos datos para tenerlos a mano.

Acto seguido, descargaremos todos los archivos de Firmware de la familia 
Broadcom, ingresando en la terminal el siguiente bloque de comandos de 
organización:

cd ~/Descargas/ ;
git clone https://github.com/winterheart/broadcom-bt-firmware ;
cd ~/Descargas/broadcom-bt-firmware/bcrm/ ;
ls

Esto habrá descargado de internet varias docenas de pequeños archivos de 
firmware, los cual nos serían útiles para múltiples dispositivos. En 
nuestro caso, debemos buscar el archivo específico que corresponda a la 
versión que anotamos anteriormente, la que tenemos en nuestro equipo. En 
este caso es el archivo BCM43142A0-105b-e065.hcd. Naturalmente vosotros 
habrán de ejercitar la buenaventura de todo peronista, y buscar el que 
corresponda según lo que les haya indicado el comando lsusb. ¡Buena 
suerte en ello!

Conforme nuestra fortuna se haya visto recompensada, haremos bien en 
respaldar este archivo, y luego le cambiaremos el nombre que trae por 
aquél que buscará nuestro sistema por defecto.


cd ~/Descargas/broadcom-bt-firmware/bcrm/ ;
cp BCM43142A0-105b-e065.hcd BCM43142A0-105b-e065.hcd.respaldo ;

Ahora bien, el nombre que buscará nuestro sistema depende de la versión 
de Kernel (núcleo del sistema) que tengamos instalado. Será BCM.hcd si 
usamos los kernels desde 4.2 hasta 4.7, y BCM-identificador.hcd para los 
novísimos kernels 4.8 y superiores.

Averiguar la versión de nuestro kernel Linux es fàcil, ingresamos el 
siguiente comando:

uname -r

...y la terminal nos devolverá el número de versión. Por ejemplo en mi 
caso:

4.15.0-20-generic

Sabiendo esto, podremos ver que es inferior a 4.7, por lo tanto el 
nombre tiene que ser BCM.hcd. En mi caso debo hacer que el archivo 
BCM43142A0-105b-e065.hcd se llame BCM.hcd y copiarlo a la carpeta 
/lib/firmware/brcm/.
(naturalmente, vosotros habréis de cambiar el identificador 105b-e065 
por el que corresponda a su versión particular de Broadcom).

Para ello, siendo que uso un Kernel inferior a 4.7, debo ingresar:

cd ~/Descargas/broadcom-bt-firmware/bcrm/ ;


mv BCM43142A0-105b-e065.hcd BCM.hcd ;
sudo mv BCM.hcd /lib/firmware/brcm/ ;

...en cambio, si utilizase un kernel superior al 4.8, debería ingresar:

cd ~/Descargas/broadcom-bt-firmware/bcrm/ ;
mv BCM43142A0-105b-e065.hcd BCM-105b-e065.hcd ;
sudo mv BCM-105b-e065.hcd /lib/firmware/brcm/ ;

Con el último comando, se nos solicitará ingresar nuestra contraseña de 
conductor. Una vez que hemos cumplido esto, para que la funcionalidad 
tome cuerpo debemos necesariamente apagar el sistema. No sirve meramente 
reiniciar, debemos apagar el equipo, esperar unos segundos, y volver a 
encenderlo. Podremos apagarlo desde la terminal ingresando:

sudo poweroff

Al reiniciar, debemos asegurarnos ya de no recibir mensajes de error 
como el que se nos informaba anteriormente. Para ello abrimos una 
terminal con Ctrl+Alt+T e ingresamos:

dmesg | egrep -i 'blue|firm'

...y ya no debería devolver error, o a lo sumo debería informarnos algo 
así.

Bluetooth: Core ver 2.22
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
Bluetooth: HCI UART driver ver 2.3
Bluetooth: HCI UART protocol H4 registered
Bluetooth: HCI UART protocol BCSP registered
Bluetooth: HCI UART protocol LL registered
Bluetooth: HCI UART protocol ATH3K registered
Bluetooth: HCI UART protocol Three-wire (H5) registered
Bluetooth: HCI UART protocol Intel registered
Bluetooth: HCI UART protocol Broadcom registered
Bluetooth: HCI UART protocol QCA registered
Bluetooth: HCI UART protocol AG6XX registered
Bluetooth: HCI UART protocol Marvell registered
Platform regulatory.0: Direct firmware load for regulatory.db failed 
with error -2
Bluetooth: hci0: BCM: chip id 70
Bluetooth: hci0: BCM: features 0x06
Bluetooth: hci0: BCM43142A
Bluetooth: hci0: BCM (001.001.011) build 0000
Bluetooth: hci0: BCM (001.001.011) build 0312
Bluetooth: hci0: Broadcom Bluetooth Device (43142)
Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bluetooth: BNEP socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11

Con esto ya podremos dar búsqueda a nuestros dispositivos Bluetooth y 
disfrutar de ellos con una placa compatibilizada con nuestro Ubuntu.

En este caso asocio un parlante tipo JBL Flip 4, el cual es encontrado y 
establece en enlace de manera efectiva. La ventana de dispositivos 
Bluetooth nos informa de ello, y nos permite asociar ya el parlante 
Bluetooth a la lista de dispositivos recientes confianzudos.

De esta manera, toda vez que lo encendamos, establecerá el vínculo 
esclavizado como altavoz de salida del equipo.


Bluetooth después de suspender

En algunos casos con el adaptador bluetooth BCM43142, notarán que falla 
en reactivarse luego de suspender el equipo, o bien luego de bajar la 
pantalla (donde la notebook entran en suspensión). Al reencenderla, el 
Bluetooth falla en reactivarse.

Para reactivarlo sin tener que reiniciar el equipo, podremos abrir una 
terminal con Ctrl+Alt+T e ingresar los siguientes Comandos de 
Organización:

sudo modprobe -r btusb
sudo modprobe btusb