# 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 = 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 ```