一、HAL层入口
hal层主要是调用驱动接口,获取sensor驱动中传输上来的数据,提供给上层接口,屏蔽底层的细节,
具有承上启下的作用,将android系统分成了用户空间和内核空间两部分,其中硬件抽象层(HAL)运行在用户
空间,而sensor的hal程序运行在内核空间。
./vendor/mediatek/proprietary/hardware/sensor/sensors.c
static struct hw_module_methods_t sensors_module_methods = {
//获取sensor中的一些实现方法
.open = open_sensors
};
struct sensors_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
//framework层通过该id寻找hw_module_t中的common成员
.id = SENSORS_HARDWARE_MODULE_ID,
.name = "MTK SENSORS Module",
.author = "Mediatek",
.methods = &sensors_module_methods,
},
//寻找系统支持的sensor类型
.get_sensors_list = sensors__get_sensors_list,
};
//打开所有的sensor, 并返回一个hw_device_t结构
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);
}
上面sensors__get_sensors_list是根据平台有定义支持哪些sensor来获取sensorlist列表:
struct sensor_t sSensorList[] =
{
......
#if defined(CUSTOM_KERNEL_ALSPS) || defined(CUSTOM_KERNEL_PS)
{
.name = PROXIMITY,
.vendor = PROXIMITY_VENDER,
.version = 1,
.handle = ID_PROXIMITY+ID_OFFSET,
.type = SENSOR_TYPE_PROXIMITY,
.maxRange = PROXIMITY_RANGE,//1.00f,
.resolution = PROXIMITY_RESOLUTION,//1.0f,
.power = PROXIMITY_POWER,//0.13f,
.reserved = {}
},
#endif
#if defined(CUSTOM_KERNEL_ALSPS) || defined(CUSTOM_KERNEL_ALS)
{
.name = LIGHT,
.vendor = LIGHT_VENDER,
.version = 1,
.handle = ID_LIGHT+ID_OFFSET,
.type = SENSOR_TYPE_LIGHT,
.maxRange = LIGHT_RANGE,//10240.0f,
.resolution = LIGHT_RESOLUTION,//1.0f,
.power = LIGHT_POWER,//0.13f,
.reserved = {}
},
#endif
};
二、sensor HAL 使能过程
下面继续分析打开sensor的open_sensors相关操作:
init_nusensors首先new了一个sensors_poll_context_t结构,然后设置dev中的成员。