Xiaomi Mi 10T / Redmi K30S Ultra (xiaomi-apollo)
| This device has been tested with Nura, but its device package has not yet been added to the Nura repositories. This means that it cannot be selected in pmbootstrap. |
|
Xiaomi Mi 10T Pro running Nura | |
| Manufacturer | Xiaomi |
|---|---|
| Name |
Mi 10T Redmi K30S Ultra |
| Codename | xiaomi-apollo |
| Released | 2020 |
| Type | handset |
| Hardware | |
| Chipset | Qualcomm Snapdragon 865 5G (SM8250) |
| Display | 1080x2400 (IPS LCD) |
| Storage | 128/256 GB |
| Memory | 6/8 GB |
| Architecture | aarch64 |
| Software | |
Original software The software and version the device was shipped with. |
Android (MIUI) 10 |
Extended version The most recent supported version from the manufacturer. |
Android (MIUI) 12 (MIUI 14) |
| FOSS bootloader | no |
| Nura | |
Mainline Instead of a Linux kernel fork, it is possible to run (Close to) Mainline. |
no |
pmOS kernel The kernel version that runs on the device's port. |
7.1.0 |
Flashing Whether it is possible to flash the device with pmbootstrap flasher. |
Works
|
|---|---|
USB Networking After connecting the device with USB to your PC, you can connect to it via telnet (initramfs) or SSH (booted system). |
Works
|
Internal storage eMMC, SD cards, UFS... |
Works
|
Battery Whether charging and battery level reporting work. |
Works
|
Screen Whether the display works; ideally with sleep mode and brightness control. |
Works
|
Touchscreen |
Works
|
| Multimedia | |
3D Acceleration |
Works
|
Audio Audio playback, microphone, headset and buttons. |
Works
|
Camera |
Works
|
Camera Flash |
Works
|
IR TX |
Untested
|
| Connectivity | |
WiFi |
Works
|
Bluetooth |
Works
|
GPS |
Broken
|
NFC Near Field Communication |
Works
|
| Modem | |
Calls |
Works
|
SMS |
Works
|
Mobile data |
Works
|
| Miscellaneous | |
FDE Full disk encryption and unlocking with unl0kr. |
Untested
|
USB OTG USB On-The-Go or USB-C Role switching. |
Works
|
HDMI/DP Video and audio output with HDMI or DisplayPort. |
Untested
|
Fingerprint Fingerprint reader. |
Broken
|
| Sensors | |
Accelerometer Handles automatic screen rotation in many interfaces. |
Works
|
Magnetometer Sensor to measure the Earth's magnetism |
Broken
|
Ambient Light Measures the light level; used for automatic screen dimming in many interfaces. |
Works
|
Proximity |
Broken
|
Hall Effect Measures magnetic fields; usually used as a flip cover sensor |
Broken
|
Haptics |
Untested
|
Barometer Sensor to measure air pressure |
Broken
|
Power Sensor Sensor to monitor current, voltage and power. Not fuel gauge! |
Untested
|
Contributors
Users owning this device
Mi 10T
- PiotrZPL (Notes: Ported SuperiorOS, AwakenOS and DerpFest Android 14 ROMs, but struggle to boot postmarketOS.)
Mi 10T Pro
How to enter flash mode
Power off, then hold + until the fastboot screen appears.
Installation
The device package, the kernel and the supporting packages are not upstream yet. pmbootstrap manages its own pmaports checkout, so point it at the fork:
# 1. Clone the fork and point pmbootstrap at it
git clone https://gitlab.postmarketos.org/royka1/pmaports.git ~/pmaports-apollo
# 2. git -C ~/pmaports-apollo remote add upstream \
https://gitlab.postmarketos.org/postmarketOS/pmaports.git
git -C ~/pmaports-apollo fetch upstream
# 3. Run init:
pmbootstrap init
Choose pmaports path: ~/pmaports-apollo
choose Vendor: xiaomi, Device: apollo
# 4. Build and flash
pmbootstrap install
pmbootstrap flasher flash_kernel
pmbootstrap flasher flash_rootfs
Erase the dtbo partition once, before the first boot:
fastboot erase dtbo
To go back to stock pmaports:
pmbootstrap config aports ~/.local/var/pmbootstrap/cache_git/pmaports
Repositories
- Kernel: gitlab.postmarketos.org/royka1/linux (branch
apollo-7.1, tagapollo-7.1.0-r1) — Nura 7.1.0-dev plus the apollo port - pmaports fork: gitlab.postmarketos.org/royka1/pmaports
- Packages: github.com/royka1/Xiaomi-Apollo-Nura-packages
After installing
Pin the locally built packages so apk upgrade cannot replace them:
apollo-pin-packages
This matters. The custom kernel shares its package name with the one in the
repositories, and when the repository version wins, apk removes
/lib/modules/<ver>/ while boot-deploy fails (the repository
package has no apollo DTB) — so the phone boots the old image with an empty
module tree and WiFi, audio and the modem all stop at once. ModemManager is
pinned for the same reason: it carries two out-of-tree patches needed for
mobile data.
Current status
The device boots mainline and is usable as a phone. Display, touchscreen, audio, Wi-Fi, Bluetooth and cellular (LTE/5G, mobile data and SMS) all work.
The device and kernel packages are not in pmaports yet — they live in the forks linked under #Installation.
What works
- Display and touchscreen
- Camera's
- Audio: speaker, earpiece, microphones and headset
- WiFi and Bluetooth (QCA6390)
- All four remote processors: modem (SDX55), ADSP, CDSP, SLPI
- Cellular: registers on LTE/5G, mobile data and SMS
- Accelerometer (automatic screen rotation)
- GPU (Adreno 650), hardware accelerated
What does not work
- GPS: the modem's LOC service never answers. Its QMI requests time out, and because ModemManager drops a modem after 10 consecutive port timeouts, this can make the modem disappear entirely on some boots.
- Fingerprint reader
The SDX55 modem
Unlike most SM8250 phones, the Mi 10T has no on-die modem. The SD865 ships without an MPSS; cellular comes from a separate Qualcomm SDX55 attached over PCIe and driven with MHI. That changes what userspace has to provide.
Three things are required, all handled by the packages below:
- A TFTP/RFS server on QRTR: The modem reads its configuration from the AP over QRTR (service 4096). Upstream
tqftpservpublishes instance 1, but a PCIe-attached SDX55 looks up instance 3, so it never resolves and every read times out. It also needs a send-retry fix: at the modem's negotiated 7680x10 window, the QRTR socket buffer runs out and blocks are silently dropped, after which the modem ERRFATALs. - The Peripheral Manager and ESOC helpers provided by Android (
pm_service_native,mdm_helper_native). - The device's own modem NV. (see below)
Put the SIM in physical slot 1
With the SIM in slot 2, nothing addresses the card by default: the modem does not create a provisioning session, and both qmicli and ModemManager target card-slot-1. The result is Application state: 'detected' forever and ModemManager reporting sim-missing. A PIN verify against the wrong session fails with QMI error Internal without consuming a retry, which is a useful tell.
--uim-switch-slot does not help: it works at runtime but does not survive a reboot, because the modem's EFS is re-seeded from static images on every boot.
Modem NV (EFS)
The modem needs efs1/2/3.bin, which hold the IMEI, the RF calibration and the subscriber state. They are unique to each handset, so they are not shipped in any package and must never be published.
apollo-modem-support installs apollo-efs-extract, which copies them out of the phone's own mdm1m9kefs1/2/3 partitions on first boot. The modem reads NV very early, so cellular starts working on the second boot after a fresh install. Without them, the SDX55 boots and then ERRFATALs about 15s into mission mode.
Cameras
All four cameras work on mainline through the Qualcomm camss driver and
libcamera's software ISP (no proprietary ISP blobs). Any libcamera
application works: GNOME Snapshot, cam/qcam, or
PipeWire consumers.
| Camera | Sensor | Resolution | Interface | Status |
|---|---|---|---|---|
| Main (wide) | Samsung S5KHMX (ISOCELL Bright HMX) | 108 MP, streams the 4×4-binned 3008×2256 mode | MIPI C-PHY, 3 trios | works, autofocus |
| Ultra-wide | OmniVision OV13B10 | 13 MP (4208×3120) | MIPI D-PHY | works, fixed focus |
| Macro | Samsung S5K5E9 | 5 MP (2592×1944) | MIPI D-PHY | Template:Y works; focus motor accepts commands but does not move (open issue), usable at its resting focus distance |
| Front | Samsung S5K3T2 | 20 MP, streams the 2×2-binned 2592×1940 mode | MIPI D-PHY | works, fixed focus |
Notable implementation details:
- The 108 MP main sensor runs MIPI C-PHY (three trios at 4.1 Gbit/s), which mainline camss did not support at all; C-PHY support for the SM8250 CSIPHY was written for this port and the register configuration validated against a live dump of the vendor kernel's PHY.
- Autofocus is contrast-detection, implemented in libcamera's software ISP (a sharpness statistic in the CPU stats pass, driving the AK7375 voice-coil motor through the kernel lens API). Continuous AF is the default; the standard
AfMode/AfTrigger/LensPositioncontrols give one-shot and manual focus. - Colors come from the vendor Chromatix calibration: the color correction matrices were extracted from the Android camera blobs and shipped as libcamera tuning files for all four sensors.
- The camera flash works, both as a torch (the flashlight quick-setting in Phosh) and as a full-power strobe with the hardware safety timeout. The LED hangs off the second PM8150L flash channel. Camera applications do not fire it during capture yet, since the software ISP has no flash sequencing.
- PDAF (the sensors' phase-detection pixels) is not used; focus is purely contrast-based, so it is slower than Android's.
Mi 10T (non-Pro) variant
The non-Pro Mi 10T pairs the same board with a different main-camera
module: a Sunny module with a 64 MP Sony IMX682 (also C-PHY) and a DW9800
focus motor instead of the S5KHMX and AK7375. Both variants are described
in the shared device tree, and the apollo-camera-variant
service reads the camera module's EEPROM at boot (byte 1 is the module
integrator id) and switches the device tree to the fitted parts with a
runtime overlay. The IMX682 driver, gain model and vendor color matrices
are all in place, but this path has not yet been tested on real
hardware — reports from Mi 10T owners are welcome.
Serial UART

There are two pads in the bottom right corner of the phone's mainboard which might be the serial UART port of the device. The left pad is pulled high to 1.8V, whereas the right pad always stays at 0V (relative to the shielding) which might indicate the left pad being the phones TX and the right pad being the phones RX pads. If these assumptions are correct, the TX pad must be connected to the RX pin of a 1.8V compatible serial adapter, e.g. for debugging mainline builds or other startup-related problems.