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