133 lines
3.4 KiB
Bash
133 lines
3.4 KiB
Bash
#!/system/bin/sh
|
|
ESIM_SVC="vendor.oplus.hardware.esim.IOplusEsim/default"
|
|
SUB_SVC="vendor.oplus.hardware.subsys_interface.subsys_radio.ISubsysRadio/slot1"
|
|
LOG=/data/adb/euicc_daemon.log
|
|
M1="i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 1"
|
|
M2="i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 2"
|
|
|
|
log() { echo "$(date '+%F %T') $*" >> "$LOG"; }
|
|
|
|
if [ -f "$LOG" ] && [ "$(wc -c < "$LOG" 2>/dev/null)" -gt 262144 ]; then
|
|
tail -c 65536 "$LOG" > "$LOG.tmp" && mv "$LOG.tmp" "$LOG"
|
|
fi
|
|
|
|
gpio_state() {
|
|
service call "$ESIM_SVC" 1 2>/dev/null | grep -oE '[0-9a-f]{8} [0-9a-f]{8}' | head -1 | awk '{print $2}'
|
|
}
|
|
|
|
gpio_on() {
|
|
service call "$ESIM_SVC" 5 i32 0 >/dev/null 2>&1
|
|
service call "$SUB_SVC" 289 i32 91 i32 1 >/dev/null 2>&1
|
|
service call "$ESIM_SVC" 3 i32 1 >/dev/null 2>&1
|
|
service call "$ESIM_SVC" 5 i32 1 >/dev/null 2>&1
|
|
}
|
|
|
|
esim_detected() {
|
|
dumpsys isub 2>/dev/null | grep -c 'simSlotIndex=1 portIndex=0 isEmbedded=1'
|
|
}
|
|
|
|
card_up() {
|
|
logcat -d -b radio 2>/dev/null | grep -cF "[1] recv card status:3"
|
|
}
|
|
|
|
echo $$ > /data/adb/esimd.pid
|
|
log "=== esimd started pid=$$ ==="
|
|
|
|
i=0
|
|
while [ $i -lt 600 ]; do
|
|
service check "$ESIM_SVC" 2>/dev/null | grep -q ': found' && break
|
|
sleep 0.5
|
|
i=$((i+1))
|
|
done
|
|
log "phaseA: esim HAL ready after ~$((i/2))s"
|
|
|
|
G=$(gpio_state)
|
|
if [ "$G" != "00000001" ]; then
|
|
j=0
|
|
while [ $j -lt 10 ]; do
|
|
gpio_on
|
|
sleep 1
|
|
G=$(gpio_state)
|
|
[ "$G" = "00000001" ] && break
|
|
j=$((j+1))
|
|
done
|
|
log "phaseA: gpio powered, state=$G tries=$((j+1))"
|
|
else
|
|
log "phaseA: gpio already ON"
|
|
fi
|
|
|
|
i=0
|
|
while [ $i -lt 300 ]; do
|
|
service check phone 2>/dev/null | grep -q ': found' && break
|
|
sleep 1
|
|
i=$((i+1))
|
|
done
|
|
log "phaseB: phone service after ~${i}s"
|
|
|
|
w=0
|
|
while [ $w -lt 60 ]; do
|
|
[ "$(esim_detected)" -ge 1 ] 2>/dev/null && break
|
|
sleep 3
|
|
w=$((w+3))
|
|
done
|
|
|
|
attempt=0
|
|
while [ $attempt -lt 6 ]; do
|
|
D=$(esim_detected)
|
|
if [ "${D:-0}" -ge 1 ] 2>/dev/null; then
|
|
log "phaseB: eSIM UP (attempt $attempt, detect=$D card=$(card_up))"
|
|
break
|
|
fi
|
|
attempt=$((attempt+1))
|
|
log "phaseB: attempt $attempt (detect=$D card=$(card_up))"
|
|
|
|
G=$(gpio_state)
|
|
if [ "$G" != "00000001" ]; then
|
|
gpio_on
|
|
sleep 1
|
|
fi
|
|
|
|
logcat -c -b radio 2>/dev/null
|
|
service call phone 175 $M1 >/dev/null 2>&1
|
|
sleep 2
|
|
setprop ctl.restart vendor.qcrild
|
|
setprop ctl.restart vendor.qcrild2
|
|
t=0
|
|
while [ $t -lt 40 ]; do
|
|
n=$(logcat -d -b radio 2>/dev/null | grep -c "Received GET_SIM_TYPE_INFO")
|
|
[ "${n:-0}" -ge 1 ] 2>/dev/null && break
|
|
sleep 1
|
|
t=$((t+1))
|
|
done
|
|
service call phone 175 $M2 >/dev/null 2>&1
|
|
p=0
|
|
while [ $p -lt 12 ]; do
|
|
sleep 3
|
|
p=$((p+1))
|
|
[ "$(card_up)" -ge 1 ] 2>/dev/null && break
|
|
done
|
|
done
|
|
log "phaseB: done, detect=$(esim_detected) card=$(card_up)"
|
|
|
|
fails=0
|
|
while true; do
|
|
sleep 30
|
|
if [ "$(esim_detected)" -ge 1 ] 2>/dev/null; then
|
|
fails=0
|
|
else
|
|
fails=$((fails+1))
|
|
log "monitor: eSIM not detected (fails=$fails)"
|
|
if [ $fails -ge 2 ]; then
|
|
log "monitor: reactivating"
|
|
gpio_on
|
|
sleep 1
|
|
service call phone 175 $M1 >/dev/null 2>&1
|
|
sleep 2
|
|
setprop ctl.restart vendor.qcrild
|
|
sleep 10
|
|
service call phone 175 $M2 >/dev/null 2>&1
|
|
fails=0
|
|
fi
|
|
fi
|
|
done
|