您的位置:首页 > 移动开发 > Android开发

Android4.2 G-Sensor工作流程

2015-02-07 15:58 435 查看


1. 简介

在了解Sensor工作流程以前,一直以为其事件是通过Event Hub来进行输送的,可是研究完Android4.0代码之后,才发现自己错了。

其主要框架如下图所示:






2.功能模块


2.1 SensorManager.java

与下层接口功能:

1) 在SensorManager函数中

(1) 调用native sensors_module_init初始化sensor list,即实例化native中的SensorManager

(2) 创建SensorThread线程

2) 在类SensorThread中

(1) 调用native sensors_create_queue创建队列

(2) 在线程中dead loop地调用native sensors_data_poll以从队列sQueue中获取事件(float[] values = new float[3];)

(3) 收到事件之后,报告sensor event给所有注册且关心此事件的listener

与上层的接口功能:

1) 在onPause时取消listener注册

2) 在onResume时注册listener

3) 把收到的事件报告给注册的listener


2.2 android_hardware_SensorManager.cpp

实现SensorManager.java中的native函数,它主要调用SenrsorManager.cpp和SensorEventQueue.cpp中的类来完成相关的工作。


2.3 SensorManager.cpp

[cpp] view
plaincopy

class SensorManager :

public ASensorManager,

public Singleton<SensorManager>

{

public:

SensorManager(); //调用assertStateLocked

~SensorManager();

//调用assertStateLocked,并返回mSensorList

 
24000
; ssize_t getSensorList(Sensor const* const** list) const;

// 返回mSensorList中第一个类型与type一致的sensor

Sensor const* getDefaultSensor(int type);

// 调用mSensorServer->createSensorEventConnection创建一个连接(ISensorEventConnection)

// 并用此连接做为参数创建一个SensorEventQueue对象并返回

sp<SensorEventQueue> createEventQueue();

private:

// DeathRecipient interface

void sensorManagerDied();

// 调用getService获取SensorService客户端并保存在mSensorServer中

// 调用mSensorServer->getSensorList获取sensor列表,并保存在mSensors和mSensorList中

status_t assertStateLocked() const;

private:

mutable Mutex mLock;

mutable sp<ISensorServer> mSensorServer; // SensorService客户端

mutable Sensor const** mSensorList; // sensor列表

mutable Vector<Sensor> mSensors; // sensor列表

mutable sp<IBinder::DeathRecipient> mDeathObserver;

}

[cpp] view
plaincopy

class ISensorEventConnection : public IInterface

{

public:

DECLARE_META_INTERFACE(SensorEventConnection);

virtual sp<SensorChannel> getSensorChannel() const = 0;

virtual status_t enableDisable(int handle, bool enabled) = 0;

virtual status_t setEventRate(int handle, nsecs_t ns) = 0;

};


2.4 SensorService.cpp

SensorService作为一个轻量级的system service,它运行于SystemServer内,即在system_init<system_init.cpp>调用SensorService::instantiate();

SensorService主要功能如下:

1) SensorService::instantiate创建实例对象,并增加到ServiceManager中,且创建并启动线程,并执行threadLoop

2) threadLoop从sensor驱动获取原始数据,然后通过SensorEventConnection把事件发送给客户端

3) BnSensorServer的成员函数负责让客户端获取sensor列表和创建SensorEventConnection

SensorService与客户端的接口定义如下:

[cpp] view
plaincopy

class ISensorServer : public IInterface

{

public:

DECLARE_META_INTERFACE(SensorServer);

virtual Vector<Sensor> getSensorList() = 0;

virtual sp<ISensorEventConnection> createSensorEventConnection() = 0;

};

SensorService定义如下:

[cpp] view
plaincopy

class SensorService :

public BinderService<SensorService>, //创建SensorService对象,并增加到ServiceManager中

public BnSensorServer, // 申明了SensorService与客户端(SensorManager)间的binder接口

protected Thread // 线程辅助类,调用run创建并启动线程,然后在线程主函数内回调threadLoop函数,

// 所以在使用它时,做一个派生,并根据需要重写threadLoop即可

