%PDF- %PDF-
Direktori : /usr/share/ModemManager/fcc-unlock.available.d/ |
Current File : //usr/share/ModemManager/fcc-unlock.available.d/105b:e0c3 |
#!/bin/sh # SPDX-License-Identifier: CC0-1.0 # 2021 Aleksander Morgado <aleksander@aleksander.es> # 2022 Thilo-Alexander Ginkel <thilo@ginkel.com> # 2022 Bjørn Mork <bjorn@mork.no> # # Foxconn SDX55 (Lenovo T99W175) FCC unlock operation # # The script will first try to unlock the WWAN modem using the new (hash-based) # v2 method and fall back to the old (v1) method if that fails # # require program name and at least 2 arguments [ $# -lt 2 ] && exit 1 # first argument is DBus path, not needed here shift # second and next arguments are control port names for PORT in "$@"; do # match port type in Linux 5.14 and newer grep -q MBIM "/sys/class/wwan/$PORT/type" 2>/dev/null && { MBIM_PORT=$PORT break } # match port name in Linux 5.13 echo "$PORT" | grep -q MBIM && { MBIM_PORT=$PORT break } done # fail if no MBIM port exposed [ -n "$MBIM_PORT" ] || exit 2 log_v2_failure() { echo "$1. Falling back to old unlock method" >&2 } FIRMWARE_VERSION=$(qmicli --device-open-proxy --device="/dev/$MBIM_PORT" \ --dms-foxconn-get-firmware-version=firmware-mcfg \ | grep "Version:" \ | grep -o "'.*'" \ | sed "s/'//g" \ | sed -e 's/\.[^.]*\.[^.]*$//') if [ -n "${FIRMWARE_VERSION}" ]; then FIRMWARE_APPS_VERSION=$(qmicli --device-open-proxy --device="/dev/$MBIM_PORT" \ --dms-foxconn-get-firmware-version=apps \ | grep "Version:" \ | grep -o "'.*'" \ | sed "s/'//g") if [ -n "${FIRMWARE_APPS_VERSION}" ]; then IMEI=$(qmicli --device-open-proxy --device="/dev/$MBIM_PORT" --dms-get-ids \ | grep "IMEI:" \ | grep -o "'.*'" \ | sed "s/'//g") if [ -n "${IMEI}" ]; then SALT="salt" # use a static salt for now MAGIC="foxc" HASH="${SALT}$(printf "%s%s%s%s%s" "${FIRMWARE_VERSION}" \ "${FIRMWARE_APPS_VERSION}" "${IMEI}" "${SALT}" "${MAGIC}" \ | md5sum \ | head -c 32)" else log_v2_failure "Could not determine SDX55 IMEI" fi else log_v2_failure "Could not determine SDX55 firmware apps version" fi else log_v2_failure "Could not determine SDX55 firmware version" fi UNLOCK_RESULT=1 if [ -n "${HASH}" ]; then qmicli --device-open-proxy --device="/dev/$MBIM_PORT" \ --dms-foxconn-set-fcc-authentication-v2="${HASH},48" UNLOCK_RESULT=$? if [ $UNLOCK_RESULT -ne 0 ]; then log_v2_failure "SDX55 FCC unlock v2 failed" fi fi if [ $UNLOCK_RESULT -ne 0 ]; then qmicli --device-open-proxy --device="/dev/$MBIM_PORT" \ --dms-foxconn-set-fcc-authentication=0 UNLOCK_RESULT=$? if [ $UNLOCK_RESULT -ne 0 ]; then echo "SDX55 FCC unlock v1 failed" >&2 fi fi exit $UNLOCK_RESULT