15acd86d60
Also fix configuring device sleep wakeup when modem receives a call
123 lines
2.8 KiB
Bash
123 lines
2.8 KiB
Bash
#!/bin/sh
|
|
|
|
log() {
|
|
echo "$@" | logger -t "postmarketOS:modem-setup"
|
|
}
|
|
|
|
# Current modem routing
|
|
#
|
|
# 1 - Digital PCM
|
|
# 0 - I2S master
|
|
# 0 - Primary mode (short sync)
|
|
# 2 - 512kHz clock (512kHz / 16bit = 32k samples/s)
|
|
# 0 - 16bit linear format
|
|
# 1 - 16k sample/s
|
|
# 1 - 1 slot
|
|
# 1 - map to first slot (the only slot)
|
|
#
|
|
QDAI_CONFIG="1,0,0,2,0,1,1,1"
|
|
QCFG_RISIGNALTYPE_CONFIG="physical"
|
|
QMBNCFG_CONFIG="1"
|
|
QCFG_IMS_CONFIG="1"
|
|
|
|
if [ -z "$1" ]
|
|
then
|
|
DEV="/dev/EG25.AT"
|
|
else
|
|
DEV="$1"
|
|
fi
|
|
|
|
# When running this script from udev the modem might not be fully initialized
|
|
# yet, so give it some time to initialize
|
|
#
|
|
# We'll try to query for the firmware version for 15 seconds after which we'll
|
|
# consider the initialization failed
|
|
|
|
log "Waiting for the modem to initialize"
|
|
INITIALIZED=false
|
|
for second in $(seq 1 15)
|
|
do
|
|
if echo "AT+QDAI?" | atinout - $DEV - | grep -q OK
|
|
then
|
|
INITIALIZED=true
|
|
break
|
|
fi
|
|
|
|
log "Waited for $second seconds..."
|
|
|
|
sleep 1
|
|
done
|
|
|
|
if $INITIALIZED
|
|
then
|
|
log "Modem initialized"
|
|
else
|
|
log "Modem failed to initialize"
|
|
exit 1
|
|
fi
|
|
|
|
# Read current config
|
|
QDAI_ACTUAL_CONFIG=$(echo "AT+QDAI?" | atinout - $DEV -)
|
|
QCFG_RISIGNALTYPE_ACTUAL_CONFIG=$(echo 'AT+QCFG="risignaltype"' | atinout - $DEV -)
|
|
QMBNCFG_ACTUAL_CONFIG=$(echo 'AT+QMBNCFG="AutoSel"' | atinout - $DEV -)
|
|
QCFG_IMS_ACTUAL_CONFIG=$(echo 'AT+QCFG="ims"' | atinout - $DEV -)
|
|
|
|
if echo $QDAI_ACTUAL_CONFIG | grep -q $QDAI_CONFIG && \
|
|
echo $QCFG_RISIGNALTYPE_ACTUAL_CONFIG | grep -q $QCFG_RISIGNALTYPE_CONFIG && \
|
|
echo $QMBNCFG_ACTUAL_CONFIG | grep -q $QMBNCFG_CONFIG && \
|
|
echo $QCFG_IMS_ACTUAL_CONFIG | grep -q $QCFG_IMS_CONFIG
|
|
then
|
|
log "Modem already configured"
|
|
exit 0
|
|
fi
|
|
|
|
# Modem not configured, we need to send it the digital interface configuration,
|
|
# then reboot it
|
|
|
|
# Configure audio
|
|
RET=$(echo "AT+QDAI=$QDAI_CONFIG" | atinout - $DEV -)
|
|
|
|
if ! echo $RET | grep -q OK
|
|
then
|
|
log "Failed to configure audio: $RET"
|
|
exit 1
|
|
fi
|
|
|
|
# Configure ring device
|
|
RET=$(echo "AT+QCFG=\"risignaltype\",\"$QCFG_RISIGNALTYPE_CONFIG\"" | atinout - $DEV -)
|
|
|
|
if ! echo $RET | grep -q OK
|
|
then
|
|
log "Failed to configure modem ring wakeup: $RET"
|
|
exit 1
|
|
fi
|
|
|
|
# Configure VoLTE auto selecting profile
|
|
RET=$(echo "AT+QMBNCFG=\"AutoSel\",$QMBNCFG_CONFIG" | atinout - $DEV -)
|
|
|
|
if ! echo $RET | grep -q OK
|
|
then
|
|
log "Failed to enable VoLTE profile auto selecting: $RET"
|
|
exit 1
|
|
fi
|
|
|
|
# Enable VoLTE
|
|
RET=$(echo "AT+QCFG=\"ims\",$QCFG_IMS_CONFIG" | atinout - $DEV -)
|
|
|
|
if ! echo $RET | grep -q OK
|
|
then
|
|
log "Failed to enable VoLTE: $RET"
|
|
exit 1
|
|
fi
|
|
|
|
# Reset module
|
|
# 1 Set the mode to full functionality (vs 4: no RF, and 1: min functionality)
|
|
# 1 Reset the modem before changing mode (only available with 1 above)
|
|
#
|
|
RET=$(echo "AT+CFUN=1,1" | atinout - $DEV -)
|
|
|
|
if ! echo $RET | grep -q OK
|
|
then
|
|
log "Failed to reset the module: $RET"
|
|
exit 1
|
|
fi
|