{

friend class BinderService<SensorService>;

static const nsecs_t MINIMUM_EVENTS_PERIOD = 1000000; // 1000 Hz

SensorService();

virtual ~SensorService();

/*

在addService时,第一次构建sp强引用对象时,会调用onFirstRef函数

实现功能如下:

1) 获取SensorDevice实例

2) 调用SensorDevice.getSensorList获取sensor_t列表

3) 根据硬件sensor_t创建HardwareSensor,然后加入mSensorList(Sensor)

和mSensorMap(HardwareSensor)中

4) 根据硬件sensor_t创建对应的senosr(如GravitySensor),

然后加入mVirtualSensorList和mSensorList中

5) mUserSensorList = mSensorList;

6) run("SensorService", PRIORITY_URGENT_DISPLAY);运行线程,并执行threadLoop

*/

virtual void onFirstRef();

// Thread interface

/*

1) 调用SensorDevice.poll获取sensors_event_t事件

2) 获取已经激活的sensor列表mActiveVirtualSensors

3) 对每一个事件,执行SensorFusion.process

4) 对每一个事件,执行HardwareSensor.process(事件无变化,直接copy)

5) 调用SensorService::SensorEventConnection::sendEvents,把事件发

送给所有的listener

*/

virtual bool threadLoop();

// ISensorServer interface

// 返回mUserSensorList

virtual Vector<Sensor> getSensorList();

// 实例化SensorEventConnection并返回

virtual sp<ISensorEventConnection> createSensorEventConnection();

virtual status_t dump(int fd, const Vector<String16>& args);

//====================================================================

//============== SensorEventConnection start ========================

class SensorEventConnection : public BnSensorEventConnection {

virtual ~SensorEventConnection();

virtual void onFirstRef();

// 返回mChannel

virtual sp<SensorChannel> getSensorChannel() const;

// 调用SensorService::enable或SensorService::disable

virtual status_t enableDisable(int handle, bool enabled);

// 调用SensorService::setEventRate

virtual status_t setEventRate(int handle, nsecs_t ns);

sp<SensorService> const mService; // 保存当前SensorService实例

sp<SensorChannel> const mChannel; // SensorChannel实例

mutable Mutex mConnectionLock;

// protected by SensorService::mLock

SortedVector<int> mSensorInfo;

public:

/*

1) 把当前service保存在mService中

2) 创建SensorChannel实例,并保存在mChannel中

(在SensorChannel::SensorChannel中创建pipe,并把收和发都设置非阻塞)

*/

SensorEventConnection(const sp<SensorService>& service);

// 调用连接中的mChannel->write (SensorChannel::write),把符合条件的事件写入pipe

status_t sendEvents(sensors_event_t const* buffer, size_t count,

sensors_event_t* scratch = NULL);

bool hasSensor(int32_t handle) const; //检查handle是否在mSensorInfo中

bool hasAnySensor() const; //检查mSensorInfo中是否有sensor

bool addSensor(int32_t handle); //把handle增加到mSensorInfo列表中

bool removeSensor(int32_t handle); //把handle从mSensorInfo中删除

};

//============== SensorEventConnection end ========================

//====================================================================

class SensorRecord {

SortedVector< wp<SensorEventConnection> > mConnections;

public:

SensorRecord(const sp<SensorEventConnection>& connection);

bool addConnection(const sp<SensorEventConnection>& connection);

bool removeConnection(const wp<SensorEventConnection>& connection);

size_t getNumConnections() const { return mConnections.size(); }

};

SortedVector< wp<SensorEventConnection> > getActiveConnections() const;

DefaultKeyedVector<int, SensorInterface*> getActiveVirtualSensors() const;

String8 getSensorName(int handle) const;

void recordLastValue(sensors_event_t const * buffer, size_t count);

static void sortEventBuffer(sensors_event_t* buffer, size_t count);

void registerSensor(SensorInterface* sensor);

void registerVirtualSensor(SensorInterface* sensor);

// constants

Vector<Sensor> mSensorList; // Sensor列表

Vector<Sensor> mUserSensorList; //与mSensorList一样

DefaultKeyedVector<int, SensorInterface*> mSensorMap; //其成员为HardwareSensor

Vector<SensorInterface *> mVirtualSensorList; //其成员为HardwareSensor

status_t mInitCheck;

// protected by mLock

mutable Mutex mLock;

DefaultKeyedVector<int, SensorRecord*> mActiveSensors; //成员为SensorRecord

DefaultKeyedVector<int, SensorInterface*> mActiveVirtualSensors; //成员为HardwareSensor

SortedVector< wp<SensorEventConnection> > mActiveConnections;

// The size of this vector is constant, only the items are mutable

KeyedVector<int32_t, sensors_event_t> mLastEventSeen;

public:

static char const* getServiceName() { return "sensorservice"; }

void cleanupConnection(SensorEventConnection* connection);

/*

1) 调用HardwareSensor::activate,即SensorDevice::activate

2) 然后创建SensorRecord并增加到列表mActiveSensors

3) 把此HardwareSensor增加到连接的mSensorInfo

4) 把此连接增加到mActiveConnections中

*/

status_t enable(const sp<SensorEventConnection>& connection, int handle);

/*

1) 把此sensor从连接的mSensorInfo中删除

2) 把此连接从mActiveConnections中删除

3) 调用HardwareSensor::activate,即SensorDevice::activate

*/

status_t disable(const sp<SensorEventConnection>& connection, int handle);

/*

1)调用HardwareSensor::setDelay,即SensorDevice::setDelay

*/

status_t setEventRate(const sp<SensorEventConnection>& connection, int handle, nsecs_t ns);

}



