通过 iokit 读取 Apple Silicon MacBooks 上未文档化的 MEMS 加速度计

发布: (2026年2月20日 GMT+8 13:06)
3 分钟阅读

Source: Hacker News

这是什么

Apple Silicon 芯片(M1/M2/M3/M4)内置了一个难以发现的 MEMS 加速度计,由传感器处理单元(SPU)管理。
它没有通过任何公开的 API 或框架暴露。该项目通过 IOKit HID 回调以约 800 Hz 的频率读取原始的三轴加速度数据。

  • 目前仅在 MacBook Pro M3 Pro 上测试过——可能在其他 Apple Silicon Mac 上也能工作,但不作保证。

更多信息请参阅:在 Medium 上阅读文章

demo

工作原理

传感器位于 IOKit 注册表中的 AppleSPUHIDDevice,使用厂商使用页面 0xFF00,使用 ID 为 3
驱动程序是 AppleSPUHIDDriver,它是 SPU 的一部分。

  1. 使用 IOHIDDeviceCreate 打开设备。
  2. 通过 IOHIDDeviceRegisterInputReportCallback 注册异步回调。
  3. 数据以 22 字节的 HID 报告形式到达;X/Y/Z 为小端 int32,字节偏移分别为 6、10、14。
  4. 将每个数值除以 65536,即可得到以 g 为单位的加速度。
  5. 回调频率约为 100 Hz。

你可以使用以下命令验证设备是否存在于你的机器上:

ioreg -l -w0 | grep -A5 AppleSPUHIDDevice

快速开始

git clone https://github.com/olvvier/apple-silicon-accelerometer
cd apple-silicon-accelerometer
pip install -r requirements.txt
sudo python3 motion_live.py

需要 root 权限,因为在 Apple Silicon 上访问 IOKit HID 设备需要提升的权限。

代码结构

  • spu_sensor.py – 核心:IOKit 绑定、设备发现、HID 回调、共享内存环形缓冲区。
  • motion_live.py – 振动检测管线、心跳 BCG、终端 UI、主循环。

传感器读取逻辑被封装在 spu_sensor.py 中,便于独立复用。

心跳演示

将手腕放在靠近触控板的笔记本上,等待 10–20 秒让信号稳定。
此演示使用球状心电图(ballistocardiography)——即心跳产生的机械振动通过手臂传递到机箱。它是实验性的,不可靠,仅用于展示传感器能够捕获的内容。

  • BCG 带通滤波:0.8–3 Hz
  • 通过对滤波后信号的自相关估算 BPM

注意事项

  • 实验性 / 未文档化的 AppleSPU HID 路径
  • 需要 sudo
  • 未来 macOS 更新可能导致失效
  • 使用风险自负
  • 不用于医疗用途

测试环境

  • MacBook Pro M3 Pro,macOS 15.6.1
  • Python 3.14

许可证

MIT

与 Apple 或任何雇主无关。

0 浏览
Back to Blog

相关文章

阅读更多 »