高通SEE架构深度解析(4): 传感器管理组件之传感器注册全流程解析
💡 前言
在移动端开发中,传感器(Sensors)的接入往往是系统稳定性的第一道关口。高通在 SDM845 及后续平台中引入了 SEE (Sensors Execution Environment) 架构,将传感器处理放到了低功耗岛(SLPI)中 。

很多刚接触 SEE 架构的同学会被 SUID、Registry、JSON Config 等概念绕晕。今天我们就结合 SM8550 平台的实现,彻底拆解传感器从硬件连接到被 Android HAL 识别的“闭环注册”全逻辑 。
一、 注册前的“入场券”:硬件适配与 Config 定义
在传感器被系统识别前,必须满足“身份信息”与“通信能力”两大前置条件 。
1. 硬件连接与驱动标准化
-
物理连接:传感器需按高通平台规范完成硬件连接,包括I²C/SPI通信总线传(如加速度计常用地址
0x18)以及电源(vdig/vana)、控制引脚(reset/GPIO)的配置 。 -
硬件ID匹配:驱动中预设的芯片 ID 必须与物理芯片一致(如 BMA150 的 ID 需设为
0x00),否则会导致识别失败 。 -
驱动入口:传感器驱动需遵循SEE架构的标准化接口,实现
snns_sensor结构体定义的核心API(如get_sensor_uuid()获取SUID、create_instance()创建实例),并集成到SLPI(Sensor Low Power Island,传感器低功耗岛)的驱动框架中。例如,加速度计驱动需在/adsp-proc/ssc/sensors/icm426xx/目录下编写,通过snns_register_icm426xx()作为驱动入口函数。
2. JSON Config:传感器的“身份证”
SEE 架构通过位于 /persist/sensors/registry/config/ 和 /vendor/etc/sensors/config/ 的 JSON 文件定义静态配置 :
-
平台通用配置:定义传感器类型、采样率范围(如 0.1Hz-1000Hz)、功耗等级、数据格式(浮点/定点)等 。
-
驱动专用配置:定义厂商专属参数,如 I²C 速率、寄存器初始化序列(如传感器上电后需写入0x01寄存器开启采集)、硬件 ID 匹配规则(格式为sensor_name_hardware_id,如accel_bma150_0x00)等 。
Tips: 如果 Config 文件缺失,SEE 模块会自动填充驱动内置的默认参数,确保流程不中断 。
二、 核心注册流程:四步闭环
传感器注册遵循“定义-注册-存储-可见”的逻辑 。分为静态注册/动态注册两种模式(静态注册为主流),最终通过注册表(Registry)实现传感器信息的统一管理。
第一步:驱动静态注册(编译阶段)
SEE架构在系统编译时,通过SLPI层的静态注册机制将传感器驱动“挂载”到SEE框架,这是大多数物理传感器的注册方式,核心在于 .scons 脚本中的 add_sscsu() 函数 。
- build脚本配置:在传感器驱动的build脚本(如snns_icm426xx.scons)中,通过add_sscsu()函数声明驱动入口与编译规则。例如:
# 示例:ICM206XX 驱动 build 脚本片段
if 'uses_ssc_static_lib_builder' in env:
env.add_sscsu(
inspect.getfile(inspect.currentframe()),
[cite_start]flavor="hexagon", # 适配 SLPI 的 Hexagon 架构 [cite: 29]
[cite_start]register_func_name="sns_register_icm206xx", # 驱动入口函数 [cite: 29, 30]
[cite_start]add_island_files=icm206xx_island_enable, # 启用低功耗岛 [cite: 32, 33]
chipset="lahaina" # SM8550新增必填参数
)
系统启动时,SLPI 层会调用 register_static_sensors(),遍历静态传感器列表,执行每个驱动的入口函数,该入口函数会:
-
- 初始化
snns_sensor结构体(传感器核心描述符),设置回调函数(如get_sensor_uuid()返回SUID、notify_event()处理事件);
- 初始化
-
- 调用传感器管理模块的
register_sensor()接口,提交传感器的基础信息(类型、SUID、支持的属性)。
- 调用传感器管理模块的
第二步:Registry 注册表的生成与更新
Registry 是 SEE 架构中传感器的“数据库”,位于 /persist/sensors/registry/registry 。
- 初始生成:系统首次启动时,传感器管理模块读取
/persist/sensors/registry/config/下的JSON配置文件,解析传感器的静态参数(如SUID、采样率范围),生成初始Registry文件,格式为二进制(便于快速读取); - 动态更新:若驱动需要修改配置(如 runtime 调整功耗等级),可通过发送
UPDATE_REGISTRY请求给传感器管理模块,模块验证请求合法性后,更新Registry中的对应字段,并同步到所有依赖该传感器的客户端(如通知Android HAL“传感器功耗参数已变更”); - 重启加载:设备重启时,传感器管理模块优先加载Registry文件,无需重新执行全量注册流程,减少启动时间——若Registry文件损坏或缺失,则重新读取Config文件生成新Registry。
第三步:SUID 分配(唯一标识符)
每个传感器都会被分配一个 128位的 SUID,作为其在系统中的“身份证” 。
-
分配规则:优先使用 Config 指定值(如"suid": “0x1234567890ABCDEF”);若无,则根据“类型+硬件ID+平台信息”生成(如BMA150加速度计在SDM845上的SUID为0x00010002000300040005000600070008) 。
-
作用:Android HAL 在请求数据时,必须通过 SUID 指定目标,防止加速度计与陀螺仪混淆 。
第四步:客户端可见性配置
传感器注册完成后,传感器管理模块需将传感器信息同步给上层客户端(如Android HAL、CHRE NanoApp),确保客户端可查询到该传感器:
-
接口暴露:模块通过通用客户端API(如
get_sensor_list())将传感器列表(含SUID、类型、属性)暴露给客户端。例如,Android HAL调用get_sensor_list()时,模块从Registry中读取所有已注册传感器的信息,封装为SensorInfo结构体返回; -
权限过滤:根据 Config 定义的规则,系统会限制普通应用和系统应用的访问权限(如心率、指纹等敏感传感器) 。
三、 协作网络:关键组件交互
注册不是单打独斗,而是多个组件协作的结果 :
-
SLPI 层:负责驱动加载及硬件状态监控(如总线断开则停止注册) 。
-
客户端管理器:负责权限校验与 Session(会话) 初始化,提升响应速度 。
-
内存管理器:为 Registry 分配持久化内存(Persist 分区),并管理驱动注册时的临时缓存 。
四、 补充:动态注册场景
除了上述静态注册,SEE 还支持热插拔传感器(如外接蓝牙心率带)或虚拟传感器 :
-
触发:调用
dynamic_register_sensor()接口 。 -
管理:生成临时 Registry 条目(重启后失效)并分配临时 SUID 。
-
通知:通过
SENSOR_ADDED事件广播,客户端即可立即请求数据 。
📝 总结:传感器注册的设计价值
高通SEE架构的传感器注册流程,通过“静态为主、动态为辅”的模式、Registry的持久化管理、SUID的唯一标识,解决了传统架构的三大痛点:
-
高兼容性:标准化接口,换个厂商的传感器(如博世换意法)无需重构框架 。
-
高效率:Registry 机制大幅优化了开机启动速度 。
-
高灵活性:完美支持物联网与可穿戴设备的热插拔需求 。
这一流程不仅是传感器接入SEE架构的“入口”,更是后续数据采集、配置控制、安全隔离的基础,体现了SEE架构“模块化、标准化、可扩展”的设计理念。
📢 :大家在适配高通传感器驱动时,有没有遇到过 SUID 冲突或者 Registry 生成失败的情况?欢迎在评论区交流避坑经验!
更多推荐

所有评论(0)