mtk 新sensor框架

时间:2025-01-31 07:09:39

mtk 新架构g-sensor框架

其他sensor类似架构

kernel-3.10\drivers\misc\mediatek\accelerometer\ 

acc_driver_add(struct acc_init_info* obj) 注册驱动
	gsensor_init_list[i] = obj;

acc_register_data_path(struct acc_data_path *data) 注册获取sensor数据上报函数等
	给acc_context_obj赋值操作

acc_register_control_path(struct acc_control_path *ctl)注册控制sensor相关的函数
	acc_misc_init(acc_context_obj);//注册misc设备上报数据
	sysfs_create_group(&acc_context_obj->mdev.this_device->kobj, &acc_attribute_group);
	//创建属性文件
 
数据结构 
struct acc_control_path
{
	int (*open_report_data)(int open);//上报事件给HAL层 参数open:
	int (*enable_nodata)(int en);//用于实现开启sensor power的功能
	int (*set_delay)(u64 delay); //设置延时
	int (*access_data_fifo)(void);
	bool is_report_input_direct; //是否sensor自己上报数据
	bool is_support_batch;
	bool is_use_common_factory;
	int (*acc_calibration)(int type, int cali[3]);
};


struct acc_data_path
{
	int (*get_data)(int *x,int *y, int *z,int *status);//用来获取sensor数据
	int (*get_raw_data)(int *x,int *y, int *z);
	int vender_div; //用于归一化不同厂商sensor raw data的算术值
};


struct acc_init_info
{
    	char *name; //当前sensor的名称
	int (*init)(void); //调用i2c_add_driver来加载对应sensor的i2c driver
	int (*uninit)(void);//调用i2c_del_driver来删除对应sensor的i2c driver
	struct platform_driver* platform_diver_addr;//便于attribute file的加载
};


struct acc_context {
	struct input_dev   *idev;
	struct miscdevice   mdev;
	struct work_struct  report;
	struct mutex acc_op_mutex;
	atomic_t            delay; /*polling period for reporting input event*/
	atomic_t            wake;  /*user-space request to wake-up, used with stop*/
	struct timer_list   timer;  /* polling timer */
	atomic_t            trace;
	struct early_suspend    early_drv;
	atomic_t                early_suspend;
	//struct acc_drv_obj    drv_obj;
	struct acc_data       drv_data;
	int                   cali_sw[ACC_AXES_NUM+1];
	struct acc_control_path   acc_ctl;
	struct acc_data_path   acc_data;
	bool is_active_nodata;// Active, but HAL don't need data sensor. such as orientation need
	bool is_active_data;// Active and HAL need data .
	bool is_first_data_after_enable;
	bool is_polling_run;
	bool is_batch_enable;// is used for judging whether sensor is in batch mode
}; 
//sensor核心结构体 acc_probe就是初始化和填充acc_context_obj


调用过程
platform_driver_register(&acc_driver)
	acc_probe(struct platform_device *pdev)
		acc_context_obj = acc_context_alloc_object(); //初始化acc_context_obj
		acc_real_driver_init();
			gsensor_init_list[i]->init() == acc_init_info里的init函数
				i2c_add_driver(&bma250_i2c_driver)//注册I2C驱动
		acc_factory_device_init();//注册factory misc设备
			misc_register(&acc_factory_device));
		acc_input_init(acc_context_obj); //注册输入设备
		input_allocate_device();
		input_register_device(dev);