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);