Solucionar problemas de firmware en Linux

A pesar de los años que llevo con el XPS 13 como equipo principal, lo cierto es que hasta la fecha, no estoy seguro de haberlo utilizado en alguna ocasión. Creo que si, pero no lo se con certeza. Y no lo se, porque hace unos días intenté conectar el móvil con el ordenador, y no hubo manera de hacerlo. Estuve dando vueltas al asunto y no había manera de conectar el móvil con el bluetooth del XPS 13. Este problema ha dado origen a este artículo sobre solucionar problemas de firmware en Linux.

Yo estaba convencido de que había estado utilizando los auriculares con el bluetooth del XPS 13, pero, por lo que te comentaré mas adelante verás que no puede ser. Al ver que no podía conectar el móvil con el bluetooth del XPS 13, probé de nuevo con los auriculares, y casi con cualquier otra cosa que tuviera por casa y que se pudiera conectar con el bluetooth del XPS 13. No hubo forma.

Esto se puede solucionar, y no solo esto, sino que además pude utilizar tu ordenador como si fuera un altavoz. ¿como? Si lo que has oido.

Solucionar problemas de firmware en Linux

Solucionar problemas de firmware en Linux

Aunque el problema del bluetooth, es un problema específico del XPS13, es posible, que tu equipo tengo un problema parecido. Al final, lo importante es sacar conclusiones, del problema y como solucionarlo. En este sentido te voy a hablar sobre dmesg, una herramienta que te puede ayudar precisamente a descubrir el problema, ya sea relacionado con el bluetooth, o con cualquier otro hardware o firmware. Al final, se trata de solucionar problemas de firmware en Linux.

dmesg

dmesg diagnostic message, mensaje de diagnóstico. Se trata de una herramienta que puedes utilizar para mostrar todos aquellos mensajes relacionados con el núcleo de Linux. Se trata de una herramienta verdaderamente útil para resolver, o por lo menos intentar resolver, problemas relativos a tu hardware.

Los mensajes del kernel de Linux

Para obtener otodos los mensajes del kernel de Linux, tan solo tienes que ejecutar dmesg. Así imprimirás todos los mensajes, aunque solo verás los últimos. Para poder exprimir al máximo esta herramienta la tienes que combinar con otra. En particular, la tienes que combinar con el todopoderoso less, tal y como te comento en el artículo Menos es mas con less. Así, la instrucción a utilizar será,

dmesg | less

Filtrando mensajes de dmesg

El problema es la cantidad de mensajes que se mostrará, y que probablemente lo que consiga sea abrumarte. Así, de nuevo, lo mejor que puedes hacer es combinar dmesg. En este caso con el imprescindible grep, tal y como te comento en el tutorial sobre el terminal y en particular sobre los filtros en el terminal. Así puedes obtener diferente información,

  • dmesg | grep -i memory
  • dmesg | grep -i bluetooth
  • dmesg | grep -i usb
  • dmesg | grep -i tty

Recuerda que la opción -i en grep no distingue entre mayúsculas y minúsculas.

Por otro lado, tendrás el mismo problema que en el caso anterior, y es que solo verás las últimas entradas. Si quieres poder navegar por todos los registros, tienes que combinar de nuevo con less. Así, para el caso del bluetooth, se podría hacer algo como,

dmesg | grep -i bluetooth | less

El color ayuda

Colorear la salida de dmesg te ayudará a localizar lo que buscas. Para conseguir obtener los mensajes de salida coloreados utiliza dmesg -L. El problema lo tendrás al pasarlo a los otros filtros. Así, para mantener la salida coloreada tendras que utilizar algo como lo que puedes ver para el siguiente ejemplo, de nuevo con el bliuetooth,

dmesg -L | grep --color=always bluetooth | less -r

Es posible que esto ya empiece a ser difícil de manejar y sería interesante crear tu propia función que ayudara con esto.

Si estás siguiendo el tutorial sobre scripts en bash, en el capítulo sobre funciones, encontrarás como definir esta función de forma sencilla, y que resumo a continuación,

idmesg(){ dmesg -L | grep --color=always $1 | less -r; }

A partir de aquí es tan sencillo, como ejecutar idmesg bluetooth

Mostrar información relativa

