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

        传感器模块接口定义在hardware/libhardware/include/hardware/sensors.h中。模块ID为“sensors”。

类型定义

  1. 传感器类型SENSOR_TYPE_*
  2. 传感器矢量数据sensors_vec_t

编号

枚举

名称

说明

1

META_DATA

属性

2

GEOMAGNETIC_FIELD

地磁

SENSOR_TYPE_MAGNETIC_FIELD

3

ORIENTATION

姿态

方向、仰角,旋转

4

GYROSCOPE

陀螺仪

角速度

5

LIGHT

光线

6

PRESSURE

压力

7

TEMPERATURE

温度

8

PROXIMITY

接近度

距离

9

GRAVITY

重力

10

LINEAR_ACCELERATION

加速度

11

ROTATION_VECTOR

旋转矩阵

12

RELATIVE_HUMIDITY

13

AMBIENT_TEMPERATURE

14

MAGNETIC_FIELD_UNCALIBRATED

15

GAME_ROTATION_VECTOR

游戏旋转矩阵

与旋转矩阵相比,没有地磁信息,但是更精确

16

GYROSCOPE_UNCALIBRATED

未矫正陀螺仪

17

SIGNIFICANT_MOTION

18

STEP_DETECTOR

19

STEP_COUNTER

20

GEOMAGNETIC_ROTATION_VECTOR

地磁旋转矩阵

使用磁力仪代替陀螺仪,精度降低,但是省电

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;

  1. 传感器事件sensors_event_t

typedef struct sensors_event_t {

    int32_t version;

    int32_t sensor;

    int32_t type;

    int32_t reserved0;

    int64_t timestamp;

    union {

        union {

            float           data[16];

            sensors_vec_t   acceleration;

            sensors_vec_t   magnetic;

            sensors_vec_t   orientation;

            sensors_vec_t   gyro;

            float           temperature;

            float           distance;

            float           light;

            float           pressure;

            float           relative_humidity;

            uncalibrated_event_t uncalibrated_gyro;

            uncalibrated_event_t uncalibrated_magnetic;

            meta_data_event_t meta_data;

        };

        union {

            uint64_t        data[8];

            uint64_t        step_counter;

        } u64;

    };

    uint32_t reserved1[4];

} sensors_event_t;

  1. 传感器实例sensor_t

struct sensor_t {

    const char*     name;

    const char*     vendor;

    int             version;

    int             handle;

    int             type;

    float           maxRange;

    float           resolution;

    float           power;

    int32_t         minDelay;

    uint32_t        fifoReservedEventCount;

    uint32_t        fifoMaxEventCount;

    void*           reserved[6];

};

接口定义

  1. 传感器模块sensors_module_t

struct sensors_module_t {

    struct hw_module_t common;

    int (*get_sensors_list)(struct sensors_module_t* module,

            struct sensor_t const** list);

};

  1. 传感器管理设备sensors_poll_device_t(0.1版本)
  2. 传感器管理设备sensors_poll_device_1_t(1.0版本)

成员

类型

说明

activate

int(*)

打开、关闭传感器,一次性传感器打开有事件后会自动关闭,也可以手动关闭。

setDelay

int(*)

设置传感器事件周期,不应在批处理模式调用。连续性传感器:采样率,响应变化传感器:限制事件频率,一次性传感器:没有实际作用。

poll

int(*)

等待事件,返回实际读取的事件数,必须等待,不允许返回0

batch

int(*)

设置批处理模式,收集事件批量返回,设置超时时间非0,启动模式。1.0

flush

int(*)

