init commитььиьа
This commit is contained in:
commit
ede7d165a4
12 files changed
+541
No files matched your search
+16
@@ -0,0 +1,16 @@
|
|||||||
|
# Build artifacts / release archives
|
||||||
|
*.zip
|
||||||
|
*.apk
|
||||||
|
!module/**/*.apk
|
||||||
|
|
||||||
|
# OS / editor junk
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
*~
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# Logs / temp
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
+114
@@ -0,0 +1,114 @@
|
|||||||
|
# eSIM Slots Fix — OnePlus 15R (macan)
|
||||||
|
|
||||||
|
Сделано с ебучим квеном 3.8 максим.
|
||||||
|
|
||||||
|
Полноценная поддержка eSIM для **OnePlus 15R (macan / CPH2767)** на портах LineageOS (Android 16).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема
|
||||||
|
|
||||||
|
Порты AOSP для OnePlus 15R поставляются с неработающей eSIM, хотя железо (чип eUICC) и вендорные HAL Oplus полностью присутствуют:
|
||||||
|
|
||||||
|
1. **В настройках нет страницы eSIM.** AOSP `EuiccManager` включает интерфейс встроенной SIM, только если слот объявлен как несъёмный eUICC. Стоковая прошивка Oplus передаёт это в рантайме; порты AOSP — нет.
|
||||||
|
2. **Чип eUICC не получает питание при загрузке.** На ColorOS/OxygenOS проприетарные сервисы Oplus выполняют последовательность включения (`setUimPower` / `setEsimStatus` / `setEsimGpio`) через вендорный HAL eSIM. В портах AOSP этих сервисов нет, и чип остаётся выключенным.
|
||||||
|
3. **RIL не считает слот 1 eUICC-слотом.** Qualcomm RIL ждёт специфичную для Oplus конфигурацию `SET_SIM_TYPE` после загрузки; без неё модем игнорирует встроенный слот.
|
||||||
|
|
||||||
|
## Что делает модуль
|
||||||
|
|
||||||
|
| Компонент | Файл | Назначение |
|
||||||
|
|---|---|---|
|
||||||
|
| RRO-оверлей | `product/overlay/EuiccSlotsFix.apk` | Переопределяет `config_non_removable_euicc_slots` в `[1]`, чтобы Настройки и EuiccManager показали eSIM |
|
||||||
|
| Демон активации | `esimd.sh` | Питает eUICC во время бутанимации и ведёт всю последовательность активации RIL |
|
||||||
|
| Ручной цикл | `esimd-manual.sh` | Одноразовая активация с живым прогрессом |
|
||||||
|
| Кнопка в KSU | `action.sh` | Кнопка действия модуля в KernelSU Manager: статус + ручная активация |
|
||||||
|
| Watchdog | `service.sh` | Перезапускает демон, если он умер |
|
||||||
|
| Хук загрузки | `post-fs-data.sh` | Монтирует RRO-оверлей (tmpfs) и рано запускает демон |
|
||||||
|
|
||||||
|
### Фазы демона
|
||||||
|
|
||||||
|
- **Фаза A (бутанимация):** ждёт появления `vendor.oplus.hardware.esim.IOplusEsim/default`, затем подаёт питание на eUICC через HAL Oplus. Чип жив ещё до окончания загрузки Android — тот же тайминг, что на стоке.
|
||||||
|
- **Фаза B (радио поднялось):** ждёт сервис `phone`, даёт RIL до 60 с самостоятельно обнаружить eUICC. Если не обнаружен — до 6 попыток активации: `SET_SIM_TYPE [1,1]` → рестарт qcrild → ожидание ресинка RIL (`Received GET_SIM_TYPE_INFO`) → `SET_SIM_TYPE [1,2]` → ожидание определения карты.
|
||||||
|
- **Фаза C (постоянный монитор):** каждые 30 с проверяет наличие eSIM. Два подряд сбоя — автоматическая реактивация. eSIM восстанавливается без участия пользователя.
|
||||||
|
|
||||||
|
## Технические детали
|
||||||
|
|
||||||
|
### Последовательность питания eUICC (вендорные HAL Oplus)
|
||||||
|
|
||||||
|
```
|
||||||
|
vendor.oplus.hardware.esim.IOplusEsim/default
|
||||||
|
tx 1 = getEsimGpio
|
||||||
|
tx 3 = setEsimGpio(1)
|
||||||
|
tx 5 = setUimPower(0|1)
|
||||||
|
|
||||||
|
vendor.oplus.hardware.subsys_interface.subsys_radio.ISubsysRadio/slot1
|
||||||
|
tx 289 = setEsimStatus(91, 1)
|
||||||
|
|
||||||
|
Порядок: setUimPower(0) -> setEsimStatus(91,1) -> setEsimGpio(1) -> setUimPower(1)
|
||||||
|
Контрольное чтение GPIO должно вернуть 00000001
|
||||||
|
```
|
||||||
|
|
||||||
|
### SET_SIM_TYPE (транзакция 175 ITelephony)
|
||||||
|
|
||||||
|
```
|
||||||
|
service call phone 175 \
|
||||||
|
i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 <T>
|
||||||
|
|
||||||
|
T = 1 только физические слоты (сбрасывает RIL)
|
||||||
|
T = 2 физический + eUICC (финальная конфигурация)
|
||||||
|
```
|
||||||
|
|
||||||
|
Порядок `[1,1] → рестарт qcrild → [1,2]` обязателен: модем применяет тип
|
||||||
|
eUICC-слота только после чистой реинициализации RIL.
|
||||||
|
|
||||||
|
### Маркеры успеха
|
||||||
|
|
||||||
|
- radio logcat: `Received GET_SIM_TYPE_INFO` (RIL ресинкнулся)
|
||||||
|
- radio logcat: `[1] recv card status:3` (карта eUICC отвечает)
|
||||||
|
- `dumpsys isub`: активная подписка с `simSlotIndex=1 portIndex=0 isEmbedded=1`
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
- OnePlus 15R (macan, CPH2767), порт LineageOS на Android 16
|
||||||
|
- KernelSU (проверено на KSU 3.3.0 с SUSfs)
|
||||||
|
- Вендорный образ Oplus с рабочими HAL `esim` и `subsys_radio`
|
||||||
|
- Хотя бы один eSIM-профиль, загруженный в eUICC (проверено с MTS BY; переключение профилей MTS BY ⇄ Roamless работает)
|
||||||
|
|
||||||
|
> Примечание: в KernelSU 3.x нет magic mount, поэтому RRO разворачивается
|
||||||
|
> tmpfs-биндом поверх `/product/overlay` в `post-fs-data.sh`, а не папкой `system/`.
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
- **Автоматически:** делать ничего не нужно. eUICC запитывается во время бутанимации, eSIM регистрируется через ~20–30 с после загрузки.
|
||||||
|
- **Вручную:** KernelSU → Модули → *eSIM Slots Fix* → кнопка действия. Показывает текущий статус, выполняет полный цикл активации с живым прогрессом, выводит результат и последние строки лога.
|
||||||
|
|
||||||
|
## Логи
|
||||||
|
|
||||||
|
- `/data/adb/euicc_daemon.log` — активность демона, ручные циклы, события монитора (автообрезка на 256 КБ)
|
||||||
|
- `/data/adb/esimd.pid` — PID демона
|
||||||
|
|
||||||
|
## Ограничения
|
||||||
|
|
||||||
|
- В устройстве **один чип eUICC**: одновременно активен только один eSIM-профиль. Одновременные два eSIM (MEP) не поддерживаются конфигурацией модема — поведение такое же, как на стоковой прошивке.
|
||||||
|
- Физическая nano-SIM + eSIM работают одновременно (DSDS, 2 активные подписки).
|
||||||
|
- Дополнительные bundled-правки, не связанные с eSIM: флаг поддержки спутниковой телефонии и override idle-таймера SurfaceFlinger (анти-мерцание для LTPO-панелей).
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
EuiccSlotsFix/
|
||||||
|
├── README.md английский readme
|
||||||
|
├── README-RU.md этот файл
|
||||||
|
└── module/
|
||||||
|
├── module.prop
|
||||||
|
├── customize.sh
|
||||||
|
├── post-fs-data.sh
|
||||||
|
├── service.sh
|
||||||
|
├── action.sh
|
||||||
|
├── esimd.sh
|
||||||
|
├── esimd-manual.sh
|
||||||
|
└── product/
|
||||||
|
├── overlay/EuiccSlotsFix.apk
|
||||||
|
└── etc/permissions/android.hardware.telephony.satellite.xml
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
# eSIM Slots Fix — OnePlus 15R (macan)
|
||||||
|
|
||||||
|
Built with Qwen3.8 Max!1!1!1!11
|
||||||
|
|
||||||
|
Full eSIM support for **OnePlus 15R (macan / CPH2767)** running LineageOS-based Android 16 ports.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The Problem
|
||||||
|
|
||||||
|
AOSP-based ports for OnePlus 15R ship without working eSIM, even though the hardware (eUICC chip) and Oplus vendor HALs are fully present:
|
||||||
|
|
||||||
|
1. **Settings does not show the eSIM page.** AOSP `EuiccManager` only enables the embedded SIM UI when a slot is reported as a non-removable eUICC. The Oplus stock framework injects this at runtime; AOSP ports do not.
|
||||||
|
2. **The eUICC chip is never powered on at boot.** On ColorOS/OxygenOS, proprietary Oplus framework services run the power-up sequence (`setUimPower` / `setEsimStatus` / `setEsimGpio`) through the vendor eSIM HAL. Those services do not exist on AOSP ports, so the chip stays dead.
|
||||||
|
3. **The RIL does not treat slot 1 as an eUICC.** Qualcomm RIL expects an Oplus-specific `SET_SIM_TYPE` configuration push after boot; without it the modem ignores the embedded slot.
|
||||||
|
|
||||||
|
## What This Module Does
|
||||||
|
|
||||||
|
| Component | File | Purpose |
|
||||||
|
|---|---|---|
|
||||||
|
| RRO overlay | `product/overlay/EuiccSlotsFix.apk` | Overrides `config_non_removable_euicc_slots` to `[1]` so Settings and EuiccManager expose the eSIM UI |
|
||||||
|
| Activation daemon | `esimd.sh` | Powers the eUICC during boot animation and drives the full RIL activation sequence |
|
||||||
|
| Manual cycle | `esimd-manual.sh` | One-shot activation with live progress output |
|
||||||
|
| KSU action button | `action.sh` | Module action in KernelSU Manager: status + manual activation |
|
||||||
|
| Watchdog | `service.sh` | Respawns the daemon if it dies |
|
||||||
|
| Boot hook | `post-fs-data.sh` | Mounts the RRO overlay (tmpfs) and starts the daemon early |
|
||||||
|
|
||||||
|
### Daemon phases
|
||||||
|
|
||||||
|
- **Phase A (boot animation):** waits for `vendor.oplus.hardware.esim.IOplusEsim/default`, then powers the eUICC via the Oplus HAL power sequence. The chip is alive before Android finishes booting — the same timing as stock firmware.
|
||||||
|
- **Phase B (radio up):** waits for the `phone` service, gives the RIL up to 60 s to detect the eUICC on its own. If not detected, runs up to 6 activation attempts: `SET_SIM_TYPE [1,1]` → qcrild restart → wait for RIL re-sync (`Received GET_SIM_TYPE_INFO`) → `SET_SIM_TYPE [1,2]` → wait for card detection.
|
||||||
|
- **Phase C (runtime monitor):** checks eSIM presence every 30 s forever. Two consecutive failures trigger automatic re-activation. The eSIM comes back without user interaction.
|
||||||
|
|
||||||
|
## Technical Details
|
||||||
|
|
||||||
|
### eUICC power sequence (Oplus vendor HALs)
|
||||||
|
|
||||||
|
```
|
||||||
|
vendor.oplus.hardware.esim.IOplusEsim/default
|
||||||
|
tx 1 = getEsimGpio
|
||||||
|
tx 3 = setEsimGpio(1)
|
||||||
|
tx 5 = setUimPower(0|1)
|
||||||
|
|
||||||
|
vendor.oplus.hardware.subsys_interface.subsys_radio.ISubsysRadio/slot1
|
||||||
|
tx 289 = setEsimStatus(91, 1)
|
||||||
|
|
||||||
|
Order: setUimPower(0) -> setEsimStatus(91,1) -> setEsimGpio(1) -> setUimPower(1)
|
||||||
|
GPIO readback must return 00000001
|
||||||
|
```
|
||||||
|
|
||||||
|
### SET_SIM_TYPE (ITelephony transaction 175)
|
||||||
|
|
||||||
|
```
|
||||||
|
service call phone 175 \
|
||||||
|
i32 2 i32 1 i32 0 i32 0 i32 0 i32 1 i32 1 i32 0 i32 1 i32 1 i32 <T>
|
||||||
|
|
||||||
|
T = 1 physical-only slot map (forces RIL reset)
|
||||||
|
T = 2 physical + eUICC (final configuration)
|
||||||
|
```
|
||||||
|
|
||||||
|
The `[1,1] → qcrild restart → [1,2]` order is required: the modem applies the
|
||||||
|
eUICC slot type only after a clean RIL re-initialization.
|
||||||
|
|
||||||
|
### Success markers
|
||||||
|
|
||||||
|
- radio logcat: `Received GET_SIM_TYPE_INFO` (RIL re-synced)
|
||||||
|
- radio logcat: `[1] recv card status:3` (eUICC card responding)
|
||||||
|
- `dumpsys isub`: active subscription with `simSlotIndex=1 portIndex=0 isEmbedded=1`
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- OnePlus 15R (macan, CPH2767), LineageOS-based Android 16 port
|
||||||
|
- KernelSU (tested on KSU 3.3.0 with SUSfs)
|
||||||
|
- Oplus vendor image with working `esim` and `subsys_radio` HALs
|
||||||
|
- At least one eSIM profile downloaded to the eUICC (tested with MTS BY; profile switching MTS BY ⇄ Roamless works)
|
||||||
|
|
||||||
|
> Note: KernelSU 3.x has no magic mount, so the RRO is deployed with a tmpfs
|
||||||
|
> bind over `/product/overlay` in `post-fs-data.sh` instead of a `system/` dir.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
- **Automatic:** nothing to do. eUICC powers during boot animation, eSIM registers ~20–30 s after boot.
|
||||||
|
- **Manual:** KernelSU → Modules → *eSIM Slots Fix* → action button. Shows current status, runs the full activation cycle with live progress, prints the result and recent log lines.
|
||||||
|
|
||||||
|
## Logs
|
||||||
|
|
||||||
|
- `/data/adb/euicc_daemon.log` — daemon activity, manual cycles, monitor events (auto-truncated at 256 KB)
|
||||||
|
- `/data/adb/esimd.pid` — daemon PID
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
- The device has a **single eUICC chip**: only one eSIM profile can be active at a time. Simultaneous dual-eSIM (MEP) is not supported by the modem configuration — same behavior as stock firmware.
|
||||||
|
- Physical nano-SIM + eSIM work simultaneously (DSDS, 2 active subscriptions).
|
||||||
|
- Bundled extras unrelated to eSIM: satellite telephony feature flag and a SurfaceFlinger idle-timer override (anti-flicker for LTPO panels).
|
||||||
|
|
||||||
|
## Project Layout
|
||||||
|
|
||||||
|
```
|
||||||
|
EuiccSlotsFix/
|
||||||
|
├── README.md this file
|
||||||
|
├── README-RU.md Russian readme
|
||||||
|
└── module/
|
||||||
|
├── module.prop
|
||||||
|
├── customize.sh
|
||||||
|
├── post-fs-data.sh
|
||||||
|
├── service.sh
|
||||||
|
├── action.sh
|
||||||
|
├── esimd.sh
|
||||||
|
├── esimd-manual.sh
|
||||||
|
└── product/
|
||||||
|
├── overlay/EuiccSlotsFix.apk
|
||||||
|
└── etc/permissions/android.hardware.telephony.satellite.xml
|
||||||
|
```
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#!/system/bin/sh
|
||||||
|
LOG=/data/adb/euicc_daemon.log
|
||||||
|
ESIM_SVC="vendor.oplus.hardware.esim.IOplusEsim/default"
|
||||||
|
|
||||||
|
gpio_st() {
|
||||||
|
service call "$ESIM_SVC" 1 2>/dev/null | grep -oE '[0-9a-f]{8} [0-9a-f]{8}' | head -1 | awk '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
|
status() {
|
||||||
|
G=$(gpio_st)
|
||||||
|
D=$(dumpsys isub 2>/dev/null | grep -c 'simSlotIndex=1 portIndex=0 isEmbedded=1')
|
||||||
|
N=$(dumpsys isub 2>/dev/null | grep 'simSlotIndex=1 ' | grep -oE 'displayName=[^ ]+' | head -1)
|
||||||
|
if [ "$G" = "00000001" ]; then
|
||||||
|
echo "eUICC power : ON"
|
||||||
|
else
|
||||||
|
echo "eUICC power : OFF ($G)"
|
||||||
|
fi
|
||||||
|
if [ "${D:-0}" -ge 1 ]; then
|
||||||
|
echo "eSIM in slot: YES $N"
|
||||||
|
else
|
||||||
|
echo "eSIM in slot: NO"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "=== eSIM Fix ==="
|
||||||
|
status
|
||||||
|
echo
|
||||||
|
echo "Running activation cycle (~1-2 min)..."
|
||||||
|
echo
|
||||||
|
sh /data/adb/modules/euicc_slots_fix/esimd-manual.sh
|
||||||
|
echo
|
||||||
|
echo "=== Result ==="
|
||||||
|
status
|
||||||
|
echo
|
||||||
|
echo "Log:"
|
||||||
|
tail -8 "$LOG" 2>/dev/null
|
||||||
|
|
||||||
|
if [[ -z "$MMRL" ]] && ([[ -n "$KSU" ]] || [[ -n "$APATCH" ]]); then
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
ui_print "- eSIM Slots Fix v1.1"
|
||||||
|
ui_print "- by huker667"
|
||||||
|
ui_print "- OnePlus 15R (macan), LineageOS-based Android 16"
|
||||||
|
|
||||||
|
set_perm_recursive "$MODPATH" 0 0 0755 0644
|
||||||
|
set_perm "$MODPATH/post-fs-data.sh" 0 0 0755
|
||||||
|
set_perm "$MODPATH/service.sh" 0 0 0755
|
||||||
|
set_perm "$MODPATH/action.sh" 0 0 0755
|
||||||
|
set_perm "$MODPATH/esimd.sh" 0 0 0755
|
||||||
|
set_perm "$MODPATH/esimd-manual.sh" 0 0 0755
|
||||||
|
|
||||||
|
ui_print "- Done. Reboot to activate."
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
#!/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') [manual] $*" >> "$LOG"
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
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}'
|
||||||
|
}
|
||||||
|
|
||||||
|
detected() {
|
||||||
|
dumpsys isub 2>/dev/null | grep -c 'simSlotIndex=1 portIndex=0 isEmbedded=1'
|
||||||
|
}
|
||||||
|
|
||||||
|
log "=== manual cycle start ==="
|
||||||
|
|
||||||
|
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
|
||||||
|
sleep 1
|
||||||
|
log "gpio=$(gpio_state)"
|
||||||
|
|
||||||
|
logcat -c -b radio 2>/dev/null
|
||||||
|
service call phone 175 $M1 >/dev/null 2>&1
|
||||||
|
sleep 2
|
||||||
|
log "SET_SIM_TYPE[1,1] sent, restarting qcrild..."
|
||||||
|
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
|
||||||
|
log "ril sync after ${t}s"
|
||||||
|
service call phone 175 $M2 >/dev/null 2>&1
|
||||||
|
log "SET_SIM_TYPE[1,2] sent, waiting for eSIM detection..."
|
||||||
|
|
||||||
|
p=0
|
||||||
|
while [ $p -lt 15 ]; do
|
||||||
|
sleep 3
|
||||||
|
p=$((p+1))
|
||||||
|
d=$(detected)
|
||||||
|
[ "${d:-0}" -ge 1 ] 2>/dev/null && break
|
||||||
|
done
|
||||||
|
log "=== manual cycle done: detect=$(detected) ($((p * 3))s) ==="
|
||||||
|
|
||||||
|
pgrep -f esimd.sh >/dev/null 2>&1 || setsid /system/bin/sh /data/adb/modules/euicc_slots_fix/esimd.sh >/dev/null 2>&1 </dev/null &
|
||||||
|
exit 0
|
||||||
+132
@@ -0,0 +1,132 @@
|
|||||||
|
#!/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
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
id=euicc_slots_fix
|
||||||
|
name=eSIM Slots Fix
|
||||||
|
version=v1.1
|
||||||
|
versionCode=2
|
||||||
|
author=huker667
|
||||||
|
description=Full eSIM support for OnePlus 15R (macan) on LineageOS-based Android 16 ports. RRO for eUICC slot visibility, early boot activation daemon with auto-recovery, manual activation action button.
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#!/system/bin/sh
|
||||||
|
MODDIR=${0%/*}
|
||||||
|
|
||||||
|
TMP=/dev/euicc_overlay_tmp
|
||||||
|
SRC=/product/overlay
|
||||||
|
if [ -f "$MODDIR/product/overlay/EuiccSlotsFix.apk" ]; then
|
||||||
|
rm -rf "$TMP" 2>/dev/null
|
||||||
|
mkdir -p "$TMP"
|
||||||
|
cp -a "$SRC/." "$TMP/" 2>/dev/null
|
||||||
|
cp -a "$MODDIR/product/overlay/EuiccSlotsFix.apk" "$TMP/" 2>/dev/null
|
||||||
|
mount -t tmpfs -o mode=755 tmpfs "$SRC"
|
||||||
|
cp -a "$TMP/." "$SRC/" 2>/dev/null
|
||||||
|
chown -R root:root "$SRC"
|
||||||
|
chmod 755 "$SRC"
|
||||||
|
restorecon -R "$SRC" 2>/dev/null
|
||||||
|
rm -rf "$TMP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PTMP=/dev/perm_tmp
|
||||||
|
PERM=/product/etc/permissions
|
||||||
|
if [ -f "$MODDIR/product/etc/permissions/android.hardware.telephony.satellite.xml" ]; then
|
||||||
|
rm -rf "$PTMP" 2>/dev/null
|
||||||
|
mkdir -p "$PTMP"
|
||||||
|
cp -a "$PERM/." "$PTMP/" 2>/dev/null
|
||||||
|
cp -a "$MODDIR/product/etc/permissions/android.hardware.telephony.satellite.xml" "$PTMP/" 2>/dev/null
|
||||||
|
mount -t tmpfs -o mode=755 tmpfs "$PERM"
|
||||||
|
cp -a "$PTMP/." "$PERM/" 2>/dev/null
|
||||||
|
chown -R root:root "$PERM"
|
||||||
|
chmod 755 "$PERM"
|
||||||
|
chmod 644 "$PERM"/*.xml 2>/dev/null
|
||||||
|
restorecon -R "$PERM" 2>/dev/null
|
||||||
|
rm -rf "$PTMP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
/data/adb/ksu/bin/resetprop ro.surface_flinger.set_idle_timer_ms 3000
|
||||||
|
|
||||||
|
setsid /system/bin/sh "$MODDIR/esimd.sh" >/dev/null 2>&1 </dev/null &
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<permissions>
|
||||||
|
<feature name="android.hardware.telephony.satellite" />
|
||||||
|
</permissions>
|
||||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
|||||||
|
#!/system/bin/sh
|
||||||
|
until [ "$(getprop sys.boot_completed)" = "1" ]; do sleep 2; done
|
||||||
|
sleep 5
|
||||||
|
while true; do
|
||||||
|
if ! pgrep -f esimd.sh >/dev/null 2>&1; then
|
||||||
|
echo "$(date) esimd not running, respawning" >> /data/adb/euicc_daemon.log
|
||||||
|
setsid /system/bin/sh /data/adb/modules/euicc_slots_fix/esimd.sh >/dev/null 2>&1 </dev/null &
|
||||||
|
fi
|
||||||
|
sleep 20
|
||||||
|
done
|
||||||
Reference in new issue
Block a user