sensor挂载在Ap侧处理,驱动生成对应设备节点给上层上报数据。sensor需要一直处于工作状态,导致很多场景系统不能进入深度休眠,产生功耗问题。
SensorHub是一种基于低功耗MCU和轻量级RTOS操作系统之上的软硬件结合的解决方案,为了解决功耗问题而产生的,主要功能是连接并处理来自各sensor的数据。
SCP架构(system companion processor):采用sensorhub。基于低功耗的MCU和轻量级RTOS操作系统之上的软硬件结合方案,一般称为SRAM空间。
adsp架构:将sensor放到adsp(audio dsp; dsp: 应用数字信号处理系统)中,待机时主处理器休眠以降低功耗,adsp在处理音频数据的间隙处理sensor数据,以减小功耗。
slpi架构:slpi(sensor low power island)
本质:CPU的二级缓存(即外部缓存,L2 cache、TCM),通过SRAM器件实现,空间大小由硬件限制,后期一般无法调整大小。
原理:SRAM不需要实时刷新电路就能够保存数据,所以具有静止存取数据的作用,功耗较低;DRAM需要不停地反复刷新电路,否则内部的数据将会消失,因此功耗会高。
需要运行在island mode的业务一般是Sensor、Audio等领域,涉及业务包含器件驱动、计步、语音唤醒、AONCamera等需要在AP休眠后仍继续运行的业务。
大小:其大小可以在相应芯片手册sensors overview上查到。也可以在编译log中看到,可以搜索如下关键字:
Island Meminfo for: SSC_TCM_PHYSPOOL 表示Sensor空间
Island Meminfo for: QURTOS_SSC_ISLAND_POOL 表示Sensor空间
Island Meminfo for: AUDIO_TCM_PHYSPOOL 表示Audio空间
Total island space copied at boot 表示已使用空间
Total island space left in island pool 表示剩余空间
高通平台的island划分在不同的物理片区,sensor 的空间 oversize 不会影响 audio , audio 的空间 oversize 也不会影响 sensor 。
audio/sensor 低功耗空间目前基本遵循各 50% 的原则,而高通原始基线一般 audio 预分配空间占用会超过 50% , sensor 预分配空间会低于 50% ,有时会导致sensor的驱动或者自研算法无法加进island mode,这时候就需要手动调整低功耗空间分区大小。
不同PD之间划分内存大小必须以 64K 的整数倍进行,否则会因为内存对齐方式造成内存浪费
从audio 划分内存到 sensor 空间,一般是裁剪 audio 的 heap 空间,再划分至 sensor 空间
可以参考如下修改方案:
adsp_proc/build/chipset/divar/adsp/qdsp6.xml
<physical_pool name="QURTOS_VA_ISLAND_POOL">
<region base="0x0A000000" size="0x60000" name="QURTOS_ISLAND_REGION_TCM" cache_policy="l1_wb_l2_uncacheable"/>
</physical_pool>
<physical_pool name="QURTOS_SSC_ISLAND_POOL">
<region base="0x0A060000" size="0x20000" name="QURTOS_ISLAND_REGION_TCM" cache_policy="l1_wb_l2_uncacheable"/>
<region allocate="island" size="0x40000" name="QURTOS_ISLAND_REGION_DDR" cache_policy="l1_wb_l2_cacheable"/>
</physical_pool>
SSC的base = VA的base +VA的size
VA让出的size可以加到SSC的size上
可以按照oem示例代码添加sensor器件或算法,默认是配置到DDR空间上:
adsp_proc\ssc\chipset\kodiak\por.py
include_sensor_vendor_libs.extend(['lsm6dso',
'sns_mmc56x3x',
'sns_newsensor',
'sns_ltr311'])
添加算法为include_algo_libs
如果需要添加到island空间:
adsp_proc\ssc\chipset\kodiak\por.py
env.AddUsesFlags(['SNS_ISLAND_INCLUDE_NEWSENSOR'])
同时需要在newsensor
的.scons文件中添加:
newsensor_island_enable = True
...
add_island_files = newsensor_island_enable
这样编译时就会将以_island.c结尾的文件添加进island空间