• 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»


    Deja una respuesta