Documentation
On this page

Subsystems

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