高通ADSP Sensor框架:
linux驱动由浅入深系列:高通sensor架构实例分析之二(驱动代码结构)
linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)
高通SEE Sensor框架:
高通SDM845平台Sensor学习——3.SLPI(Physical Sensor)
高通SDM845平台Sensor学习——4.SLPI(SAM Sensor)
msm8960之前是adsp(Audio DSP)架构,现在换成SEE(Sensor Exclute Environment)架构了。
一、ADSP(Audio DSP)架构
1. adsp架构简介
最初的时候芯片厂家对sensor的处理和对待其它外设一样都是直接挂在processor上,sensor的驱动也和其他linux或android的驱动一样,生成对应的设备节点给上层提供数据。但后来这一切发生了变化,最主要的原因就是功耗。Sensor希望自己能够一直处于工作状态下,如计步器等应用场景。这样如果sensor还挂在主processor上势必影响待机功耗。因此各个芯片厂推出了各自的方案,如sensor-hub等等。高通在MSM8960之后就将sensor的处理塞到了一个单独的音频dsp中了(MSM8953中这个dsp叫作aDSP),这样待机时主处理器休眠降低功耗,由这个aDSP在处理音频数据的间隙捎带着就能把sensor的数据处理了。
2. 以MSM8953为例的ADSP架构图
3. 在应用处理器中,软件接口中不再有每个sensor的设备节点了。那有的是什么呢,只有Sensor1 API Socket Remoting Layer层对应的 (CPU与
ADSP之间是通过Socket通信的!)API接口。
4. 那么ADSP与应用处理器之间用什么机制进行通信呢?图中可以看到一个叫QMI的东西,就是它了,这个高通基于共享内存机制开发的多核间
通信技术,在应用处理器侧和ADSP侧都有相应的库已经完成了底层实现。之后有机会分析一下这种号称最为有效的多核间通信技术。
5. ADSP与CPU之间通过QMI进行通信的。QMI就是高通基于共享内存机制开发的多核间通信技术。
6. 系统带有的传感器测试代码
系统自带的:
hardwarelibhardware ests
usensors
usensors.cpp
作用:可以列出系统中存在的所有的传感器,监听并打印出传感器的数据。
高通专有的:
(1) vendorqcomproprietarysensorsdsps estsrcsns_cm_test.cpp
(2) vendorqcomproprietarysensorsdsps estsrcsns_dsps_tc0001.c
(3) 测试程序:
vendor/qcom/proprietary/sensors/qsensortest/src/com/qualcomm/qti/sensors/core/sensortest/SensorTest.java
JNI文件:
vendor/qcom/proprietary/sensors/dsps/sensortest/jni/src/sensor_test.c
7. Sensor上报数据的三种方式
(1) Polling (0x00) 调用一次get_data后启动timer,等到timer到时间后调用sns_ddf_driver_if_s中指定的handle_timer()函数上报一组传感器数据
(2) DRI (0x80) 调用enable_sched_data()启用DRI(Data ReadyInterrupt,数据完成中断),按照set_cycle_time指定的ODR(Output Data Rate,数据输出速率)进行数据采集,采集完成后调用sns_ddf_driver_if_s中指定的handle_irq()函数上报传感器数据。
(3) FIFO (0xD0) 调用trigger_fifo_data()函数启动FIFO模式,当数据量到达指定的阈值,触发sns_ddf_smgr_data_notify()函数上报一批数据。
一般加速度、陀螺仪等数据量较大的使用FIFO模式,光线、距离等有数据有变化才需要上报的传感器使用DRI模式。
二、SEE(Sensors Execution Environment)架构
1. SEE框架简介
高通从SDM845平台开始,Sensor使用新的架构SEE(Sensors Execution Environment),和之前架构不同,新的架构有着很多的优点。
2. config都是以 .json 为后缀的文件,每个物理sensor会有两个json文件,一个是包含所有平台的特殊配置文件,另一个是sensor driver
的特殊配置文件。
3. 各个sensor都是通过xxxx.scons静态添加sensor的。