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

7.5 KiB
Raw Permalink Blame History

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