Haptics
The vibration motor, driven from iOS's haptic waveforms.
Hardware
A vibration motor on the PMIC’s VIBR rail. Android runs it at 2.8 V; the driver only ever uses Android’s full-strength VIBR code (VIBR_VOSEL, on the PMIC wrapper’s whitelist).
Driver
mtk_audio.c holds the motor next to the audio codec, because both are written through the PMIC wrapper. mp_vib_steps sets how far it goes: 0 status only, 1 one 100 ms buzz at Android’s voltage,
2 (the default) /dev/mapple-haptic runs the motor while iOS’s haptic waveform is loud enough: at least 30 ms (Android’s vib_timer), at most 1 s at a time, then 1 s off.
The audio plug-in’s “Actuator” device feeds it.
Device tree
/product/haptics (closed-loop 1, supports-3rd-party-haptics 1), added by mkadt.py with --audio or --haptics: MobileGestalt’s closed-loop-haptics answer comes from it, and only then
does iOS play its haptics as waveforms on the plug-in. See Device tree.
Boot-arguments
mp_vib_steps in the catalogue: 2 by default, 0 on a safe boot.
User space
MappleAudio.driver, the audio server’s plug-in from mapple/userland/audio, with its Actuator device; built when device.conf has audio 1.
Status
device.conf: works: the VIBR motor at Android’s 2.8 V from iOS’s haptics (mp_vib_steps=2, mkadt --haptics).
Seen: the ringtone playing with vibration, iOS’s haptics through the motor (run 30).
Known issues
None recorded. A long haptic is cut to a second at a time with a second’s rest.
Source files
bsd/dev/mtk_audio.c of the kernel at 76b737c; audio/audio_plugin.c of mapple_userland at 4f8127b; tools/mkadt.py of mapple_build at f7431bb.
Applies to realme 8i (spaced), release 1 · Updated 15 November 2026