【Android驱动07】Sensor传感器框架以及驱动移植和调试方法(Hal层部分)

一,Android sensor 系统架构

Hal 就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。
在这里插入图片描述
二,HAL 层Sensor 框架实现
Sensor HAL层相对来说比较简单,它的意图就是为framework层提供接口API的实现,如open_sensors,poll等,一旦实现完毕,framewoerk 里面的SensorManager,SensorService 里面的native(本地)方法可以直接被调用。
在这里插入图片描述

2.1 HAL 客制化
在alps\device\mediatek$(proj)\ProjectConfig.mk中 配置对应的传感器为y
等效路径(kernel3.18\arch\arm64\configs$(proj).deconfig)

CONFIG_MTK_SENSOR_SUPPORT=y
CONFIG_CUSTOM_KERNEL_ACCELEROMETER=y
CONFIG_MTK_ICM20645G=y
CONFIG_CUSTOM_KERNEL_ALSPS=y
CONFIG_MTK_CM36558=y
CONFIG_CUSTOM_KERNEL_GYROSCOPE=y
CONFIG_MTK_ICM20645GY=y

2.2 获取module函数
Hal层的库文件是怎么被上层调用的?上层调用时的入口(相当于main)又是什么呢?它就是HAL_MODULE_INFO_SYM。
路径:vendor/mediatek/proprietary/hardware/sensor/sensors.c

static int open_sensors(const struct hw_module_t* module, const char* name,
        struct hw_device_t** device)
{
   
   ALOGD("%s: name: %s! fwq debug\r\n", __func__, name);
 
 
   return init_nusensors(module, device);
}

static struct hw_module_methods_t sensors_module_methods = {
   
    .open = open_sensors
};

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 = "MTK SENSORS Module",
        .author = "Mediatek",
        .methods = &sensors_module_methods,
    },
    .get_sensors_list = sensors__get_sensors_list,
};

路径:vendor/mediatek/proprietary/hardware/sensor/nusensors.cpp

int init_nusensors(hw_module_t const* module, hw_device_t** device)
{
   
    int status = -EINVAL;
 
 
    dev = new sensors_poll_context_t();
    memset(&dev->device, 0, sizeof(sensors_poll_device_1));
 
 
    dev->device.common.tag = HARDWARE_DEVICE_TAG;
#if defined(SENSOR_BATCH_SUPPORT) || defined(CUSTOM_KERNEL_SENSORHUB)
    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_1;
#else
    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_0;
#endif
    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;
    dev->device.batch           = poll__batch;
    dev->device.flush            = poll__flush;
 
 
    *device = &dev->device.common;
    status = 0;
    return status;
}

2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孤舟簔笠翁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值