2.5 SensorDevice.cpp

SensorDevice封装了对SensorHAL层代码的调用,主要包含以下功能:

1) 获取sensor列表(getSensorList)

2) 获取sensor事件(poll)

3) Enable或Disable sensor (activate)

4) 设置delay时间

[cpp] view
plaincopy

class SensorDevice : public Singleton<SensorDevice> {

friend class Singleton<SensorDevice>;

struct sensors_poll_device_t* mSensorDevice; // sensor设备

struct sensors_module_t* mSensorModule;

mutable Mutex mLock; // protect mActivationCount[].rates

// fixed-size array after construction

struct Info {

Info() : delay(0) { }

KeyedVector<void*, nsecs_t> rates;

nsecs_t delay;

status_t setDelayForIdent(void* ident, int64_t ns);

nsecs_t selectDelay();

};

DefaultKeyedVector<int, Info> mActivationCount;

/*

1) 调用hw_get_module(SENSORS_HARDWARE_MODULE_ID,..)获取sensors_module_t,

并保存在mSensorModule中

2) 调用mSensorModule->common->methods->open,以返回sensors_poll_device_t,

并保存在mSensorDevice中

3) 调用mSensorModule->get_sensors_list所有可访问的sensor_t

4) 调用mSensorDevice->activate激活所有的sensor

*/

SensorDevice();

public:

// 调用mSensorModule->get_sensors_list实现

ssize_t getSensorList(sensor_t const** list);

status_t initCheck() const;

// 调用mSensorDevice->poll实现

ssize_t poll(sensors_event_t* buffer, size_t count);

// 调用mSensorDevice->activate实现

status_t activate(void* ident, int handle, int enabled);

// 调用mSensorDevice->setDelay实现

status_t setDelay(void* ident, int handle, int64_t ns);

void dump(String8& result, char* buffer, size_t SIZE);

};


2.6 Sensor HAL

定义:/hardware/libhardware/include/hardware/sensors.h

实现:/hardware/mychip/sensor/st/sensors.c


2.6.1 struct sensors_poll_device_t 定义

[cpp] view
plaincopy

struct sensors_poll_device_t {

struct hw_device_t common;

// Activate/deactivate one sensor.

int (*activate)(struct sensors_poll_device_t *dev,

int handle, int enabled);

// Set the delay between sensor events in nanoseconds for a given sensor.

int (*setDelay)(struct sensors_poll_device_t *dev,

int handle, int64_t ns);

// Returns an array of sensor data.

int (*poll)(struct sensors_poll_device_t *dev,

sensors_event_t* data, int count);

};


2.6.2 struct sensors_module_t 定义

[cpp] view
plaincopy