En lugar de mostrar todos los mensajes, que como digo, puede ser realmente abrumador, es posible mostrar información relativa a determinados aspectos. Así las posibilidades que tienes son las siguientes,

  • kern
  • user
  • mail
  • daemon
  • auth
  • syslog
  • lpr
  • news

Así, la instrucción a ejecutar será, por ejemplo,

dmesg --facility=kern

Seleccionar el nivel del log

No solo puedes seleccionar la facilitiy a mostrar, sino que también es posible seleccionar el nivel del log que quieres que aparezca, con el fin de facilitarte el problema que te trae de cabeza. Así, los niveles de log soportador por dmesg son los siguientes,

  • emerg
  • alert
  • crit
  • err
  • warn
  • notice
  • info
  • debug

Por ejemplo, si lo que quieres es mostrar los registros correspondients a error y warning, tendrías que ejecutar la siguiente instrucción,

dmesg --level=err,warn

Aquí te tengo que hacer un comentario, y es que por ejemplo, en mi caso con el bluetooth, no aparece en el nivel de error, como según pienso debería de aparecer, sino que aparecía en el nivel de warning.

Si quieres ver el nivel de registro para cada una de las entradas tienes que incluir la opción -x.

Mostrar fecha y hora

Algo que seguro te puede resultar increiblemente interesante es que te muestra fecha y hora de cada uno de los mensajes, algo que por defecto no se hace. Para conseguir esto simplemente tienes que utilizar la opción -T.

Monitorización de los mensajes en tiempo real

Por último, pero no por ello menos importante, sino que mas bien todo lo contrario, tienes la opción --follow que te permite ver los mensajes que se van mostrando en tiempo real. Esta es una forma muy interesante para capturar errores al momento, y detectar justo el punto que está provocando tu quebranto.

Mi problema con el bluetooth y como solucionar problemas de firmware en Linux

Una vez ya te he contado, una potente herramienta que tienes para descubrir problemas relacionados con el kernel de Linux, toca resolver mi problema con el bluetooth.

La solución a este problema la encontré, precisamente ejecutando dmesg o mejor dmesg | grep bluetooth. Así, por ejemplo en mi caso, lo que encontré fué lo siguiente,

bluetooth hci0: Direct firmware load for brcm/BCM20702A1-0a5c-216f.hcd failed with error -2

El problema es que no encuentra el archivo /lib/firmware/brcm/BCM20702A1-0a5c-216f.hcd. Y es que al ir a ese directorio, efectivamente no está ese archivo. Buscando información en internet, lo que encontré es que el archivo se llamaba inicialmente BCM20702A0-0a5c-216f.hcd y la solución era copiarlo directamente.

Sin embargo, lo cierto es que ese archivo tampoco se encontraba en el directorio en cuestión. Una nueva búsqueda me llevó a un repositorio de GitHub, del que descargarme el archivo original. Así que, resumiendo toda la operación queda en lo que puedes ver a continuación.

wget https://github.com/hg8/bluetooth-firmware-XPS13-9343/raw/master/BCM20702A0-0a5c-216f.hcd 
sudo cp BCM20702A0-0a5c-216f.hcd /lib/firmware/brcm/
sudo cp BCM20702A0-0a5c-216f.hcd /lib/firmware/brcm/BCM20702A1-0a5c-216f.hcd  

Recargamos el módulo de bluetooth y a disfrutar

sudo modprobe -r btusb   
sudo modprobe btusb

Conclusión

Si, no tienes un DELL XPS 13, y si tu bluetooth, funciona perfectamente, probablemente, mi problema te importe muy poco, salvo lo que hayas empatizado conmigo. Sin embargo, lo importante no es el problema con el bluetooth del DELL XPS 13, si no la forma de localizar el problema.

Pero sobre todo, saber que hay un problema, porque inicialmente, yo le eché la culpa a la versión de Ubuntu, al software, al hardware, y no pensé que era un problema endémico de mi equipo.

Y lo que es mejor, no pensé que fuera un problema que fuera resoluble de una forma tan sencilla.

Así se trata, como he indicado anteriormente, se trata de extrapolar el problema que he tenido con el bluetooth de mi equipo para solucionar problemas de firmware en Linux.


Más información,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *