1. 引言:为什么需要 Sensor Hub

在工业机器人、智能相机等边缘设备中,传感器采集是一个永不停歇的需求——IMU 需要持续追踪姿态,气压计需要监测环境变化,接近传感器需要检测障碍物。如果每次采样都要唤醒主 CPU(Cortex-A78 级别,动态功耗 2-5W),系统功耗将完全不可接受。

高通的解决方案是:把传感器数据的采集、融合、阈值判断下放到一颗独立的低功耗微控制器(Sensor Hub),只有在真正需要主 CPU 介入时才发起唤醒。

这个架构带来的收益是数量级的:

指标 主 CPU 轮询方案 Sensor Hub 方案
采样期间主 CPU 状态 Active(~2W) Deep Sleep(~5mW)
100Hz IMU 采集功耗 ~800mW(含 DDR) ~15mW(Island Mode)
唤醒延迟 无(始终 Active) 200μs~2ms(按需唤醒)
适合场景 高实时性控制环 监测类、间歇性处理

适用范围说明:本文以 QRB5165 / QCS6490 / IQ-9075 / IQ-9100 平台为参照,架构概念适用于所有具备 SLPI 子系统的高通 SoC。具体寄存器地址、固件版本请以目标平台 BSP 文档为准。

2. 高通 Sensor Hub 硬件架构概览

高通 SoC 中的 Sensor Hub 并非一颗独立芯片,而是集成在 SoC 内部的一个子系统——称为 SLPI(Sensor Low-Power Island)SSC(Sensors Subsystem Core)

2.1 核心组件

组件 说明
Hexagon DSP(sDSP) Sensor 专用 DSP 核心,运行传感器驱动和算法
Island Mode Hardware 独立电源域、独立时钟,可在主 CPU 掉电时独立运行
Sensor Bus Controller 独立的 I2C/SPI Master,不经过主 CPU 的 QUP 控制器
Shared Memory(SMEM) 与主 CPU 的数据交换缓冲区
IPC Interrupt 跨子系统中断通知,用于唤醒主 CPU
uImage Framework Island Mode 下的精简运行框架

2.2 与主 CPU 的通信路径

SLPI 与 Apps Processor 之间有两条主要通信路径:

1)QMI(Qualcomm Messaging Interface)

  • 基于共享内存的消息队列

  • 用于配置下发、传感器使能/禁用、采样率设置

  • 延迟较高(~100μs 级),适合控制面

2)FastRPC / SMEM 批量通道

  • 零拷贝共享内存映射

  • 用于批量传感器数据上报

  • 通过"水位线"机制触发中断——缓冲区积攒到阈值才通知主 CPU

2.3 独立总线控制

关键设计:SLPI 拥有自己的 I2C/SPI 控制器端口,与主 CPU 的 QUP(Qualcomm Universal Peripheral)完全独立。这意味着:

  • 主 CPU 可以彻底断电(power collapse),不影响传感器采集

  • 不存在总线仲裁冲突

  • 时钟源可以独立配置到低频(节省动态功耗)

/* 设备树示意:SLPI 专用 I2C 端口配置 */
&slpi_i2c {
    status = "okay";
    clock-frequency = <400000>;  /* 400kHz I2C Fast Mode */

    imu@6a {
        compatible = "st,lsm6dso";
        reg = <0x6a>;
        interrupt-parent = <&slpi_gpio>;
        interrupts = <3 IRQ_TYPE_EDGE_RISING>;
    };

    baro@76 {
        compatible = "bosch,bmp390";
        reg = <0x76>;
    };
};

3. SLPI 子系统详解:Islands Mode 的核心机制

3.1 什么是 Islands Mode

Islands Mode 是高通低功耗设计的关键创新:将 Hexagon DSP 的一部分逻辑和存储划分为"岛",这个岛拥有独立的电源域和时钟域,可以在整个 SoC 大部分区域断电时继续运行。

与传统 MCU 的低功耗模式对比:

特性 传统 MCU Sleep 高通 Islands Mode
计算能力 无(需唤醒) 有限 DSP 指令集可用
内存 保持但不可访问 Island 内 TCM 可读写
外设访问 需唤醒 Island 内 I2C/SPI 可用
唤醒源 GPIO/Timer GPIO/Timer/传感器阈值
功耗量级 1-50μA 50-500μA(含采集)

3.2 Island Mode 内存模型

┌──────────────────────────────────────────────────────────┐
│                    SLPI 子系统                             │
├──────────────────────────────┬───────────────────────────┤
│     Island Domain(常开)     │    Big Domain(可关断)     │
├──────────────────────────────┼───────────────────────────┤
│  TCM (Tightly Coupled Mem)   │     DDR 映射区域           │
│  - Island 代码段 (~64KB)     │     - 完整 SEE 框架        │
│  - Island 数据段 (~128KB)    │     - 传感器算法库         │
│  - 传感器环形缓冲区          │     - QMI 协议栈           │
│  - 阈值/滤波参数             │     - 调试日志             │
├──────────────────────────────┼───────────────────────────┤
│  Island I2C/SPI Controller   │     DMA Engine             │
│  Island Timer                │     SMEM Controller        │
│  Island GPIO                 │     FastRPC Engine         │
└──────────────────────────────┴───────────────────────────┘

关键约束:Island Mode 下只能访问 TCM(通常 64-256KB),不能访问 DDR。这意味着运行在 Island 内的代码和数据必须严格控制尺寸。

3.3 uImage 框架

高通提供 uImage 框架来管理 Island Mode 内的执行环境:

  • uSleep:Island 内的低功耗调度器,在无任务时进入浅睡眠

  • uTimer:Island 内的定时器服务,精度到 μs 级

  • uTlmm:Island 内的 GPIO 控制

  • uI2C / uSPI:Island 内的总线驱动(API 集精简,不支持 DMA)

/* 伪代码:Island Mode 传感器驱动结构 */
#include <uimage/usleep.h>
#include <uimage/ui2c.h>

/* 标记为 Island Mode 可执行 —— 链接到 TCM */
__attribute__((section(".island_text")))
void sensor_island_poll(void)
{
    uint8_t buf[6];
    /* 在 Island Mode 下直接读 I2C */
    ui2c_read(SENSOR_HANDLE, IMU_ADDR, ACCEL_REG, buf, 6);

    int16_t accel_x = (buf[1] << 8) | buf[0];
    /* 阈值判断 —— 不唤醒主 CPU */
    if (abs(accel_x) > MOTION_THRESHOLD) {
        /* 超过阈值才退出 Island,通知主 CPU */
        island_exit_request(REASON_MOTION_DETECTED);
    }
    /* 否则数据写入环形缓冲区,继续 Island Mode */
    ring_buffer_push(accel_x);
}

4. 传感器驱动框架:SEE(Sensors Execution Environment)

4.1 SEE 架构分层

SEE 是高通传感器驱动的运行框架,完整运行在 SLPI 上:

层级 职责 运行域
Sensor Driver 具体硬件操作(I2C 读写、中断处理) Island/Big
Sensor API 标准化数据格式、采样率管理 Big Domain
SMGR Sensor Manager 多 Client 调度、功耗策略 Big Domain
QMI Service 与 Apps CPU 的接口 Big Domain

4.2 驱动注册与数据流

传感器驱动在 SEE 中注册时需要声明其 Island Mode 能力:

/* 伪代码:SEE 驱动注册结构 */
static const sns_sensor_api lsm6dso_api = {
    .struct_len     = sizeof(sns_sensor_api),
    .init           = lsm6dso_init,
    .deinit         = lsm6dso_deinit,
    .get_sensor_uid = lsm6dso_get_uid,
    .set_client_request = lsm6dso_set_client_request,
    .notify_event   = lsm6dso_notify_event,
};

static const sns_sensor_instance_api lsm6dso_instance_api = {
    .struct_len     = sizeof(sns_sensor_instance_api),
    .init           = lsm6dso_inst_init,
    .deinit         = lsm6dso_inst_deinit,
    .set_client_config = lsm6dso_inst_set_config,
    .notify_event   = lsm6dso_inst_notify,
};

/* 关键:island_capable 标志 */
sns_register_sensor(
    &lsm6dso_api,
    &lsm6dso_instance_api,
    .island_capable = true,   /* 声明支持 Island Mode */
    .island_size = 12288,     /* Island 内存需求 12KB */
);

4.3 数据不上主 CPU 的关键机制

SEE 框架提供以下机制实现数据在 SLPI 侧闭环:

1)Batching(批处理)

  • 将多个采样点积攒在 SLPI 侧的 FIFO 中

  • 达到"水位线"或超时才一次性上报

  • 主 CPU 可以在整个 Batch 周期内保持 Deep Sleep

2)Event Gating(事件门控)

  • SLPI 侧做阈值/条件判断

  • 只有满足条件的事件才上报

  • 例:加速度变化超过 0.5g 才通知

3)On-change Sensor(变化触发)

  • 仅在数值变化时生成事件

  • 适合接近传感器、光线传感器

  • 稳态时 SLPI 零上报,主 CPU 无打扰

4)Island Processing(岛内处理)

  • 简单算法直接在 Island Mode 内执行

  • 步数计算、跌倒检测等可不退出 Island

  • 全程不涉及 DDR 访问


5. 低功耗状态机设计

5.1 SLPI 功耗状态定义

SLPI 子系统有四个主要功耗状态:

状态 功耗范围 能力 退出延迟
Active 20-80mW 完整 DSP + DDR + 所有外设
Light Sleep 5-15mW DSP 暂停,外设保持,TCM 保持 <10μs
Island Mode 0.5-2mW Island 域工作,Big Domain 关断 50-200μs
Deep Sleep 50-200μW 仅保持 TCM 内容,等待中断唤醒 1-5ms

5.2 状态迁移策略

┌─────────────────────────────────┐
                    │          ACTIVE                   │
                    │  Full DSP + DDR + All Peripherals │
                    └──────────┬──────────┬────────────┘
                               │          │
            无任务 50μs 后     │          │  QMI 请求 / 大数据处理
                               ▼          │
                    ┌──────────────────┐   │
                    │   LIGHT SLEEP    │   │
                    │  DSP halt, SRAM  │◄──┘
                    │  retained        │
                    └────────┬─────────┘
                             │
          所有 Client 均为    │
          Island-capable     │
                             ▼
                    ┌──────────────────┐
                    │   ISLAND MODE    │◄─── 传感器中断(Island 内处理)
                    │  Only TCM + I2C  │
                    │  No DDR access   │
                    └────────┬─────────┘
                             │
          无活跃 Client,     │
          仅保持唤醒源       │
                             ▼
                    ┌──────────────────┐
                    │   DEEP SLEEP     │◄─── RTC 定时器 / GPIO 唤醒
                    │  TCM retained    │
                    │  All clocks off  │
                    └──────────────────┘

5.3 关键设计原则

原则一:最小唤醒域 —— 能在 Island 里完成的事,绝不退出到 Big Domain;能在 SLPI 完成的事,绝不唤醒 Apps CPU。

原则二:Batch 对齐 —— 多个传感器的 Batch 周期尽量对齐到同一个上报时刻,避免主 CPU 被碎片化唤醒。

原则三:尽早判断 —— 阈值判断放在最低功耗域执行。在 Island 内就能判定"不需要上报"的数据,绝不推到 Active 状态再判断。

6. 数据不上主 CPU 的休眠方案详解

6.1 方案全景

实现"传感器数据不上主 CPU"需要在以下层面协同设计:

层面 措施 效果
硬件 SLPI 独立 I2C 端口 主 CPU 可断电
固件 Island Mode 驱动 采集不退出 Island
框架 SEE Batching 减少上报频次
算法 阈值/融合在 SLPI 执行 只上报有意义事件
系统 Apps CPU 低功耗策略联动 无上报时进入 Deep Sleep

6.2 Apps CPU 侧配置

主 CPU 侧需要配置 Linux 电源管理以配合 Sensor Hub 的设计:

# 启用 Apps CPU Power Collapse(允许深度休眠)
echo "enabled" > /sys/devices/system/cpu/cpu0/cpuidle/state3/disable
# 这里 state3 通常对应 power collapse,具体 index 查看平台文档

# 配置 PM QoS —— 告诉系统可接受的唤醒延迟
# 10ms 延迟容忍 = 允许进入最深睡眠
echo 10000 > /dev/cpu_dma_latency

6.3 SLPI 侧 Batching 配置

通过 QMI 接口配置传感器 Batching:

/* 伪代码:配置 Batching 参数 */
sns_client_request_msg req = {
    .sensor_uid = LSM6DSO_ACCEL_UID,
    .msg_id     = SNS_STD_SENSOR_MSGID_CONFIG,
    .request    = {
        .sample_rate  = 100.0f,    /* 100Hz 采样 */
        .batch_period = 5000000,   /* 5 秒批处理周期(单位 μs) */
        /* 含义:每 5 秒上报一次 500 个样本 */
        /* 这 5 秒内主 CPU 可以持续 Deep Sleep */
    },
};
sns_client_send_request(&client_handle, &req);

6.4 Wakeup Batching vs Non-Wakeup Batching

模式 行为 适用场景
Wakeup Batching Batch 满后强制唤醒主 CPU 数据不可丢失(导航、记录)
Non-Wakeup Batching Batch 满后暂存,等主 CPU 自然唤醒时取 数据可容忍延迟(环境监测)
Flush on FIFO Full FIFO 满时强制刷新 避免数据覆盖

6.5 实际功耗收益估算

以 100Hz IMU + 1Hz 气压计场景为例:

传统方案(主 CPU 轮询):
  主 CPU Active: 2W × 持续运行 = 2W
  总系统功耗贡献: ~2W

Sensor Hub 方案(5s Batch):
  Island Mode 采集: 1.5mW × 持续运行 = 1.5mW
  主 CPU 唤醒处理: 2W × 2ms × (1/5s) = 0.8mW
  总系统功耗贡献: ~2.3mW

功耗降低: ~870x

7. 唤醒策略与中断管理

7.1 唤醒源层级

优先级   唤醒源                    目标状态        典型延迟
─────────────────────────────────────────────────────────
 高      传感器 DRDY 中断          Island Mode     <50μs
 中      Batch 水位线中断          Active          50-200μs
 低      QMI 请求(来自 Apps)     Active          100-500μs
 最低    RTC 定时器               按需             1-5ms

7.2 中断路由设计

传感器中断在 SLPI 子系统内有专门的路由路径:

/* 伪代码:SLPI 中断配置 */
typedef struct {
    uint32_t gpio_num;        /* SLPI GPIO 编号(非 Apps GPIO) */
    uint32_t trigger_type;    /* RISING_EDGE / LEVEL_HIGH */
    bool     island_capable;  /* 是否能在 Island Mode 下触发 */
    void     (*handler)(void*);
} slpi_irq_config_t;

/* IMU Data Ready 中断 —— Island 内处理 */
slpi_irq_config_t imu_irq = {
    .gpio_num       = SLPI_GPIO_3,
    .trigger_type   = IRQ_TRIGGER_RISING,
    .island_capable = true,   /* 关键:不退出 Island 即可响应 */
    .handler        = imu_data_ready_handler,
};

7.3 避免虚假唤醒

在实际产品中,虚假唤醒是功耗优化的大敌:

虚假唤醒原因 对策
I2C 总线毛刺触发中断 硬件去抖 + 中断后验证寄存器状态
非 Island 代码路径被误触发 严格标记 island_capable
Batch 水位线设置过低 根据应用场景调整(建议 ≥1s)
多传感器中断不对齐 使能硬件 FIFO + 合并中断

8. 实战:IMU + 气压计的 Sensor Hub 低功耗方案

8.1 需求场景

一个工业巡检机器人需要:

  • 持续姿态监测:100Hz IMU,用于检测跌倒/碰撞

  • 环境气压记录:1Hz 气压计,用于楼层判断

  • 功耗预算:传感器子系统 ≤5mW(电池供电巡检模式)

  • 响应延迟:碰撞检测 ≤10ms 唤醒主 CPU

8.2 数据处理全流程

8.3 配置要点

步骤 1:设备树配置 SLPI I2C 端口

&slpi_i2c2 {
    status = "okay";
    clock-frequency = <400000>;

    /* LSM6DSO IMU —— 支持硬件 FIFO + Island Mode */
    imu@6a {
        compatible = "st,lsm6dso";
        reg = <0x6a>;
        interrupt-parent = <&slpi_tlmm>;
        interrupts = <5 IRQ_TYPE_EDGE_RISING>;   /* SLPI GPIO 5 */
        st,int-pin = <1>;
        /* 硬件 FIFO watermark = 500 samples */
        st,fifo-watermark = <500>;
    };

    /* BMP390 气压计 —— 低频采样,Non-Wakeup */
    baro@76 {
        compatible = "bosch,bmp390";
        reg = <0x76>;
        /* 无中断线,使用 Timer 轮询(1Hz) */
    };
};

步骤 2:SEE 驱动 Island 配置

/* 伪代码:LSM6DSO Island Mode 驱动配置 */
static sns_island_config lsm6dso_island_cfg = {
    .island_capable    = true,
    .tcm_code_size     = 4096,    /* 4KB 代码段 */
    .tcm_data_size     = 8192,    /* 8KB 数据段(含环形缓冲区) */
    .island_services   = {
        .i2c  = true,             /* 需要 Island I2C */
        .gpio = true,             /* 需要 Island GPIO(中断) */
        .timer = false,           /* 靠硬件中断触发,不需要 Timer */
    },
};

/* 碰撞检测阈值 —— 在 Island 内判断 */
#define COLLISION_THRESHOLD_MG  2000  /* 2g */
#define BATCH_WATERMARK         500   /* 5s @ 100Hz */

步骤 3:Apps 侧电源管理联动