为指定传感器增加FLUSH完成事件,使poll立即超时,且缓存事件一起返回。1.0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的Hall传感器Android HAL的代码示例: ```c #include <hardware/hardware.h> #include <hardware/sensors.h> #include <fcntl.h> #include <errno.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define SENSOR_NAME "hall-sensor" #define SENSOR_VENDOR "ACME" #define SENSOR_VERSION 1 #define SENSOR_HANDLE 0 struct hall_sensor_context_t { struct sensors_poll_device_t device; sensors_event_t sensor_event; int fd; }; static int hall_sensor_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device); static int hall_sensor_close(struct hw_device_t* device); static int hall_sensor_activate(struct sensors_poll_device_t *dev, int handle, int enabled); static int hall_sensor_set_delay(struct sensors_poll_device_t *dev, int handle, int64_t ns); static int hall_sensor_poll(struct sensors_poll_device_t *dev, sensors_event_t* data, int count); static struct hw_module_methods_t hall_sensor_module_methods = { .open = hall_sensor_open }; struct sensors_poll_device_t HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_DEVICE_TAG, .version = 0, .module = &HAL_MODULE_INFO_SYM.common, .close = hall_sensor_close, }, .poll = hall_sensor_poll, .activate = hall_sensor_activate, .setDelay = hall_sensor_set_delay, }; static int hall_sensor_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device) { if (strcmp(name, SENSORS_POLL_DEVICE_NAME)) { return -EINVAL; } struct hall_sensor_context_t* hall_dev = (struct hall_sensor_context_t*) malloc(sizeof(struct hall_sensor_context_t)); memset(hall_dev, 0, sizeof(*hall_dev)); hall_dev->device.common.tag = HARDWARE_DEVICE_TAG; hall_dev->device.common.version = 0; hall_dev->device.common.module = (struct hw_module_t*) module; hall_dev->device.common.close = hall_sensor_close; hall_dev->device.poll = hall_sensor_poll; hall_dev->device.activate = hall_sensor_activate; hall_dev->device.setDelay = hall_sensor_set_delay; hall_dev->sensor_event.version = sizeof(sensors_event_t); hall_dev->sensor_event.sensor = SENSOR_HANDLE; hall_dev->sensor_event.type = SENSOR_TYPE_MAGNETIC_FIELD; hall_dev->sensor_event.data[0] = 0.0f; hall_dev->sensor_event.data[1] = 0.0f; hall_dev->sensor_event.data[2] = 0.0f; hall_dev->fd = open("/dev/hall-sensor", O_RDONLY); if (hall_dev->fd < 0) { ALOGE("Failed to open hall sensor device: %s", strerror(errno)); free(hall_dev); return -errno; } *device = &hall_dev->device.common; return 0; } static int hall_sensor_close(struct hw_device_t* device) { struct hall_sensor_context_t* hall_dev = (struct hall_sensor_context_t*) device; close(hall_dev->fd); free(hall_dev); return 0; } static int hall_sensor_activate(struct sensors_poll_device_t *dev, int handle, int enabled) { struct hall_sensor_context_t* hall_dev = (struct hall_sensor_context_t*) dev; if (handle != SENSOR_HANDLE || (enabled != 0 && enabled != 1)) { return -EINVAL; } return 0; } static int hall_sensor_set_delay(struct sensors_poll_device_t *dev, int handle, int64_t ns) { struct hall_sensor_context_t* hall_dev = (struct hall_sensor_context_t*) dev; if (handle != SENSOR_HANDLE) { return -EINVAL; } return 0; } static int hall_sensor_poll(struct sensors_poll_device_t *dev, sensors_event_t* data, int count) { struct hall_sensor_context_t* hall_dev = (struct hall_sensor_context_t*) dev; ssize_t n = read(hall_dev->fd, &hall_dev->sensor_event.data[0], sizeof(float)); if (n < 0) { ALOGE("Failed to read hall sensor data: %s", strerror(errno)); return -errno; } hall_dev->sensor_event.timestamp = getTimestamp(); *data = hall_dev->sensor_event; return 1; } ``` 这个代码示例定义了一个名为`hall-sensor`的传感器,它返回磁场强度值。在`hall_sensor_open()`函数中,我们打开了`/dev/hall-sensor`设备文件,并初始化了一个`sensors_event_t`结构体来存储传感器事件。在`sensors_poll_device_t`结构体中,我们定义了传感器的`poll()`、`activate()`和`setDelay()`函数。在`hall_sensor_activate()`和`hall_sensor_set_delay()`函数中,我们简单地检查传入的`handle`参数是否是我们定义的传感器句柄,并返回0或-EINVAL。在`hall_sensor_poll()`函数中,我们从设备文件中读取传感器数据,并将其存储在先前初始化的`sensors_event_t`结构体中,最后返回1表示有一个新的传感器事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值