这个坑真的非常蛋疼,查了几天才知道原因,我使用的时候必须先打开L-sensor在打开P-sensor这样后者才会有中断不断的触发,接收到数据;如果是先打开P-sensor则会没有中断触发,无数据,而且先打开L-sensor的时候不可以两者同时打开,不然P-sensor也会接收不到数据。网上查了很多资料关于这个错误遇到的人非常少,那我们看下怎样去解决。
在alsps.c文件中
//获取als数据
int als_data_report(struct input_dev *dev, int value, int status)
{
struct alsps_context *cxt = NULL;
cxt = alsps_context_obj;
//ALSPS_LOG("+als_data_report! %d, %d\n",value,status);
//force trigger data update after sensor enable.
if (cxt->is_get_valid_als_data_after_enable == false)
{
input_report_abs(dev, EVENT_TYPE_ALS_VALUE, value+1);
cxt->is_get_valid_als_data_after_enable = true;
}
input_report_abs(dev, EVENT_TYPE_ALS_VALUE, value);
input_report_abs(dev, EVENT_TYPE_ALS_STATUS, status);
input_sync(dev);
return 0;
}
//获取ps数据
int ps_data_report(struct input_dev *dev, int value,int status)
{
//ALSPS_LOG("+ps_data_report! %d, %d\n",value,status);
input_report_rel(dev, EVENT_TYPE_PS_VALUE, (value+1));
input_report_rel(dev, EVENT_TYPE_PS_STATUS, status);
input_sync(dev);
return 0;
}
我使用的是stk3311这个传感器,通过上面我们可以打log看到驱动stk3x1x.c中函数stk3x1x_get_ps_value获取数据,然后在调用alsps中的ps_data_report,然后看到input_report_rel(dev, EVENT_TYPE_PS_VALUE, (value+1));直接就默认为远距离,所以这里判断下
//获取als数据
int als_data_report(struct input_dev *dev, int value, int status)
{
struct alsps_context *cxt = NULL;
cxt = alsps_context_obj;
//ALSPS_LOG("+als_data_report! %d, %d\n",value,status);
//force trigger data update after sensor enable.
if (cxt->is_get_valid_als_data_after_enable == false)
{
input_report_abs(dev, EVENT_TYPE_ALS_VALUE, value+1);
cxt->is_get_valid_als_data_after_enable = true;
}
input_report_abs(dev, EVENT_TYPE_ALS_VALUE, value);
input_report_abs(dev, EVENT_TYPE_ALS_STATUS, status);
input_sync(dev);
return 0;
}
//获取ps数据
int ps_data_report(struct input_dev *dev, int value,int status)
{
//ALSPS_LOG("+ps_data_report! %d, %d\n",value,status);
struct alsps_context *cxt = NULL;
cxt = alsps_context_obj;
if (cxt->is_get_valid_ps_data_after_enable == true)
{
input_report_abs(dev, EVENT_TYPE_ALS_VALUE, value);
cxt->is_get_valid_ps_data_after_enable = false;
}
input_report_rel(dev, EVENT_TYPE_PS_VALUE, (value+1));
input_report_rel(dev, EVENT_TYPE_PS_STATUS, status);
input_sync(dev);
return 0;
}
这样就完美解决问题