Android 传感器hal层分析

安卓HAL开发指南 安卓HAL开发指南 1、介绍 HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),在此之前Android 有AIDL,架构在Android binder 之上,用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL也是类似的作用,只不过定义的是Android Framework与Android HAL实现之间的接口。 2、实现方式 2.1 旧版 传统HAL层 Android 7.x和更早的版本中,hal 阅读详情

Android系统内置对传感器有很多,它们分别是:加速度传感器gsensor(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。

Android实现传感器系统代码位置在

  framework层: frameworks\base\core\java\android\hardware\目录下

    Sensor.java

    SensorEventListener.java 

    SensorListener.java

    SensorManager.java

jni :frameworks\base\core\jni

                         android_hardware_SensorManager.cpp

hal层,这个每个平台的代码位置可能不一样,我现在分析4.4MTK的

       mediatek\hardware\sensor

Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层,Android中Sensor的HAL接口定义在:hardware/libhardware/include/hardware/sensors.h

对传感器类型的定义:


传感器模块的定义结构体如下:


该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个get_sensors_list函数,用于获取传感器的列表。


对任意一个sensor设备 都会有一个 sensor_t 结构体,其定义如下:


struct sensor_t {
    /* name of this sensors */
    const char*     name;
    /* vendor of the hardware part */
    const char*     vendor;
    /* version of the hardware part + driver. The value of this field
     * must increase when the driver is updated in a way that changes the
     * output of this sensor. This is important for fused sensors when the
     * fusion algorithm is updated.
     */    
    int             version;
    /* handle that identifies this sensors. This handle is used to activate
     * and deactivate this sensor. The value of the handle must be 8 bits
     * in this version of the API. 
     */
    int             handle;
    /* this sensor's type. */
    int             type;
    /* maximaum range of this sensor's value in SI units */
    float           maxRange;
    /* smallest difference between two values reported by this sensor */
    float           resolution;
    /* rough estimate of this sensor's power consumption in mA */
    float           power;
    /* minimum delay allowed between events in microseconds. A value of zero
     * means that this sensor doesn't report events at a constant rate, but
     * rather only when a new data is available */
    int32_t         minDelay;

    /* reserved fields, must be zero */
    void*           reserved[8];
};

下面来分析hal流程:

 加载JNI时根据模块会找到sensor.c

 

由上面可以看出来open_sensors是整个加载流程入口


函数操作集合赋值,看到new了一个sensors_poll_context_t类,看看到底这里都做了什么

struct sensors_poll_context_t {
    struct sensors_poll_device_t device; // must be first
        sensors_poll_context_t();
        ~sensors_poll_context_t();
    int activate(int handle, int enabled);
    int setDelay(int handle, int64_t ns);
    int pollEvents(sensors_event_t* data, int count);
private:
    enum {
        hwmsen        = 0, 
        accel,
        magnetic,
        //gyro,
        //light,
        //proximity,
        //pressure,
        numSensorDrivers,
        numFds,
    };
int handleToDriver(int handle) const {
        switch (handle) {
            case ID_ACCELEROMETER:
return accel;
            case ID_MAGNETIC:
            case ID_ORIENTATION:
return magnetic;
            case ID_PROXIMITY:
//return proximity;
            case ID_LIGHT:
//return light;
            case ID_GYROSCOPE:
//return gyro;
case ID_PRESSURE:
break;
//return pressure;
        }
        return -EINVAL;
    }


    static const size_t wake = numFds - 1;
    static const char WAKE_MESSAGE = 'W';
    struct pollfd mPollFds[numFds];
    int mWritePipeFd;
    SensorBase* mSensors[numSensorDrivers];
};

构造函数


重点来看pollEvents函数


poll是真正实现查询事件

int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
{
    int nbEvents = 0;
    int n = 0;
//ALOGE("pollEvents count =%d",count );


    do {
        // see if we have some leftover from the last poll()
        for (int i=0 ; count && i<numSensorDrivers ; i++) {
            SensorBase* const sensor(mSensors[i]);
            if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) {
                int nb = sensor->readEvents(data, count);
                if (nb < count) {
                    // no more data for this sensor
                    mPollFds[i].revents = 0;
                }
                //if(nb < 0||nb > count)
                // ALOGE("pollEvents count error nb:%d, count:%d, nbEvents:%d", nb, count, nbEvents);//for sensor NE debug
                count -= nb;
                nbEvents += nb;
                data += nb;
                //if(nb < 0||nb > count)
                // ALOGE("pollEvents count error nb:%d, count:%d, nbEvents:%d", nb, count, nbEvents);//for sensor NE debug
            }
        }
        if (count) {
            // we still have some room, so try to see if we can get
            // some events immediately or just wait if we don't have
            // anything to return
            
            n = poll(mPollFds, numFds, nbEvents ? 0 : -1);
            if (n<0) {
                ALOGE("poll() failed (%s)", strerror(errno));
                return -errno;
            }
            if (mPollFds[wake].revents & POLLIN) {
                char msg;
                int result = read(mPollFds[wake].fd, &msg, 1);
                ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno));
                ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg));
                mPollFds[wake].revents = 0;
            }
        }
        // if we have events and space, go read them
    } while (n && count);
    return nbEvents;
}





