-
Convertir un módulo EM7455 de Lenovo en uno genérico
Si tienes un módulo 4G/LTE de Sierra Wireless que has sacado de un portátil Lenovo (1199:9079), te interesará convertirlo a uno genérico, para poder utilizarlo en ordenadores de otras marcas.
Para realizar este hack necesitaremos algunas
HERRAMIENTAS
Para Windows
1 – Los últimos controladores genéricos de Sierra Wireless disponibles para Windows. Desinstala cualquier driver anterior que pueda haber instalado en Windows, descarga los últiomos drivers genéricos de Sierra Wireless desde aquí, e instálalos.
2 – El último firmware GENERIC disponible para el módulo. Descarga el exe con la última actualización desde aquí, pero no la ejecutes hasta que te lo notifique en la parte de «Procedimiento»
Para Ubuntu
1 – El último firmware GENERIC disponible para el módulo. Descarga el zip de los Linux Binaries desde aquí, descomprímelo y guarda los dos archivos en /home/tunombre/EM7455
2 – El script en perl de ThinkPenguin para poder intercambiar entre los distintos modos del módem (6,8 y 9, QMI NMEA, MBIM NMEA y sólo NBIM, respectivamente):
wget https://www.thinkpenguin.com/files/em7455-modem-software/swi_setusbcomp.pl -O ~/EM7455/swi_setusbcomp.pl
3 – Las dependencias para poder ejecutar dicho script
apt-get -y install libuuid-tiny-perl libipc-shareable-perl
4 – La herramienta minicom (también podría usarse picocom o similares) para poder conectarnos al puerto serie del módem del módulo.
apt-get -y install minicom
5 – Los scripts para pasarle al minicom:
Script para borrar el firmware:
echo 'send AT' > ~/EM7455/Serial-Firmware-Clean.txt echo 'send AT!ENTERCND=\"A710\"' >> ~/EM7455/Serial-Firmware-Clean.txt echo 'send AT!IMAGE=0' >> ~/EM7455/Serial-Firmware-Clean.txt echo 'expect "OK"' >> ~/EM7455/Serial-Firmware-Clean.txt echo 'send AT!IMAGE?' >> ~/EM7455/Serial-Firmware-Clean.txt echo 'expect "OK"' >> ~/EM7455/Serial-Firmware-Clean.txt
El script para poner el nuevo ID:
echo 'print " Intentando inyectar id..."' > ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!ENTERCND=\"A710\"' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!USBPID=9071,9070' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!USBVID=1199' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!USBPRODUCT=\"Sierra Wireless WWAN EM7455 LTE-A\"' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!PRIID=\"vPriPN\",\"vPriRev\",\"Generic-Laptop\"' >> ~/EM7455/Serial-Set-ID.txt echo '#send AT!GOBISETIMAGEPREF="vFirmware","GENERIC","vConfig"' >> ~/EM7455/Serial-Set-ID.txt echo '#send AT!SETIMAGEPREF="vFirmware","GENERIC","vConfig"' >> ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'print " Comprobando que los cambios se han guardado..."' >> ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!USBVID?' >> ~/EM7455/Serial-Set-ID.txt echo 'expect "OK"' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!USBPID?' >> ~/EM7455/Serial-Set-ID.txt echo 'expect "OK"' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!USBPRODUCT?' >> ~/EM7455/Serial-Set-ID.txt echo 'expect "OK"' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!PRIID?' >> ~/EM7455/Serial-Set-ID.txt echo 'expect "OK"' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!GOBIIMPREF?' >> ~/EM7455/Serial-Set-ID.txt echo 'expect "OK"' >> ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'print " Reseteando el modem..."' >> ~/EM7455/Serial-Set-ID.txt echo 'print " "' >> ~/EM7455/Serial-Set-ID.txt echo 'send AT!RESET' >> ~/EM7455/Serial-Set-ID.txt
El script en bash para calcular el PRIID_PN y el PRIID_REV a partir de los dos archivos de firmware descargados y poder modificar el script de arriba con los IDs correctos. Simplemente crea un script llamado ~/EM7455/ModificarScriptID.sh con este texto:
#!/bin/bash SWI9X30C_CWE=$(find . -maxdepth 1 -type f -iregex '.*SWI9X30C[0-9_.]+\.cwe' | cut -c 3- | tail -n1) SWI9X30C_NVU=$(find . -maxdepth 1 -type f -iregex '.*SWI9X30C[0-9_.]+generic[0-9_.]+\.nvu' | cut -c 3- | tail -n1) AT_PRIID_STRING=$(strings "$SWI9X30C_NVU" | grep '^9999999_.*_SWI9X30C_' | sort -u | head -1) AT_PRIID_PN="$(echo "$AT_PRIID_STRING" | awk -F'_' '{print $2}')" AT_PRIID_REV="$(echo "$AT_PRIID_STRING" | grep -Eo '[0-9]{3}\.[0-9]{3}')" vFirmware=$(echo $SWI9X30C_CWE | cut -d'_' -f2 | sed 's-.cwe--g') vConfig=$(echo $AT_PRIID_STRING | sed 's-_GENERIC-*GENERIC-g' | cut -d'*' -f2) sed -i -e "s-vPriPN-$AT_PRIID_PN-g" ~/EM7455/Serial-Set-ID.txt sed -i -e "s-vPriRev-$AT_PRIID_REV-g" ~/EM7455/Serial-Set-ID.txt sed -i -e "s-vFirmware-$vFirmware-g" ~/EM7455/Serial-Set-ID.txt sed -i -e "s-vConfig-$vConfig-g" ~/EM7455/Serial-Set-ID.txt
…y dale permisos de ejecución.
Como extra, puedes crear este script para hacer Query de todo:
echo 'send AT' > ~/EM7455/Serial-Query-All.txt echo 'send AT!ENTERCND=\"A710\"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!IMAGE?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!IMPREF?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!GOBIIMPREF?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!USBVID?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!USBPID?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!USBPRODUCT?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!PRIID?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!BAND?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!BAND=?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!PCINFO?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt echo 'send AT!CUSTOM?' >> ~/EM7455/Serial-Query-All.txt echo 'expect "OK"' >> ~/EM7455/Serial-Query-All.txt
.
6 – La herramienta qmicli para actualizar el firmware a la última versión:
apt-get -y install libqmi-glib5 libqmi-proxy libqmi-utils
.
PROCEDIMIENTO
Detenemos ModemManager, ejecutando:
sudo systemctl stop ModemManager
Ponemos el modem en modo QMI, ejecutando:
sudo perl ~/EM7455/swi_setusbcomp.pl --usbcomp=6
Desconectamos el modem y lo volvemos a conectar, con:
sudo qmicli --device=/dev/cdc-wdm0 --device-open-proxy --device-open-mbim --dms-set-operating-mode=offline sudo qmicli --device=/dev/cdc-wdm0 --device-open-proxy --device-open-mbim --dms-set-operating-mode=reset
Esperamos 30 segundos a que el módem se ponga operativo de nuevo. Lo comprobamos, con:
sudo qmicli --device=/dev/cdc-wdm0 --device-open-proxy --device-open-qmi --dms-get-operating-mode
El resultado debería ser «low power».
Limpiamos la imagen, ejecutando:
sudo minicom -b 115200 --device /dev/ttyUSB2 -S ~/EM7455/Serial-LimpiarFirmware.txt
Salimos de minicom con Ctrl+A, x, Enter.
Ejecutamos el script de bash para modificar el PriID del script para minicom, con:
cd ~/EM7455/ ./ModificarScriptID.sh
Se nos habrá modificado el script ~/EM7455/Serial-SetID.txt y ya lo podremos ejecutar con minicom. Lo hacemos con:
sudo minicom -b 115200 --device /dev/ttyUSB2 -S ~/EM7455/Serial-Set-ID.txt
Salimos de minicom con Ctrl+A, x, Enter.
Esperamos 30 segundos y ejecutamos el script de Query, con minicom, para ver si los cambios se han guardado correctamente:
sudo minicom -b 115200 --device /dev/ttyUSB2 -S ~/EM7455/Serial-Query.txt
sudo qmi-firmware-update –reset -d «/dev/cdc-wdm0»
qmi-firmware-update –reset -d «/dev/cdc-wdm0»
get_modem_bootloader_deviceid
qmi-firmware-update –update-download -d «/dev/cdc-wdm0» «$SWI9X30C_CWE» «$SWI9X30C_NVU»
Los hacks de hacks4geeks son minitutoriales rápidos pensados para geeks con conocimiento informático avanzado. Si no entiendes o no consigues ejecutar un hack de esta web considera suscribirte a Premium para solicitar asistencia sobre el mismo.