Android Qcom Sensor架构学习

news2024/11/24 14:15:08

Android Sensor Brief Flow

在这里插入图片描述

Android Sensor Specific Flow

在这里插入图片描述

ADSP SSC

ADSP.VT.5.4.1/adsp_proc/ssc_api/pb/
ADSP.VT.5.4.1/adsp_proc/ssc/sensors
ADSP.VT.5.4.1/adsp_proc/ssc/frameworks

ADSP Framework初始化的时候首先通过load image并初始化的静态加载方式register_static_sensors
ssc_static_lib_builder.py 会编译出静态加载的sensor列表 framework/build/sensor_img/…/sns_static_sensors.c
sensor的入口是register_function 定义在具体sensor的目录下的scons中 ssc/sensor/xxx/build/xxx.scons island_mode 支持低功耗

if 'USES_SSC_STATIC_LIB_BUILDER' in env:                 
  env.AddSSCSU(inspect.getfile(inspect.currentframe()),
               register_func_name = 

如果是动态加载的话,则是ssc/framework/dl/src/sns_dynamic_sensors.c,没具体研究

registry用于存放sensor信息的,放置在perisist分区,可通过registry sensor获取
通过/vendor/etc/sensors/config/<sensor_name><hardware_id>.json生成

mnt/vendor/persist/sensors/registry/
registry
sensor_list.txt
sensors_settings

在sensor_api::notify_event的过程中一般都会去处理registry,physical sensor包含很多硬件配置

if(SNS_REGISTRY_MSGID_SNS_REGISTRY_READ_EVENT == event->message_id)
  {
    sns_registry_read_event read_event = sns_registry_read_event_init_default;
    pb_buffer_arg group_name = {0,0};
    read_event.name.arg = &group_name;
    read_event.name.funcs.decode = pb_decode_string_cb;
   
    if(!pb_decode(&stream, sns_registry_read_event_fields, &read_event))
    {
      SNS_PRINTF(ERROR, this, "Error decoding registry event");
    }else
    {
        ...
        sns_registry_phy_sensor_pf_cfg phy_sensor_pf_cfg;
        memset(&phy_sensor_pf_cfg, 0, sizeof(phy_sensor_pf_cfg));
        sns_registry_decode_arg arg = {
          .item_group_name = &group_name,
          .parse_info_len = 1,
          .parse_info[0] = {
              .group_name = "config",
              .parse_func = sns_registry_parse_phy_sensor_pf_cfg,
              .parsed_buffer = &phy_sensor_pf_cfg
          }
        };

        read_event.data.items.funcs.decode = &sns_registry_item_decode_cb;
        read_event.data.items.arg = &arg;

        rv = pb_decode(&stream, sns_registry_read_event_fields, &read_event);
     ...
}

json中具体的配置,与解析后的应用后续再研究

sns_sensor::init -> publish_attibutes (physical sensor -> platform define name)
ltrx1303_publish_attributes -> "ambient_light"
icm4x6xx_accel_publish_attributes -> "accel"
sns_publish_attribute(this, SNS_STD_SENSOR_ATTRID_TYPE, &value, 1, false);

HAL SSC

https://source.android.google.cn/devices/sensors/sensors-multihal?skip_cache=true&hl=zh-cn

/hardware/interfaces/sensors/common/default/2.X/multihal/HalProxy.cpp
/vendor/qcom/proprietary/sensors-see/ssc/sns_std_sensor.proto -> sns_std_sensor.pb.h 
/vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/framework/
/vendor/qcom/proprietary/sensors-see/sensors-hal-2.0/sensors/
vendor/qcom/proprietary/sensors-see/registry/config

SENSOR_MODULE_INIT初始化会注册两个unordered_map: callbacks and datatypes

sensor_factory::register_sensor  sensorType define in sensors_qti.h    
sensor_factory::request_datatype dataType   "accel" 

get_available_sensors(callbacks)
     push_back(make_unique<sensor>suid, SENSOR_WAKEUP))    //construct sensor 
     push_back(make_unique<sensor> suid, SENSOR_NO_WAKEUP)) //construct sensor
         set_type                  //QTI_SENSOR_TYPE
         set_string_type           //QTI_SENSOR_STRING_TYPE
         set_nowk_msgid            //SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_PHYSICAL_CONFIG_EVENT
         set_sensor_typename       //"Accelerometer" "SAR Sensor" 

无论时HAL与ADSP通信,还是ADSP内各sensor的通信,必须通过send_request, 通信的过程必须遵从protocol-buffers
其中最重要的两点需要suid和msg_id,suid时指定sensor(platform sensor:suid sensor,physical sensor:accel,virtual sensor:amd)

sensors_hal::activate  ssc_sensor::activate 
suid_lookup lookup
    const sensor_uid LOOKUP_SUID = {                          //与suid sensor通信
        12370169555311111083ull,
        12370169555311111083ull
    };                 