Sensor系列之Sensor HAL层数据获取,基于Qualcomm平台 前面我们分析了Android Sensor HAL层源码分析(基于Qualcomm平台),该篇博文主要讲解了Sensor HAL的初始化,以及hal层是怎样获取所有sensor列表的。今天我们来进一步了解下sensor hal层的数据获取流程。我们知道Native层SensorService启动后,会进入我们的treadLoop方法:bool SensorService::threadLoop()... 阅读详情

相关推荐

Android Sensor Input类型 (四) Sensor HAL 实现

msm8909 Sensor HAL 代码路径:code/hardware/qcom/sensors/ 核心作用:封装对 sensor的方法,不直接通过本地C库直接访问 点击展开 全部文件 ├── Accelerometer.cpp ├── AccelSensor.h ├── AkmSensor.cpp ├── AkmSensor.h ├── algo ├── Android.mk ├── Bmp180.cpp ├── CalibrationManager.cpp

null 1674

Android HAL层浅析

1)、HAL层是上层应用对底层硬件操作屏蔽的一个软件层次,就是上层应用不必关心底层硬件具体是如何工作的,只需要调用底层提供的统一接口即可。HAL层对接具体的硬件bsp接口,比如视频接口、收音机接口、网络接口、spi接口等。HAL层就是为了把操作系统和硬件解耦。Linux驱动一般由访问硬件代码和业务逻辑代码两部分组成。Linux内核提供了标准的读写硬件的方法,只需要调用Linux提供的标准函数即可。而Linux驱动的业务逻辑对厂商或个人来说是保密的。例如,缓冲区的设置等。2)、。来描述。①、.........

Heisenberg_Li的博客 5684

Andriod Sensor HAL实现

Andriod Sensor HAL实现 1 Android sensor构建 Android4.1 系统内置对传感器的支持达13种,他们分别是:加速度传感器(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temper

fe学习之旅 2781

Android系统的HAL层分析 (1)-- HAL的架构分析

Android 系统的硬件访问服务通常运行在 SystemServer 中,而使用这些硬件访问服务的应用程序运行在另外的进程中,即应用程序需要通过进程间通信机制来访问这些硬件访问服务。Android 系统提供了一种高效的进程间通信机制——Binder 进程间通信机制,应用程序就是通过它来访问运行在 SystemServer 中的硬件访问服务的。Binder 进程间通信机制要求提供服务的一方必须实现一个具有跨进程访问能力的服务接口,以便使用服务的一方可以通过这个服务接口来访问它。

Android系统工程师--小馬佩德罗 7744

NO1:基于RK3568 Android11平台---分析亮度传感器自动亮度调节实现流程(驱动到对应HAL层程序的流程分析 和 手搓New Light Sensor Driver 篇)

基于RK3568 Android11 平台 如何适配新的亮度传感器驱动 从而实现原生的自动亮度调节功能

morecrazylove的博客 767

绕开华为通道,获取解锁码解锁BootLoader

刷机有风险,操作需谨慎,如果因为各种因素导致手机变砖无法开机,本教程概不负责,望悉知 前言 这篇文章的大多内容是根据我自己找的一篇文章《绕开华为通道,获取解锁码解锁BootLoader》来编写的,里面的大部分内容是文章的原内容。下面的都是我参考文章中做了一些小部分的修改,增加了我华为P8手机的一些操作,下面开始讲述我的解锁过程。 因为华为官方在2018年的七八月份吧,关闭了解锁码的申请通道,这...

Martin.Mu `s Special Column 5万+

Android 源码分析 - 传感器 - HAL层

传感器模块接口定义在hardware/libhardware/include/hardware/sensors.h中。模块ID为“sensors”。 类型定义 Sensors Overview Position Sensors Android操作系统11种传感器介绍 旋转矩阵 传感器类型SENSOR_TYPE_* 传感器矢量数据sensors_vec_t 编号 枚举 名称 说明 1 ...

luansxx的专栏 618

软件项目质量管理

识别项目中涉及质量管理的不同角色,如项目经理、质量经理、测试人员等,明确每个角色的职责和任务,包括负责哪些质量管理活动和决策。1、编制软件项目的质量管理计划,包括确定项目的质量标准和要求,以及制定质量控制和质量保证策略等。2、编制软件项目的质量管理计划,包括确定项目的质量标准和要求,以及制定质量控制和质量保证策略等。测试用例表是质量控制过程中的关键工具,确保所有功能和场景都被验证,减少项目中的缺陷。1、理解项目质量管理的基本过程,包括质量计划、质量保证、质量控制和质量改进;明确质量管理活动中的角色和职责。

weixin_51996255的博客 1260

android hal 光线传感器,Android的传感器HAL层的书写---基础篇

关于传感器,大家在日常的生活中用的很多。比如楼宇的楼梯灯,马路上的路灯等等。那么我们手机里的传感器又可以起到哪些作用呢?现在看下我们的Android中给提供了哪些吧。有加速度传感器,磁场,方向,陀螺仪,光线,压力,温度,接近传感器。------------------------------文件分布------------------------------其中的代码的分布如下:1、传感器系统的J...

weixin_29437577的博客 476

《民机适航入门指南:从法规学习到项目实践的全面解析》

适航(Airworthiness)是指航空器、其发动机、螺旋桨和其他部件在规定条件下,能够安全飞行并满足有关航空法规规定的条件。简而言之,适航代表了航空器在任何时候都能安全运营的状态。适航在民用航空领域尤为关键,因为飞机必须经过严格的适航认证才能投入商用。这些认证的目标是确保飞机能够在广泛的运行条件下保持飞行安全,从而保护乘客、机组和地面人员的生命财产安全。适航法规覆盖了飞机的整个生命周期,包括设计、制造、测试、运营、维护和报废。

qq_41854911的博客 995

74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解

移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU

2601_95651806的博客 205

android hal 光线传感器,Android模拟器学framework和driver之传感器篇3(Android HAL)

当前位置:操作系统 > 安卓/Android >>Android模拟器学framework和driver之传感器篇3(Android HAL)前面,带着大家一起写了一个temperature sensor的驱动,已经一个测试tool来测试这个驱动,基本功能已经ok,若还有问题的可以参考前面2篇文章,在这里我们要在HAL层中添加我们的设备,来跟framework中的代码连接起来。在...

weixin_39885067的博客 473

手把手教你 Ubuntu 24.04 离线安装 Ollama

本文介绍 Ubuntu 下离线安装 Ollama 并使用 Ollama 部署 llama3.1-70b 大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1019

android hal 光线传感器,Android的传感器HAL层的书写---基…

关于传感器,大家在日常的生活中用的很多。比如楼宇的楼梯灯,马路上的路灯等等。那么我们手机里的传感器又可以起到哪些作用呢?现在看下我们的Android中给提供了哪些吧。有加速度传感器,磁场,方向,陀螺仪,光线,压力,温度,接近传感器。-----------------------------------文件分布---------------------------------------------...

weixin_35651191的博客 292

震惊!用刚发布的GPT-5写研究现状,文献综述写作一整个大逆袭(附步骤+10条AI提示词)

每类分别给出:国内重点(3 条)、国外重点(3 条)、代表性方法(2–3 条)、代表成果(各 1–2 条)、主要问题(2 条)。每个场景给出:技术方案(2–3 种)、研究目标、实际成效/案例、当前挑战(3 点)。指令:基于国内外现状,系统列出当前学界的研究空白、关键未解问题与争议焦点(每项配简要证据/示例),并针对每个空白提出 1–2 条可行的研究方向或方法路径。三、差异与研究空白分析(≥300 字)。对每个小节提供:小标题、中心论点(1 句)、拟写要点(3–5 条)、建议引用类型(理论/方法/案例)。

qq_64378896的博客 116

红米k60 修复“NV损坏” 去除主板校验电阻步骤解析与图示

红米k60 基带代码:mondrian。搭载‌高通骁龙8+ Gen1处理器.国外版本称:POCO F5 Pro适用于以下型号的小米机型:23013RK75C, 23013PC75G。 💝💝💝通过博文了解 1💝💝💝-----此机型修复NV损坏硬件类操作主板图示 2💝💝💝-----了解设备出现NV损坏的底层逻辑 3💝💝💝 ------具体修改步骤

小马哥的专栏 399

android hal 光线传感器,[sensor hal] Android的传感器HAL层的书写---基础篇

关于传感器,大家在日常的生活中用的很多。比如楼宇的楼梯灯,马路上的路灯等等。那么我们手机里的传感器又可以起到哪些作用呢?现在看下我们的Android中给提供了哪些吧。有加速度传感器,磁场,方向,陀螺仪,光线,压力,温度,接近传感器。-----------------------------------文件分布---------------------------------------------...

weixin_32716541的博客 542

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android模拟器学framework和driver之传感器篇3(Android HAL)

前面,带着大家一起写了一个temperature sensor的驱动,已经一个测试tool来测试这个驱动,基本功能已经ok,若还有问题的可以参考前面2篇文章,在这里我们要在HAL层中添加我们的设备,来跟framework中的代码连接起来。 在开始摆代码之前我觉得有必要啰嗦几句,HAL层我个人觉得是个比较重要的东西,虽然这边现在还不是很成熟,还不是很规范,但是google还是做了很大力气针对HAL...

蓝色妖姬 117

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

sensor 传感器在 HAL 层的表现

1、使用HAL 的方法 以Sensor 传感器为例,介绍使用 HAL 的 方法,具体流程如下所示。 (1)Native code 通过hw_get_module 调用获取 HAL stub. hw_get_module (LED_HARDWARE_MODULE_ID,(const hw_module_t** )&module) (2) 通过继承 hw_module_methods_t 的 callback 拉打开设备。 module->methods->open(module,

Venus 的博客 2950

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Android驱动07】Sensor传感器框架以及驱动移植和调试方法(Hal层部分)

Sensor HAL层相对来说比较简单,它的意图就是为framework层提供接口API的实现,如open_sensors,poll等,一旦实现完毕,framewoerk 里面的SensorManager,SensorService 里面的native(本地)方法可以直接被调用。这一步非常重要,HAL_MODULE_INFO_SYM 映射了hal 层XXX.so 库的入口,上层hw_get_module 将获得该入口,使得上层可以和底层.so库进行交互。Hal层的库文件是怎么被上层调用的?

jiangchaobing_2017的博客 1838

Qcom_Sensor(二)--- 之 Android Native到HAL源码剖析

Qcom_Sensor(二 )--- 之 Android Native到HAL源码剖析一、SensorService启动二、hw_get_module2.1课外知识—ELF文件格式:三、QualComm Sensor HAL总结 Google为了保护硬件厂商的信息,在Android中添加了一层,它就是大名鼎鼎的HAL层。 在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块...

|~~~热爱生活、努力学习的小伙汁~~~| 2060
上一篇: 通过select较高效的捕获和处理鼠标键盘事件
下一篇: Android -- Sensor 简介
WythePlus
博客等级 码龄11年 397粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值