#!/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