struct sensors_module_t {

struct hw_module_t common;

/**

* Enumerate all available sensors. The list is returned in "list".

* @return number of sensors in the list

*/

int (*get_sensors_list)(struct sensors_module_t* module,

struct sensor_t const** list);

};


2.6.3 struct sensor_t 定义

[cpp] view
plaincopy

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];

};


2.6.4 struct sensors_event_t 定义

[cpp] view
plaincopy

typedef struct {

union {

float v[3];

struct {

float x;

float y;

float z;

};

struct {

float azimuth;

float pitch;

float roll;

};

};

int8_t status;

uint8_t reserved[3];

} sensors_vec_t;

/**

* Union of the various types of sensor data

* that can be returned.

*/

typedef struct sensors_event_t {

/* must be sizeof(struct sensors_event_t) */

int32_t version;

/* sensor identifier */

int32_t sensor;

/* sensor type */

int32_t type;

/* reserved */

int32_t reserved0;

/* time is in nanosecond */

int64_t timestamp;

union {

float data[16];

/* acceleration values are in meter per second per second (m/s^2) */

sensors_vec_t acceleration;

/* magnetic vector values are in micro-Tesla (uT) */

sensors_vec_t magnetic;

/* orientation values are in degrees */

sensors_vec_t orientation;

/* gyroscope values are in rad/s */

sensors_vec_t gyro;

/* temperature is in degrees centigrade (Celsius) */

float temperature;

/* distance in centimeters */

float distance;

/* light in SI lux units */

float light;

/* pressure in hectopascal (hPa) */

float pressure;

/* relative humidity in percent */

float relative_humidity;

};

uint32_t reserved1[4];

} sensors_event_t;


2.6.5 struct sensors_module_t 实现

[cpp] view
plaincopy

#include <hardware/sensors.h>

#include "nusensors.h"

/*

* the AK8973 has a 8-bit ADC but the firmware seems to average 16 samples,

* or at least makes its calibration on 12-bits values. This increases the

* resolution by 4 bits.

*/

static const struct sensor_t sSensorList[] = {

{ "MMA8452Q 3-axis Accelerometer",

"Freescale Semiconductor",

1, SENSORS_HANDLE_BASE+ID_A,

SENSOR_TYPE_ACCELEROMETER, 4.0f*9.81f, (4.0f*9.81f)/256.0f, 0.2f, 0, { } },

{ "AK8975 3-axis Magnetic field sensor",

"Asahi Kasei",

1, SENSORS_HANDLE_BASE+ID_M,

SENSOR_TYPE_MAGNETIC_FIELD, 2000.0f, 1.0f/16.0f, 6.8f, 0, { } },

{ "AK8975 Orientation sensor",

"Asahi Kasei",

1, SENSORS_HANDLE_BASE+ID_O,

SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 7.0f, 0, { } },

{ "ST 3-axis Gyroscope sensor",

"STMicroelectronics",

1, SENSORS_HANDLE_BASE+ID_GY,

SENSOR_TYPE_GYROSCOPE, RANGE_GYRO, CONVERT_GYRO, 6.1f, 1190, { } },

{ "AL3006Proximity sensor",

"Dyna Image Corporation",

1, SENSORS_HANDLE_BASE+ID_P,

SENSOR_TYPE_PROXIMITY,

PROXIMITY_THRESHOLD_CM, PROXIMITY_THRESHOLD_CM,

0.5f, 0, { } },

{ "AL3006 light sensor",

"Dyna Image Corporation",

1, SENSORS_HANDLE_BASE+ID_L,

SENSOR_TYPE_LIGHT, 10240.0f, 1.0f, 0.5f, 0, { } },

};

static int open_sensors(const struct hw_module_t* module, const char* name,

struct hw_device_t** device);

static int sensors__get_sensors_list(struct sensors_module_t* module,

struct sensor_t const** list)

{

*list = sSensorList;

return ARRAY_SIZE(sSensorList);

}

static struct hw_module_methods_t sensors_module_methods = {

.open = open_sensors

};

