MTK Sensor传感器框架(加速度传感器,陀螺仪等)分析

【Sensor 初始化流程】:
初始化文件路径:
Init.cpp                                    // init 进程:system\core\init
 App_main.cpp                            // zygote 进程:frameworks\base\cmds\app_process
	 AndroidRuntime.cpp
		 ZygoteInit.java                 // :frameworks/base/core/java/com/android/internal/os
			 RuntimeInit.java            // 抛出异常: frameworks\base\core\java\com\android\internal\os
----------------------------------------------------------------
				 SystemServer.java       // systemserver 进程: 是 zygote 子进程:frameworks\base\services\java\com\android\server
					 Onload.cpp                              // 注册一些 jni, 如硬件访问服务的: frameworks\base\services\jni
					 --- jni -----------------------------
					 com_android_server_SystemServer.cpp     // 初始化 C++ 层的 sensor 服务端:frameworks\base\services\jni
						 SensorService.h                     // SensorService(C++) 类初始化:提交 Binder 服务:frameworks\native\services\sensorservice
						 SensorService.cpp
							 SensorDevice.cpp                // SensorDevice(C++) 类初始化:与 HAL 层打交道: frameworks\native\services\sensorservice
							 --------- 下调 HAL 实现 ----------------
								 SensorContext.cpp                   // 【HAL实现】MTK 创建的 Sensors.c,HAL 层文件,与具体传感器实现打交道:vendor\mediatek\proprietary\hardware\sensor
									  Acceleration.cpp       // 【具体的 sensor 实现函数】:vendor\mediatek\proprietary\hardware\sensor
									  Gyroscope.cpp
									  Magnetic.cpp
									  StepCounter.cpp
									  。。。
									  ------- kernel ----------------------
										 Accel.c             // kernel-3.18\drivers\misc\mediatek\accelerometer
										 alsps.c             // kernel-3.18\drivers\misc\mediatek\alsps


// hardware //

//通过系统调用open,read,write对sys/class/sensor/m_acc_misc读写操作
----------------------vendor/mediatek/proprietary/hardware/sensor/sensors-1.0/Acceleration.cpp------------------------------------------
直接操作/sys/class/sensor/m_acc_misc节点,发命令


// kernel //

//创建传感器节点属性(所以传感器都需要通过次方法创建sys节点)
-----------------drivers/misc/mediatek/sensors-1.0/hwmon/sensor_attributes/sensor_attr.c-----------------------
static int __init sensor_attr_init(void)
sensor_attr_class = class_create(THIS_MODULE, “sensor”); //sys/class/sensor
sensor_attr_major = register_chrdev(0, “sensor”, &sensor_attr_fops);//注册sensor主设备号

int sensor_attr_register(struct sensor_attr_t *misc)
dev = MKDEV(sensor_attr_major, misc->minor);//对于每个sensor生成主次设备号
misc->this_device = device_create(sensor_attr_class, misc->parent, dev,misc, “%s”, misc->name); //创建节点/dev/m_acc_misc
err = sensor_event_register(misc->minor);//向hwmon注册设备
obj->client[handle].head = 0;
obj->client[handle].tail = 0;
obj->client[handle].bufsize = CONTINUE_SENSOR_BUF_SIZE;

//缓存各种传感器上报的数据存入buffer(所有传感器的数据都会通过一个buffer数组存储起来)
-----------------drivers/misc/mediatek/sensors-1.0/hwmon/sensor_event/sensor_event.c-------------------
int sensor_input_event(unsigned char handle, const struct sensor_event *event)
client->buffer[client->head++] = *event; //将event存储用数组实现的队列中
client->head &= client->bufsize - 1;//0 1 2 3 … 2047 0 1 2 3… 2047 0 1 2 3…

unsigned int sensor_event_register(unsigned char handle)
obj->client[handle].head = 0;
obj->client[handle].tail = 0;
obj->client[handle].bufsize = BIO_SENSOR_BUF_SIZE;
obj->client[handle].buffull = false;

//管理所有加速度传感器,并且注册的大量sys节点属性提供给上层访问,将所有加速度传感器接口通过节点属性给上层调用
-----------kernel-4.14/drivers/misc/mediatek/sensors-1.0/accelerometer/accel.c-----------
static int acc_probe(void)
acc_context_obj = acc_context_alloc_object();
struct acc_context *obj = kzalloc(sizeof(*obj), GFP_KERNEL);
INIT_WORK(&obj->report, acc_work_func);//初始化report工作队列绑定acc_work_func函数
cxt = acc_context_obj;
cxt->acc_data.get_data(&x, &y, &z, &status);//从mc3433驱动中通过get_data获取xyz数据
acc_data_report(&cxt->drv_data);//数据上报
event.word[0] = data->x;
event.word[1] = data->y;
event.word[2] = data->z;
sensor_input_event() //hwmon/sensor_event/sensor_event.c
initTimer(&obj->hrTimer, acc_poll);//初始化定时器,绑定acc_poll函数
hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
timer->function = callback;
acc_real_driver_init();//调用所有加速度传感器驱动的init函数
gsensor_init_list[i]->init(); //调用具体驱动的init函数,比如mc3433

