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