pb_req_msg.set_msg_id(SNS_SUID_MSGID_SNS_SUID_REQ);           //请求具体sensor的suid 
            
lookup.request_suid                                           //通过stringtype获取具体sensor的suid        
send_sensor_config_request
    create_sensor_config_request()
       pb_req_msg.mutable_suid()->set_suid_high(_suid.high);  //request通信携带具体sensor的suid
       pb_req_msg.mutable_suid()->set_suid_low(_suid.low);
       _ssc_conn->send_request 
            if (stream_type == SNS_STD_SENSOR_STREAM_TYPE_STREAMING)  //attributes中的SNS_STD_SENSOR_ATTRID_STREAM_TYPE
                 pb_req_msg.set_msg_id(SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_CONFIG);//
            else
                 pb_req_msg.set_msg_id(SNS_STD_SENSOR_MSGID_SNS_STD_ON_CHANGE_CONFIG)   

在这里插入图片描述

APP and Framework

/frameworks/base/core/java/android/hardware/SensorManager.java
/frameworks/base/core/java/android/hardware/SystemSensorManager.java
Typical Sensor Type
* Sensor.TYPE_LIGHT:光传感器
* Sensor.TYPE_GRAVITY:重力传感器
* Sensor.TYPE_PRESSURE:压力传感器
* Sensor.TYPE_ALL: 所有支持的传感器
* Sensor.TYPE_ORIENTATION:方向传感器
* Sensor.TYPE_GYROSCOPE:陀螺仪传感器
* Sensor.TYPE_MAGNETIC_FIELD:磁场传感器
* Sensor.TYPE_AMBIENT_TEMPERATURE:温度传感器
* Sensor.TYPE_LINEAR_ACCELERATION:线性加速度传感器

如果是非典型的sensor类型,或者是客制化的,则需要从所有传感器类型中通过getStringType进行过滤,
注册并激活所需要的sensor,创建SensorEventQueue用于数据分发调用回调 onAccuracyChanged onSensorChanged
在注册时需要注意isWakeUpSensor判断,因为在HAL初始化的时候我们知道同一类型sensor又会细分为两种类型
SENSOR_WAKEUP和SENSOR_NO_WAKEUP,SENSOR_WAKEUP在系统休眠时也可以上报事件,可以用作抬腕唤醒等功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构期末刷题

写在前面 此篇文章是在网络上搜集的题目&#xff0c;每一题都可能出现错误&#xff0c;如果各位大佬发现了错误&#xff0c;请在评论区回复一下&#xff0c;看到了就会改 树 根据遍历序列&#xff0c;画树&#xff0c;求另外一种遍历序列 以下中序遍历简称为中序&#xff0…

电路设计 > eMMC应用和PCB layout布局布线参考设计

目录 eMMC介绍 eMMC信号大体介绍 EMMC4.5和5.0封装和兼容性对比 EMMC5.0和5.1封装和兼容性对比 PCB Layout建议 PCB layout参考设计 参考设计1 参考设计2 参考设计3 参考设计4 参考设计5​​​​​​​ eMMC介绍 主要针对现在主流的eMMC5.0以及以上版本。 eMMC信号…

centos 7 安装node-red

一、安装nodejs https://nodejs.org/en/download/ 将其上传到服务器/usr/local/src目录下 下载之后是xz文件&#xff0c;解压xz文件 xz -d node-v16.18.1-linux-x64.tar.xz 解压之后会多一个tar文件&#xff0c;解压tar文件 tar -vxf node-v16.18.1-linux-x64.tar mkdir …

Navicat远程连接MySQL服务器

文章目录一、准备二、配置Navicat允许远程连接MySQL数据库1、使用Navicat直接连接MySQL2、使用 Navicat 通过 SSH 远程登录后再本地方式连接 MySQL3、查看连接为什么使用ssh登录1.便捷性Navicat:数据库可视化工具 一、准备 一台开启 SSH 登录的 Ubuntu 服务器 或 已开启远程登…

PyTorch学习笔记-神经网络Torch.NN基本骨架的使用及卷积原理

1. torch.nn.Module介绍 torch.nn 能够帮助我们更优雅地训练神经网络&#xff0c;使神经网络代码更加简洁和灵活。官方文档&#xff1a;Torch.NN。 在文档中可以看到第一块内容叫做 Container&#xff08;容器&#xff09;&#xff0c;这就相当于神经网络的骨架&#xff0c;C…

U2Net——U-Net套U-Net——套娃式图像分割算法

U2Net1 相关参考2 U2−NetU^2-NetU2−Net 网络结构3 网络代码和测试1 相关参考 论文名称&#xff1a; U2-Net: Goging Deeper with Nested U-Structure for Salient Object Detetion 论文地址&#xff1a; https://arxiv.org/abs/2005.09007 官方源码&#xff1a; https://git…

机器视觉_工业相机及相关配件选型

