proximity sensor driver (二)

3  PS sensor driver

static int ltr559_i2c_probe(struct i2c_client*client, const struct i2c_device_id *id)

{

         structltr559_priv *obj;

         structhwmsen_object obj_ps, obj_als;

         interr = 0;

 

         if(!(obj= kzalloc(sizeof(*obj), GFP_KERNEL)))

         {

                   err= -ENOMEM;

                   gotoexit;

         }

         memset(obj,0, sizeof(*obj));

         ltr559_obj= obj;

         obj->hw= get_cust_alsps_hw();

         //ltr559_get_addr(obj->hw,&obj->addr);

 

         INIT_WORK(&obj->eint_work,ltr559_eint_work);  //初始化ps eintwork

         obj->client= client;

         i2c_set_clientdata(client,obj);       

         atomic_set(&obj->als_debounce,300);

         atomic_set(&obj->als_deb_on,0);

         atomic_set(&obj->als_deb_end,0);

         atomic_set(&obj->ps_debounce,300);

         atomic_set(&obj->ps_deb_on,0);

         atomic_set(&obj->ps_deb_end,0);

         atomic_set(&obj->ps_mask,0);

         atomic_set(&obj->als_suspend,0);

         atomic_set(&obj->ps_thd_val_high,  obj->hw->ps_threshold_high);

         atomic_set(&obj->ps_thd_val_low,  obj->hw->ps_threshold_low);

         atomic_set(&obj->ps_thd_val,  obj->hw->ps_threshold);

         obj->enable= 0;

         obj->pending_intr= 0;

         obj->als_level_num= sizeof(obj->hw->als_level)/sizeof(obj->hw->als_level[0]);

         obj->als_value_num= sizeof(obj->hw->als_value)/sizeof(obj->hw->als_value[0]);  

         obj->als_modulus= (400*100)/(16*150);                                                                                           

         BUG_ON(sizeof(obj->als_level)!= sizeof(obj->hw->als_level));

         memcpy(obj->als_level,obj->hw->als_level, sizeof(obj->als_level));

         BUG_ON(sizeof(obj->als_value)!= sizeof(obj->hw->als_value));

         memcpy(obj->als_value,obj->hw->als_value, sizeof(obj->als_value));

         atomic_set(&obj->i2c_retry,3);

         set_bit(CMC_BIT_ALS,&obj->enable);

         set_bit(CMC_BIT_PS,&obj->enable);

 

         APS_LOG("ltr559_devinit()start...!\n");

         ltr559_i2c_client= client;

 

 

         if(ltr559_check_alive()< 0)                //check ps sensorid ,verify i2c communication

                   return-1;

 

         if(err= ltr559_devinit())                     //pssensor 初始化,注册中断函数

         {

                   gotoexit_init_failed;

         }

         APS_LOG("ltr559_devinit()...OK!\n");

 

         obj_ps.self= ltr559_obj;

         if(1== obj->hw->polling_mode_ps)

         {

                   obj_ps.polling= 1;

         }

         else

         {

                   obj_ps.polling= 0;

         }

         obj_ps.sensor_operate= ltr559_ps_operate;         //ops

         if(err= hwmsen_attach(ID_PROXIMITY, &obj_ps)) //ps sensor 注册到sensor系统

         {

                   APS_ERR("attachfail = %d\n", err);

                   gotoexit_create_attr_failed;

         }

         obj_als.self= ltr559_obj;

         obj_als.polling= 1;

         obj_als.sensor_operate= ltr559_als_operate;

         if(err= hwmsen_attach(ID_LIGHT, &obj_als))// //als sensor 注册到sensor系统

         {

                   APS_ERR("attachfail = %d\n", err);

                   gotoexit_create_attr_failed;

         }

 

#if defined(CONFIG_HAS_EARLYSUSPEND)

         obj->early_drv.level    = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1,

         obj->early_drv.suspend  = ltr559_early_suspend,

         obj->early_drv.resume   = ltr559_late_resume,   

         register_early_suspend(&obj->early_drv);

#endif

         APS_LOG("%s:OK\n", __func__);

         return0;

 

         exit_create_attr_failed:

         exit_misc_device_register_failed:

         exit_init_failed:

         exit_kfree:

         kfree(obj);

         exit:

         ltr559_i2c_client= NULL;          

         APS_ERR("%s:err = %d\n", __func__, err);

         returnerr;

}

 

/*中断函数*/

void ltr559_eint_func(void)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值