7.5 KiB
7.5 KiB
eSIM Slots Fix — OnePlus 15R (macan)
Сделано с ебучим квеном 3.8 максим.
Полноценная поддержка eSIM для OnePlus 15R (macan / CPH2767) на портах LineageOS (Android 16).
Проблема
Порты AOSP для OnePlus 15R поставляются с неработающей eSIM, хотя железо (чип eUICC) и вендорные HAL Oplus полностью присутствуют:
- В настройках нет страницы eSIM. AOSP
EuiccManagerвключает интерфейс встроенной SIM, только если слот объявлен как несъёмный eUICC. Стоковая прошивка Oplus передаёт это в рантайме; порты AOSP — нет. - Чип eUICC не получает питание при загрузке. На ColorOS/OxygenOS проприетарные сервисы Oplus выполняют последовательность включения (
setUimPower/setEsimStatus/setEsimGpio) через вендорный HAL eSIM. В портах AOSP этих сервисов нет, и чип остаётся выключенным. - 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