const struct sensors_module_t HAL_MODULE_INFO_SYM = {

.common = {

.tag = HARDWARE_MODULE_TAG,

.version_major = 1,

.version_minor = 0,

.id = SENSORS_HARDWARE_MODULE_ID,

.name = "MMA8451Q & AK8973A & gyro Sensors Module",

.author = "The Android Project",

.methods = &sensors_module_methods,

},

.get_sensors_list = sensors__get_sensors_list

};

static int open_sensors(const struct hw_module_t* module, const char* name,

struct hw_device_t** device)

{

return init_nusensors(module, device); //待后面讲解

}


2.6.6 struct sensors_poll_device_t 实现

实现代码位于:/hardware/mychip/sensor/st/nusensors.cpp

从上面的代码中可以看出,当调用init_nusensors时,它将返回sensors_poll_device_t,然后就可以调用sensors_poll_device_t 的以下方法进行相关操作:

1) activate

2) setDelay

3) poll

6.1) struct sensors_poll_context_t 定义

[cpp] view
plaincopy

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 {

light = 0,

proximity = 1,

mma = 2,

akm = 3,

gyro = 4,

numSensorDrivers,

numFds,

};

static const size_t wake = numFds - 1;

static const char WAKE_MESSAGE = 'W';

struct pollfd mPollFds[numFds];

int mWritePipeFd;

SensorBase* mSensors[numSensorDrivers];

int handleToDriver(int handle) const {

switch (handle) {

case ID_A:

return mma;

case ID_M:

case ID_O:

return akm;

case ID_P:

return proximity;

case ID_L:

return light;

case ID_GY:

return gyro;

}

return -EINVAL;

}

}

6.2) init_nusensors 实现

[cpp] view
plaincopy

int init_nusensors(hw_module_t const* module, hw_device_t** device)

{

int status = -EINVAL;

sensors_poll_context_t *dev = new sensors_poll_context_t();

memset(&dev->device, 0, sizeof(sensors_poll_device_t));

dev->device.common.tag = HARDWARE_DEVICE_TAG;

dev->device.common.version = 0;

dev->device.common.module = const_cast<hw_module_t*>(module);

dev->device.common.close = poll__close;

dev->device.activate = poll__activate;

dev->device.setDelay = poll__setDelay;

dev->device.poll = poll__poll;

*device = &dev->device.common;

status = 0;

return status;

}

由以上代码可见,sensors_poll_device_t的activate、setDelay和poll的实现函数分别为:

(1) poll__activate

(2) poll__setDelay

(3) poll__poll

下面讲解以上三个关键函数的实现

6.3) struct sensors_poll_context_t 的实现

[cpp] view
plaincopy

sensors_poll_context_t::sensors_poll_context_t()

{

mSensors[light] = new LightSensor();

mPollFds[light].fd = mSensors[light]->getFd();

mPollFds[light].events = POLLIN;

mPollFds[light].revents = 0;

mSensors[proximity] = new ProximitySensor();

mPollFds[proximity].fd = mSensors[proximity]->getFd();

mPollFds[proximity].events = POLLIN;

mPollFds[proximity].revents = 0;

mSensors[mma] = new MmaSensor(); //下面MmmaSensor为例进行分析

mPollFds[mma].fd = mSensors[mma]->getFd();

mPollFds[mma].events = POLLIN;

mPollFds[mma].revents = 0;

mSensors[akm] = new AkmSensor();

mPollFds[akm].fd = mSensors[akm]->getFd();

mPollFds[akm].events = POLLIN;

mPollFds[akm].revents = 0;

mSensors[gyro] = new GyroSensor();

mPollFds[gyro].fd = mSensors[gyro]->getFd();

mPollFds[gyro].events = POLLIN;

mPollFds[gyro].revents = 0;

int wakeFds[2];

int result = pipe(wakeFds);

LOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno));

fcntl(wakeFds[0], F_SETFL, O_NONBLOCK);

fcntl(wakeFds[1], F_SETFL, O_NONBLOCK);

mWritePipeFd = wakeFds[1];

mPollFds[wake].fd = wakeFds[0];

mPollFds[wake].events = POLLIN;

mPollFds[wake].revents = 0;

}

sensors_poll_context_t::~sensors_poll_context_t() {

for (int i=0 ; i<numSensorDrivers ; i++) {

delete mSensors[i];

}

close(mPollFds[wake].fd);

close(mWritePipeFd);

}

