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

本文详细介绍了Android硬件抽象层(HAL)中关于传感器的实现,重点讨论了`sensors.cpp`、`NativeSensorManager`和`sensors_poll_context_t`的作用。`NativeSensorManager`作为单例管理所有传感器的访问,`sensors.cpp`提供了数据结构并封装了硬件设备接口。`sensors_poll_context_t`用于设备交互,通过`poll__poll`等函数实现传感器数据的读取。文章揭示了HAL层如何通过面向对象的方式实现对传感器的高效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

msm8909 Sensor HAL

代码路径:code/hardware/qcom/sensors/

核心作用:封装对 sensor的方法,不直接通过本地C库直接访问

├── Accelerometer.cpp
├── AccelSensor.h
├── AkmSensor.cpp
├── AkmSensor.h
├── algo
├── Android.mk
├── Bmp180.cpp
├── CalibrationManager.cpp
├── CalibrationManager.h
├── CalibrationModule.h
├── calmodule.cfg
├── CompassSensor.cpp
├── CompassSensor.h
├── Gyroscope.cpp
├── GyroSensor.h
├── InputEventReader.cpp
├── InputEventReader.h
├── LICENSE
├── LightSensor.cpp
├── LightSensor.h
├── NativeSensorManager.cpp
├── NativeSensorManager.h
├── PressureSensor.h
├── ProximitySensor.cpp
├── ProximitySensor.h
├── SensorBase.cpp
├── SensorBase.h
├── sensors.cpp
├── sensors_extension.h
├── sensors.h
├── sensors_XML.cpp
├── sensors_XML.h
├── SignificantMotion.cpp
├── SignificantMotion.h
├── VirtualSensor.cpp
└── VirtualSensor.h

重要文件有:

sensors.cpp

sensors.cpp 中提供数据机构架构,提供 hw_device_t 封装; 让其他层可以获得这个结构,得以使用其中的方法;

通过实现的结构可以发现,所有的操作都使用了, NativeSensorManager用来做具体的操作

NativeSensorManager.cpp

Native SensorManager 是个class,继承Singleton; 单例模式,只存在一个对象;

即被多次定义引用的对象 sm; 它的存在是统一管理sensor HAL的sensor访问;

将存在的sensor统一存在数组里,不针对sensor具体类型; 是HAL的实际操作者;

SensorBase.cpp

VirtualSensor.cpp

sensors主要设备结构

sensor_t

struct sensor_t {
   
    const char*     name;
 //!< sensor名称 
    const char*     vendor;
 //!< 厂商名 
    int             version;
    int             handle
    int             type;
 //!< 类型标识 
    float           maxRange;
    float           resolution;
 //!< 解析度 即报告数值的最大差异范围 
    float           power;
    int32_t         minDelay;

    uint32_t        fifoReservedEventCount;
    uint32_t        fifoMaxEventCount;
 //!< 类型字符串  
    const char*    stringType;
 //!< 权限 
    const char*    requiredPermission;

    void*           reserved[2];
};

sensor_moudule_t

struct sensors_module_t {
   
    struct hw_module_t common;
 //!< hw_module_t 基础结构 >! 
    int (*get_sensors_list)(struct sensors_module_t* module,
            struct sensor_t const** list);
 //!< 拓展接口,获取sensor 列表 >!
    int (*set_operation_mode)(unsigned int mode);
 //!< 操作设置sensor mode >! 
};



//!< 定义 名为HMI的 hw_module_t 结构体(可以转型为包含它的具体设备类型,首地址保持相同),get_module 获取它 >! NoteBy: yujixuan
struct sensors_module_t HAL_MODULE_INFO_SYM = {
   
        common: {
   
                tag: HARDWARE_MODULE_TAG,  //!< 固定名 >! NoteBy: yujixuan
                version_major: 1,
                version_minor: 0,
                id: SENSORS_HARDWARE_MODULE_ID, 
                name: "Quic Sensor module",
                author: "Quic",
                methods: &sensors_module_methods,  //!< hw_module_t 必要填充的方法 >! 
                dso: NULL,
                reserved: {
   0},
        },
        get_sensors_list: sensors__get_sensors_list,  //!< sensor_module_t 拓展的方法 >! 
};
static struct hw_module_methods_t sensors_module_methods = {
   
        open: open_sensors  //!< 只有一个open函数,它的作用是返回具体的 device >! 
};
//!< 打开一个新的sensor 实例 填充具体的hw_device_t>!

open函数实现:open_sensors

#define HAL_MODULE_INFO_SYM        HMI
#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"


static int open_sensors(const struct hw_module_t* module, const char*,
						struct hw_device_t** device)
{
   
		int status = -EINVAL;
		sensors_poll_context_t *dev = new sensors_poll_context_t();
		NativeSensorManager& sm(NativeSensorManager::getInsta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值