Files
2026-10-07 00:46:54 +03:00

115 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```