115 lines
7.5 KiB
Markdown
115 lines
7.5 KiB
Markdown
# 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
|
||
```
|
||
|