Files

114 lines
7.5 KiB
Markdown
Raw Permalink Normal View History

2026-10-07 00:46:54 +03:00
# 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
```