Appendix · reference

InvenSense MPU-6500 (accelerometer / gyroscope)

6-axis IMU on i2c4; raw sysctls only, no policy

Identity

PartInvenSense MPU-6500 (3-axis accel + 3-axis gyro + temperature)
RoleOrientation / motion sensing
Bus / addressi2c4 addr 0x68; WHO_AM_I (reg 0x75) = 0x70
GPIO / IRQINT on GPIO1_C6, active-low (DTS: interrupts = <RK_PC6 IRQ_TYPE_LEVEL_LOW>) — wired
DatasheetInvenSense MPU-6500 product specification
Pine64 wikiPinePhone Pro — Sensors
Schematicsheet 11 (sensor cluster on i2c4)

Status — ● working

The driver attaches, reports WHO_AM_I = 0x70, and exposes raw accel, gyro, and temperature sysctls under dev.mpu6500.0.*. On the bench a flat phone reads a Z axis around -15700, plausible for a unit at 1 g with the device’s sign convention. The data-ready IRQ is wired (INT_ENABLE.DATA_RDY_EN, ack via INT_STATUS); sysctl reads serve from a softc cache that a taskqueue_thread worker refreshes on each edge. Live on 2026-05-03 the chip reports irq_count=7516089 after ~18 minutes of uptime — the IRQ path is genuinely firing, not falling back to polled reads.

What remains for userspace integration

The driver is fully working at the kernel level; everything below is how a desktop / phone shell consumes it:

Driver

The MPU-6500 shares its register map and WHO_AM_I byte (0x70) with several siblings (the 0x68 MPU-6050 and the 0x71 MPU-9250). Our probe accepts 0x70 only. The Linux driver runs the part in interrupt-driven FIFO mode and exposes IIO buffers; we read the data registers synchronously on every sysctl access. That’s enough to prove the chip is alive but nowhere near efficient enough for a real orientation pipeline.

Open work

Parity verification

mise run debug:sensors:phone captures this receipt together with the STK3311, magnetometer, TSADC, and eFuse sysctls.