miércoles, 2 de mayo de 2018

¿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

13 comentarios:

  1. Gracias! ya me había rendido con mis intentos de hacer andar el bluetooth con la broadcom

    ResponderEliminar
    Respuestas
    1. Estimado Unknown:

      Es tarea de todo Justicialista hacer todo por su hermano de Nación.

      Usted ha logrado, gracias a su esfuerzo de comprensión, hacer realidad efectiva un viejo anhelo de los Trabajadores, al poder hacer andar su Bluetooth.

      De ahora en más, toda vez que enlace su dispositivo Bluetooth favorito, lanzará al cielo un estruendoso "¡viva Perón!".

      Atte.

      Juan Perón

      Eliminar
  2. Gracias esto si es ayuda de verdad funciono!!!!

    ResponderEliminar
  3. Hola, de antemano Muchas gracias por la información, pero tengo un problema, el error (-2) fue solucionado, pero ahora me aparece el siguiente error:

    Bluetooth: hci0: BCM: Reading local version info failed (-110)

    Alguna sugerencia?

    Gracias.

    ResponderEliminar
  4. Hola Muchas gracias por la información, pero tengo ahora el siguiente problema:

    Bluetooth: hci0: BCM: Reading local version info failed (-110)

    Alguna sugerencia?

    Gracias.

    ResponderEliminar
    Respuestas
    1. Estimado Scxter:

      Probablemente se deba a una versión específica de fabricante del adaptador que tienes. Por favor revisa específicamente el ID del Bluettoht. En Ubuntu podrás hacerlo con:

      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

      Revisa con exactitud el ID y el modelo. Si es el mismo que el indicado en el artículo (el de Foxconn) y aún así sigues obteniendo error, asegúrate de APAGAR el equipo antes de reiniciarlo.

      No ha sucedido que algunas implementaciones de motherboards de portátiles cuentan con la versión indicada, pero al compilar o utilizar un nuevo controlador NO LO TOMAN hasta que el sistema SE APAGA (en lugar de reiniciar). Probablemente se deba a un código de firmware incluido en un chip EEPROM de la plaquetita de Bluetooth que se carga en la memoria RAM del equipo para permitir funcionar al chip completo. Lamentablemente este procedimiento es desconocido y no documentado, pero es corriente en estas placas de Bluetooth, e impiden hacerlas completamente "libres". Siempre se necesita dicho código en EEPROM para que la plaqueta funcione, y a veces produce estos resultados extraños.

      Afortunadamente, en el caso de este modelo de BT en particular, ha funcionado adecuadamente con los equipos que lo hemos evaluado.

      Atte.

      Juan Perón

      Eliminar
  5. Cordial Saludo, Estimado Perón:

    Mis agradecimientos totales, ante magnamina, e instructivas indicaciones activándome la unidad de radio-transmisión local. Pérmitame elevar dadivas alabadoras, en señal de agradecimiento, por no más dejar a la noción del aprendizaje autónomo, del como poder dar a la esquiva diana, la satisfacción de poder desprender de los eslabones físicos, y unirme a los eslabones virtuales.... Ocasionando un enamoramiento, más hacia el software libre, y poder llenar el vacío de curiosidad que hasta hace minutos de haber, hecho esta declaración de gracias, estaba habido por entender.
    De nuevo, mil gracias.
    Makubexx

    ResponderEliminar
    Respuestas
    1. Estimado Makybexx:

      Nos han osado plantear que el software tiene requerimientos de hardware. Pero hemos comprendido que el verdadero valor es el que da en el corazón la Felicidad de los Hombres y Mujeres de Bien. Nunca hemos de cejar en dar la Lucha que la liberación del Pueblo y de su software, que ha de ser nuestro verdadero objetivo en pos de el futuro esplendoroso que anhelamos.

      Su Bluetooth modula el cariño del Pueblo. A él me debo, y dedico todas mis horas de esfuerzo. De ahora en más, toda vez que establezca una conexión con un dispositivo, lo peronizará, y podrá gritar al cielo un estruendoso "¡Viva Perón!". Reciba un abrazo muy afectuoso,

      Atte.,

      Juan Perón

      Eliminar
  6. Luego de tres años sumido en la tristeza de tener que usar mi laptop sin bluetooth hoy puedo hacer encontrar mis dispositivos sin necesidad de un cable. Gracias General!!! Esto realmente funciona.

    ResponderEliminar
    Respuestas
    1. Estimado Anónimo:

      De ahora en más, toda vez que conecte un dispositivo por Bluetooth podrá gritar al cielo un estruendoso "Viva Perón!".

      Atte.

      Juan Perón

      Eliminar
  7. Che juancito, vos sabes que con lsusb no me tira la data del chip. Buque en internet y usando
    lspci -knn | grep Net -A2; lsusb
    me tira una linea que dice
    Network controller [0280]: Broadcom Corporation BCM43142 802.11b/g/n [14e4:4365] (rev 01)
    Subsystem: Lenovo Device [17aa:0611]
    No se si ese número será el ID, lo busqué pero no está en el repositorio de github.
    Alguna idea de como buscar el driver que necesito?
    Gracia por el blog

    ResponderEliminar
    Respuestas
    1. En https://github.com/winterheart/broadcom-bt-firmware podrá encontrar el firmware necesario. Sin embargo, deberá buscar el device 17aa:0511 (está en el controlador). Simplemente altere la parte en color indicada por este comando por el que correspondería a su versión de chipset y debería funcionar.

      Tenga presente que a partir del kernel 5.8 de Linux, este controlador debería estar integrado, y ya no debería necesitar instalar "a mano" controlador alguno.

      Actualice el kernel de su ubuntu mediante:

      sudo apt get update
      sudo apt get upgrade

      Atte.

      Juan Perón

      Eliminar
  8. Excelente! Me había dado por vencido, pero muchas gracias! Ahora anda

    ResponderEliminar