# 确认 SLPI remoteproc 已加载
cat /sys/class/remoteproc/remoteproc2/state
# 期望输出: running

# 配置 CPU idle 最大深度
echo 1 > /sys/module/lpm_levels/parameters/sleep_disabled
# 0 = 允许所有低功耗级别

# 监控 SLPI 唤醒统计
cat /sys/kernel/debug/rpm_stats
cat /sys/kernel/debug/slpi/power_stats

8.4 功耗测量验证

# 使用高通 power profiler 工具测量
adb shell "cat /sys/bus/platform/devices/soc:qcom,sensor-hub/power/runtime_status"
# 期望:suspended(大部分时间)

# 查看 SLPI 唤醒次数
adb shell "cat /sys/kernel/debug/slpi/island_stats"
# island_entry_count: 12345
# island_exit_count: 25        (仅 Batch 上报时退出)
# avg_island_duration_ms: 4998 (接近 5s Batch 周期)

9. 调试与功耗测量方法

9.1 常见问题排查

症状 可能原因 排查方法
SLPI 不进入 Island Mode 驱动未标记 island_capable 检查 SEE 驱动注册参数
Island 频繁退出 TCM 溢出或非 Island 代码被调用 检查 island_exit 日志
主 CPU 无法进入 Deep Sleep SLPI 唤醒源配置错误 检查 rpm_stats
Batch 数据丢失 FIFO 溢出,水位线过高 降低 watermark 或增加 FIFO 深度
唤醒延迟超预期 IPC 中断优先级配置不当 检查 GIC 中断优先级

9.2 调试工具链

# 1. SLPI 日志抓取(通过 mini-dm)
adb shell "echo 1 > /sys/kernel/debug/slpi/log_enable"
adb shell "cat /dev/slpi_log" | grep -i "island"

# 2. 电源状态监控
watch -n 1 "cat /sys/kernel/debug/slpi/power_stats"

# 3. QMI 消息跟踪
adb shell "echo 0x1F > /sys/module/sns_qmi/parameters/debug_mask"
# 查看 /var/log/sensor_qmi.log

# 4. 硬件功耗测量(推荐 Monsoon Power Monitor)
# 连接 SLPI VDD 供电轨,观察电流波形
# 正常 Island Mode: ~500μA 基线 + 周期性 1-2mA 尖峰(I2C 采集)

9.3 功耗优化检查清单

  • 所有常驻传感器驱动标记 island_capable
  • Island TCM 使用量 < 75%(留余量防止 OOM 退出)
  • Batch 周期 ≥ 1s(避免频繁唤醒)
  • 多传感器 Batch 周期对齐(如都设为 5s 的整数倍)
  • Non-Wakeup 模式用于非关键数据
  • 碰撞/紧急事件走 Island 内判断 + 直接 IPC 唤醒
  • Apps CPU idle 状态允许 Power Collapse
  • 验证 SLPI Island 退出次数与预期一致
  • Monsoon 实测功耗与理论估算偏差 < 20%

10. 结语

Sensor Hub 低功耗开发的核心思路可以凝练为一句话:让数据的处理层级与其重要性匹配

  • 常规监测数据 → Island Mode 内采集缓存,批量上报

  • 阈值告警事件 → Island 内判断,即刻唤醒

  • 复杂算法结果 → Active 模式处理,但频次降到最低

这个分层策略不仅适用于传感器场景,也是整个嵌入式低功耗设计的通用范式。在工业机器人领域,合理的 Sensor Hub 方案可以将电池寿命从"小时级"提升到"天级",这对于巡检机器人、无人叉车等应用场景具有决定性意义。

下一篇(第 5 篇)我们将进入功能安全领域,探讨 IEC61508 SIL3 标准下高通 IQ 系列的安全岛硬件架构与锁步双核机制。


参考资料

  1. Qualcomm Sensors Execution Environment SEE Developer Guide, Qualcomm Developer Network

  2. Qualcomm Hexagon DSP Architecture Reference Manual

  3. QRB5165 / QCS6490 Hardware Register Description — SLPI Subsystem Chapter

  4. Qualcomm Low Power Island LPI Technical Brief, 2023

  5. "Sensor Batching in Android: HAL and Framework", Android Source Documentation

  6. STMicroelectronics LSM6DSO Datasheet — Embedded FIFO Configuration

  7. Bosch BMP390 Datasheet — Low Power Measurement Modes

  8. Qualcomm Industrial IoT Platform — Power Optimization White Paper

  9. Linux Kernel Documentation: drivers/remoteproc/ — Remote Processor Framework


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