1. 程式人生 > >Android 感測器hal層分析

Android 感測器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;
}

相關推薦

Android 感測器hal分析

Android系統內建對感測器有很多,它們分別是:加速度感測器gsensor(accelerometer)、磁力感測器(magnetic field)、方向感測器(orientation)、陀螺儀(

Android Sensor HAL分析

   SensorService在SystemServer程序中啟動。 /frameworks/base/ervices/java/com/android/server/SystemServer.java private void startBootst

android 背光控制 HAL分析

lights.c /* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License");

android底層HAL深入瞭解

需要了解android底層開發,尤其是針對廠商介面對接,我們就需要針對android的HAL層做深入理解,在android的六層架構中,其中HAL層架構在linux驅動層之上,下面我們就來以相機為列做初步瞭解(官方輸出),福利:基礎應用開源框架 Android 的相機硬體抽

android gps hal大概分析

gps android hal層分析 我用的UT4412的板子由於上面沒有gps模組,自己找到了一個北斗模組給上一個3.3的電,TX、RX接到板子的串列埠上。 我做的gps是在網上下載的程式碼,下載之後程式碼放在hardware/libhardware/modules/下面

android音訊hal簡介

如下圖為android音訊hal層所處的位置: 從上圖可以看出,HAL層下面使用TiniAlsa(Android下一個簡約的Alsa版本)。HAL層分為兩部分,一部分為各種音訊裝置,每種音訊裝置由一個獨立的庫檔案實現:如audio.a2dp.defaul

Android驅動(一)硬體訪問服務學習之(三)Android加入HAL訪問硬體

硬體平臺:tiny4412系統:Android  5.0.2編譯器: arm-linux-gcc-4.5.1 當時我們把對硬體的操作放在了JNI層,但是Android並不是這樣,google提出HAL層,即硬體封裝層 這一節我們把硬體的操作封裝裝HAL層。 andr

Android Sensor HAL初始化流程(基於Qualcomm平臺)

從Android Native到HAL原始碼剖析,以sensor為例 一文中,我們分析到sensor通過hw_get_module以及sensors_open_1去load HAL層的庫以及開啟我們的sensor裝置,今天我們的文章就來分析這兩部分的流程。Sensor HAL

Android開發之HAL

本文摘自 羅昇陽的《Anroid系統原始碼情景分析》,更新至Android7.0分析 一、概念 一、Android系統為硬體抽象層中的模組介面定義了編寫規範,我們必須按照這個規範來編寫自己的硬體模組介面。 二、Android系統的硬體

android硬體抽象HAL)詳解

今天給大家講一下android框架中的硬體抽象層HAL(hardware abstract layer),硬體抽象層在軟體與硬體之間起到了橋樑作用,作為一個framework工程師是必須掌握的,如果你是一個應用軟體工程師或者framework工程師,向驅動工程師轉型,hal層

Android HAL與Linux Kernel驅動開發簡介

近日稍微對Android中的驅動開發做了一些簡要的瞭解,稍稍理清了一下Android驅動開發的套路,總結一下筆記。 HAL:Hardware Abstract Layer 硬體抽象層,由於Linux Kernel需要遵循GPL開源協議,硬體廠商為了保護自己

Android O之HAL開發

這裡介紹的是一種簡單HAL的寫法與呼叫。 我將會編寫一個app直接呼叫HAL的介面,而HAL層程式碼將直接讀寫驅動的節點。 簡介 Android O的一項新元素是 Project Treble。這是 Android 作業系統框架在架構方面的一項重大

android hal c 堆疊列印方法

比如要追蹤 hardware/qcom/audio/hal/audio_hw.c 中adev_set_mode() 函式的函式堆疊呼叫關係 實際原理就是利用c++ callstack 庫,重新編譯成c庫後使用即可.  1. 在hardware/qcom/audio/hal/

Android AudioFlinger載入HAL流程

一、前提 Audio HAL層最終以.so的方式為Android所用,那這個.so的庫如何被AudioFlinger所使用? 二、Audio Hardware HAL載入 (1)AudioFlinger AudioFlinger載入HAL層:

s5p4418 Android 4.4.2 驅動 HAL 服務 應用 開發流程記錄(一 硬體驅動

歡迎轉載,務必註明出處:http://blog.csdn.net/wang_shuai_ww/article/details/44303069 本文章是記錄Android開發中驅動層、HAL層、應用層之間的關係,以及其開發方法,本文將會以實現LED的控制為例來進行記錄。 一

ch8.1 Android HAL簡介

8.1 Android HAL層簡介 HAL(Hardware abstract Layer)硬體抽象層是google開發的android系統裡上層應用對底層硬體操作的一個遮蔽的軟體層次,通俗來講,就是上層的應用不用關心底層硬體如何工作,只要向上層提供一個統一的介面即可

Android硬體抽象(HAL)深入剖析(一)

作為一個搞android驅動或者說搞底層的人,我覺得對於hal那是必須要掌握的,而且必須達到一定深度,於是我總結了一下,將整個自己的分析思路寫下來。 主要是看android原始碼,根據原始碼得到的思路。(看原始碼比看什麼著作書籍都管用) android HAL是什麼?為什麼

android HAL自我總結

Android版本:2.3.7_r1 Linux核心版本:android-goldfish-2.6.29 參考文章:Android架構分析之使用自定義硬體抽象層(HAL)模組 http://blog.csdn.net/liuhaoyutz/article/details/91478

Android之IPC6————Binder3 Framework分析

Android之IPC6————Binder3 Framework層分析 文章目錄 Android之IPC6————Binder3 Framework層分析 一.概述 二.BinderJNI初始化 1

Android之IPC5————Binder2 Native分析

Android之IPC5————Binder2 Native層分析 文章目錄 Android之IPC5————Binder2 Native層分析 一.前言 二.獲取BpServiceManager 1