文章目录工业相机一、 概述二、 相机参数1. 传感器芯片1.1. CCD&CMOS1.2. CCD1.3. CMOS1.4. 靶面1.5. 传感器芯片选型2. 黑白or彩色3. 帧数⭐4. 接口类型4.1. POE供电三、相关硬件1. 镜头1.1. 焦距2. 光源3. 控制器4. 工控机5. 线缆6. 交换机四、参考工业相机 一、 概述 …

基于FPGA的呼叫设备verilog开发

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 随着集成电路技术的发展&#xff0c;电子设计自动化&#xff08;EDA&#xff09;逐渐成为重要的设计手段&#xff0c;已经广泛应用于模拟与数字…

Vite+Vue3+TS项目创建及基本环境搭建

1.vite项目搭建 可以按照vite官网操作&#xff1a;https://cn.vitejs.dev/guide/features.html#typescript npm create vitelatest自定义template模板 vscode-文件-首选项-配置用户代码片段-vue.json 添加如下代码即可快速创建vue模板 {"template": {"pref…

做好供应商关系管理,让企业采购交易更简单

大家都知道&#xff0c;企业想要采购到物美价廉的产品与服务&#xff0c;就必须做好相应的供应商管理工作。而其中供应商关系管理是采购过程中至关重要的环节&#xff0c;也是能让企业有效地与供应商之间保持良好关系&#xff0c;这不仅有利于促进采供双方共赢&#xff0c;而且…

Netty入门--传统IO与NIO详解

文章目录IO模型传统阻塞的IO模型--BIOClient端案例Server端案例NIO&#xff08;Java non-blocking IO&#xff09;非阻塞IONIO的三大组件 Channel Selector BufferBuffer&#xff08;缓冲区&#xff09;Channel&#xff08;通道&#xff09;Channe的分类&#xff0c;与Buffer的…

【Spring(六)】使用篇:AOP在开发中的使用

有关Spring的所有文章都收录于我的专栏&#xff1a;&#x1f449;Spring&#x1f448; 目录 一、前言 二、演示 三、切面类中声明通知方法 四、使用 相关文章 【Spring&#xff08;一&#xff09;】如何获取对象&#xff08;Bean&#xff09;【Spring&#xff08;一&#xff09…

刷爆力扣之数组形式的整数加法

刷爆力扣之数组形式的整数加法 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

Nodejs -- 一文了解Express模块

文章目录1. 初识Express1.1 Express简介1.1.1 什么是Express1.1.2 进一步理解Express1.1.3 Express能做什么1.2 Express的基本使用1.2.1 安装1.2.2 基本使用1.2.3 监听GET请求1.2.4 监听POST请求1.2.5 把内容响应给客户端1.2.6 获取URL中携带的查询参数1.2.7 获取URL中的动态参…

一文读懂TCP的三次握手(详细图解)

在学习TCP三次握手的过程前&#xff0c;首先熟悉几个缩写简称&#xff1a; TCB 传输控制块&#xff0c;打开后服务器/客户端进入监听&#xff08;LISTEN&#xff09;状态 SYNTCP报文标志位&#xff0c;该位为1时表示发起一个新连接ACKTCP报文标志位&#xff0c;该位为1时&…

傻白入门芯片设计,如何降低CPU功耗?(八)

低功耗芯片设计是本世纪以来最重要的新兴设计方法。可以说没有低功耗设计&#xff0c;就没有今天的智能手机&#xff0c;移动设备&#xff0c;物联网&#xff0c;及高性能计算等产业。随着芯片图形尺寸越来越小&#xff0c;低功耗设计在现在及未来的芯片中会起到越来越重要的作…

使用 Learner Lab - 使用 Lambda 转换图片为 base64 格式

使用 Learner Lab - 使用 Lambda 转换图片为 base64 格式 AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;以下使用 使用 Lambda 转换图片为 base64 格式…

UNIAPP实战项目笔记46 订单确认页面的布局

UNIAPP实战项目笔记46 订单确认页面的布局 实际案例图片 订单页面 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 代码 confirm-order.vue部分 confirm-order.vue 确认订单页面布局和渲染 flex 样式布局 <template>…

Uncaught TypeError: i.createPopper is not a function

“createPopper”不是我们使用引导程序时发生的函数错误 需要popper.js脚本但不在页面上加载它的组件或 在引导脚本之后加载它。要解决此错误&#xff0c;请包括引导程序 在运行 JavaScript 代码之前捆绑脚本。 这是一个工作示例&#xff0c;它加载引导捆绑包脚本来解决 错误。…

黑盒测试用例设计 - 边界值分析法

边界值的选择原则 如果输入条件规定了值的范围&#xff0c;则应取刚达到这个范围边界的值&#xff0c;以刚刚超越这个范围边界的值作为测试输入数据如果输入条件规定了值的个数&#xff0c;则用最大个数、最小个数、比最小个数少1、比最大个数多1的数作为测试数据如果程序的规…