DEVICE_ATTR(accenablenodata, 0644, acc_show_enable_nodata,acc_store_enable_nodata); //上电
DEVICE_ATTR(accactive, 0644, acc_show_active, acc_store_active); //使能
DEVICE_ATTR(accbatch, 0644, acc_show_batch, acc_store_batch);
DEVICE_ATTR(accflush, 0644, acc_show_flush, acc_store_flush); //FLUSH_ACTION
DEVICE_ATTR(acccali, 0644, acc_show_cali, acc_store_cali);
DEVICE_ATTR(accdevnum, 0644, acc_show_sensordevnum, NULL);

//提供给具体加速度传感器使用的通用接口
int acc_register_control_path(struct acc_control_path *ctl) //用于注册控制相关操作函数
acc_misc_init(struct acc_context *cxt)
cxt->mdev.fops = &accel_fops;//open,read(sensor_event_read),poll
err = sensor_attr_register(&cxt->mdev);//生成m_acc_misc节点
sysfs_create_group(&acc_context_obj->mdev.this_device->kobj,&acc_attribute_group);
kobject_uevent(&acc_context_obj->mdev.this_device->kobj, KOBJ_ADD);

int acc_register_data_path(struct acc_data_path *data) //用于注册获取数据相关操作函数
cxt = acc_context_obj;
cxt->acc_data.get_data = data->get_data;
cxt->acc_data.get_raw_data = data->get_raw_data;

int acc_driver_add(struct acc_init_info *obj) //将驱动注册到gsensor_init_list[i]中
obj->platform_diver_addr = &gsensor_driver;
gsensor_init_list[i] = obj;

//加速度传感器芯片mc3433驱动,i2c驱动
------------drivers/misc/mediatek/sensors-1.0/accelerometer/mc3433/mc3433.c--------------
static int __init mc3xxx_init(void)
acc_driver_add(&mc3xxx_init_info);
static struct acc_init_info mc3xxx_init_info = {
.name = MC3XXX_DEV_NAME,
.init = mc3xxx_local_init,
.uninit = mc3xxx_remove,
};
static int mc3xxx_local_init(void)
i2c_add_driver(&mc3xxx_i2c_driver)
static struct i2c_driver mc3xxx_i2c_driver = {
.driver = {
.name = MC3XXX_DEV_NAME,
.pm = &mc3xxx_pm_ops,
.of_match_table = accel_of_match,
},
.probe = mc3xxx_i2c_probe,
.remove = mc3xxx_i2c_remove,
.id_table = mc3xxx_i2c_id,
};

static int mc3xxx_i2c_probe
get_accel_dts_func(client->dev.of_node, hw); //从设备树解析i2c_num,i2c_addr,direction,power_vol等信息初始化hw
hwmsen_get_convert(obj->hw->direction, &obj->cvt);
MC3XXX_Init(new_client, 1);//i2c 硬件初始化
accel_factory_device_register(&mc3xxx_factory_device); //工厂模式
mc3xxx_create_attr(&(mc3xxx_init_info.platform_diver_addr->driver)); //sys创建mc3xxx节点属性
for (idx = 0; idx < num; idx++)
err = driver_create_file(driver, mc3xxx_attr_list[idx]);
ctl.open_report_data = mc3xxx_open_report_data; //一些函数赋值
ctl.enable_nodata = mc3xxx_enable_nodata;
ctl.batch = mc3xxx_batch;
ctl.flush = mc3xxx_flush;
ctl.set_delay = mc3xxx_set_delay;
acc_register_control_path(&ctl);
acc_register_data_path(&data);

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MTK Sensor框架是指在MTK(联发科技)芯片上运行的安卓系统中的传感器框架。该框架基于MTK芯片的特性和安卓系统的要求,提供了传感器的驱动和数据处理功能。 MTK Sensor框架的主要特点包括: - 驱动程序:MTK Sensor框架提供了传感器驱动程序,用于与硬件传感器进行通信和控制。这些驱动程序负责读取传感器的原始数据,并将其传递给上层应用程序。 - 数据处理:MTK Sensor框架还提供了数据处理功能,用于对传感器数据进行处理和解析。这些功能包括数据滤波、校准和转换等,以确保传感器数据的准确性和可靠性。 - 上层接口:MTK Sensor框架通过一组API(应用程序接口)提供给上层应用程序使用。开发人员可以使用这些API来访问传感器数据,并根据需要进行处理和分析。 高通Sensor框架是指在高通(Qualcomm)芯片上运行的安卓系统中的传感器框架。与MTK Sensor框架类似,高通Sensor框架也提供了传感器的驱动和数据处理功能。 高通Sensor框架的主要特点包括: - 驱动程序:高通Sensor框架提供了传感器驱动程序,用于与硬件传感器进行通信和控制。这些驱动程序负责读取传感器的原始数据,并将其传递给上层应用程序。 - 数据处理:高通Sensor框架还提供了数据处理功能,用于对传感器数据进行处理和解析。这些功能包括数据滤波、校准和转换等,以确保传感器数据的准确性和可靠性。 - 上层接口:高通Sensor框架通过一组API(应用程序接口)提供给上层应用程序使用。开发人员可以使用这些API来访问传感器数据,并根据需要进行处理和分析。 总结来说,MTK Sensor框架和高通Sensor框架都是在安卓系统中用于处理传感器数据的框架。它们提供了驱动程序和数据处理功能,以及上层接口供开发人员使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值