int sensors_poll_context_t::activate(int handle, int enabled) {

int index = handleToDriver(handle);

if (index < 0) return index;

int err = mSensors[index]->enable(handle, enabled);

if (enabled && !err) {

const char wakeMessage(WAKE_MESSAGE);

int result = write(mWritePipeFd, &wakeMessage, 1);

LOGE_IF(result<0, "error sending wake message (%s)", strerror(errno));

}

return err;

}

int sensors_poll_context_t::setDelay(int handle, int64_t ns) {

int index = handleToDriver(handle);

if (index < 0) return index;

return mSensors[index]->setDelay(handle, ns);

}

int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)

{

int nbEvents = 0;

int n = 0;

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); // num of evens received.

D("nb = %d.", nb);

if (nb < count) {

// no more data for this sensor

mPollFds[i].revents = 0;

}

count -= nb;

nbEvents += nb;

data += nb;

}

}

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) {

LOGE("poll() failed (%s)", strerror(errno));

return -errno;

}

if (mPollFds[wake].revents & POLLIN) {

char msg;

int result = read(mPollFds[wake].fd, &msg, 1);

LOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno));

LOGE_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;

}

/*****************************************************************************/

static int poll__close(struct hw_device_t *dev)

{

sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;

if (ctx) {

delete ctx;

}

return 0;

}

static int poll__activate(struct sensors_poll_device_t *dev,

int handle, int enabled) {

sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;

return ctx->activate(handle, enabled);

}

static int poll__setDelay(struct sensors_poll_device_t *dev,

int handle, int64_t ns) {

sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;

return ctx->setDelay(handle, ns);

}

static int poll__poll(struct sensors_poll_device_t *dev,

sensors_event_t* data, int count) {

sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;

return ctx->pollEvents(data, count);

}

下面MmaSensor为例进行分析。


2.7 MmaSensor.cpp

1) SensorBase的实现(SensorBase.cpp)

[cpp] view
plaincopy

class SensorBase {

protected:

const char* dev_name; // "/dev/mma8452_daemon"

const char* data_name; // "gsensor"

int dev_fd; // 打开设备"/dev/mma8452_daemon"的fd

// 打开事件"/dev/input/eventx"的fd,其驱动的名字为"gsensor"

int data_fd;

// 打开与"gsensor"对应的事件"/dev/input/eventx"

static int openInput(const char* inputName);

//通过clock_gettime获取当前时间

static int64_t getTimestamp();

static int64_t timevalToNano(timeval const& t) {

return t.tv_sec*1000000000LL + t.tv_usec*1000;

}

int open_device(); //打开设备"dev/mma8452_daemon"

int close_device(); //关闭设备"dev/mma8452_daemon"

public:

// 调用openInput

SensorBase(

const char* dev_name,

const char* data_name);

virtual ~SensorBase();

virtual int readEvents(sensors_event_t* data, int count) = 0;

virtual bool hasPendingEvents() const;

virtual int getFd() const; //返回data_fd

virtual int setDelay(int32_t handle, int64_t ns);

virtual int enable(int32_t handle, int enabled) = 0;

};

2) MmaSensor的实现

[cpp] view
plaincopy

class MmaSensor : public SensorBase {

public:

/*

1) 设置dev_name为 "/dev/mma8452_daemon"

2) 设置data_name为 "gsensor"

3) open设备 "/dev/mma8452_daemon"

*/

MmaSensor();

virtual ~MmaSensor();

enum {

Accelerometer = 0,

numSensors

};

// 调用ioctl(MMA_IOCTL_APP_SET_RATE)

virtual int setDelay(int32_t handle, int64_t ns);

/*

1) Activate: ioctl(MMA_IOCTL_START)

2) Deactivate: ioctl(MMA_IOCTL_CLOSE)

*/

virtual int enable(int32_t handle, int enabled);

/*

1) 从data_fd read input_event

2) 调用processEvent对事件进行处理

3) 把事件通过data返回

*/

virtual int readEvents(sensors_event_t* data, int count);

void processEvent(int code, int value);

private:

int update_delay();

uint32_t mEnabled;

uint32_t mPendingMask;

InputEventCircularReader mInputReader;

sensors_event_t mPendingEvents[numSensors];

uint64_t mDelays[numSensors];

};


3. 加载HAL

HAL 为一个.so库,其加载过程相关代码如下:

[cpp] view
plaincopy

#define HAL_LIBRARY_PATH1 "/system/lib/hw"

#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"

#define SENSORS_HARDWARE_MODULE_ID "sensors"

SensorDevice::SensorDevice()

: mSensorDevice(0),

mSensorModule(0)

{

status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,

(hw_module_t const**)&mSensorModule);

ALOGE_IF(err, "couldn't load %s module (%s)",

SENSORS_HARDWARE_MODULE_ID, strerror(-err));

if (mSensorModule) {

err = sensors_open(&mSensorModule->common, &mSensorDevice);

ALOGE_IF(err, "couldn't open device for module %s (%s)",

SENSORS_HARDWARE_MODULE_ID, strerror(-err));

if (mSensorDevice) {

sensor_t const* list;

ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);

mActivationCount.setCapacity(count);

Info model;

for (size_t i=0 ; i<size_t(count) ; i++) {

mActivationCount.add(list[i].handle, model);

mSensorDevice->activate(mSensorDevice, list[i].handle, 0);

}

}

}

}

int hw_get_module(const char *id, const struct hw_module_t **module)

{

return hw_get_module_by_class(id, NULL, module);

}

int hw_get_module_by_class(const char *class_id, const char *inst,

const struct hw_module_t **module)

{

int status;

int i;

const struct hw_module_t *hmi = NULL;

char prop[PATH_MAX];

char path[PATH_MAX];

char name[PATH_MAX];

if (inst)

snprintf(name, PATH_MAX, "%s.%s", class_id, inst);

else

strlcpy(name, class_id, PATH_MAX);

/*

* Here we rely on the fact that calling dlopen multiple times on

* the same .so will simply increment a refcount (and not load

* a new copy of the library).

* We also assume that dlopen() is thread-safe.

*/

/* Loop through the configuration variants looking for a module */

for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {

if (i < HAL_VARIANT_KEYS_COUNT) {

if (property_get(variant_keys[i], prop, NULL) == 0) {

continue;

}

snprintf(path, sizeof(path), "%s/%s.%s.so",

HAL_LIBRARY_PATH2, name, prop);

if (access(path, R_OK) == 0) break;

snprintf(path, sizeof(path), "%s/%s.%s.so",

HAL_LIBRARY_PATH1, name, prop);

if (access(path, R_OK) == 0) break;

} else {

snprintf(path, sizeof(path), "%s/%s.default.so",

HAL_LIBRARY_PATH1, name);

if (access(path, R_OK) == 0) break;

}

}

status = -ENOENT;

if (i < HAL_VARIANT_KEYS_COUNT+1) {

/* load the module, if this fails, we're doomed, and we should not try

* to load a different variant. */

status = load(class_id, path, module);

}

return status;

}


4. 启动SensorService

SensorService在SystemServer中启动(system_init.cpp),其相关代码如下:

[cpp] view
plaincopy

extern "C" status_t system_init()

{

....

property_get("system_init.startsensorservice", propBuf, "1");

if (strcmp(propBuf, "1") == 0) {

// Start the sensor service

SensorService::instantiate();

}

...

return NO_ERROR;

}


5. SensorManager注册Listener过程

[cpp] view
plaincopy

private SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

registerListener(SensorManager.java)->

registerListenerImpl (SystemSensorManager.java)->

enableSensorLocked(SystemSensorManager.java)->

sensors_enable_sensor(android_hardware_SensorManager.cpp)->

SensorEventQueue::enableSensor(SensorEventQueue.cpp)->

1>SensorService::SensorEventConnection::enableDisable(handle, true) (SensorService.cpp)->

SensorService::enable(SensorService.cpp)->

HardwareSensor::activate(SensorInterface.cpp)->

SensorDevice::activate(SensorDevice.cpp)->

sensors_poll_device_t::activate(HAL)

2>SensorService::SensorEventConnection::setEventRate(SensorService.cpp)->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: