android sensors 总结(三)

3 sensor driver

 

相关结构体

//Sensor device 抽象

struct hwmdev_object {

         structinput_dev   *idev;

         structmiscdevice   mdev;

         structdev_context *dc;

         structwork_struct  report;

         atomic_t            delay; /*polling period for reportinginput event*/

         atomic_t            wake;  /*user-space request to wake-up, used withstop*/

         structtimer_list   timer;  /* polling timer */

         atomic_t            trace;

         uint32_t                     active_sensor;                            // Active, buthwmsen don't need data sensor.                                                                                         //Maybeother need it's data.

         uint32_t                     active_data_sensor;                 // Active and hwmsen need datasensor.

         //addfor fix resume issue

         structearly_suspend    early_drv;

         structwake_lock        read_data_wake_lock;

         atomic_t                early_suspend;

         //addfor fix resume end

};

 

struct dev_context {

   int              polling_running;

   struct mutex lock;

   struct hwmsen_context* cxt[MAX_ANDROID_SENSOR_NUM+1];

};

 

struct hwmsen_context { /*sensor context*/

         atomic_t                enable;

         atomic_tdelay;

         uint32_tdelayCountSet;

         uint32_tdelayCount;

        

         structhwmsen_object    obj;

};

 

/*------------sensorsdata----------------------------------------------------*/

typedef struct {

         /*sensor identifier */

         int  sensor;

         /*sensor values */

         int    values[3];

         /*sensor values divide */

         uint32_tvalue_divide;

         /*sensor accuracy*/

         int8_tstatus;

         /*whether updata? */

         int    update;

         /*time is in nanosecond */

         int64_t     time;

 

         uint32_t   reserved;

}hwm_sensor_data;

 

typedef struct {

         hwm_sensor_datadata[MAX_ANDROID_SENSOR_NUM];

         intdate_type;

}hwm_trans_data;

 

 

static int hwmsen_probe(structplatform_device *pdev)

{

 

         interr;

         //HWM_LOG("+++++++++++++++++hwmsen_probe!!\n");

 

         HWM_FUN(f);

         init_static_data();  

         hwm_obj= hwmsen_alloc_object();        //alloc& init hwmsensor obj

         if(!hwm_obj)

         {

                   err= -ENOMEM;

                   HWM_ERR("unableto allocate devobj!\n");

                   gotoexit_alloc_data_failed;

         }

 

         hwm_obj->idev= input_allocate_device();      //alloc inputdevice

         if(!hwm_obj->idev)

         {

                   err= -ENOMEM;

                   HWM_ERR("unableto allocate input device!\n");

                   gotoexit_alloc_input_dev_failed;

         }

 

         set_bit(EV_REL,hwm_obj->idev->evbit);

         set_bit(EV_SYN,hwm_obj->idev->evbit);

 

         input_set_capability(hwm_obj->idev,EV_REL, EVENT_TYPE_SENSOR);         ///setevent type

         hwm_obj->idev->name= HWM_INPUTDEV_NAME;

         if((err= input_register_device(hwm_obj->idev)))                      ///

         {

                   HWM_ERR("unableto register input device!\n");

                   gotoexit_input_register_device_failed;

         }

         input_set_drvdata(hwm_obj->idev,hwm_obj);

 

         hwm_obj->mdev.minor= MISC_DYNAMIC_MINOR;

         hwm_obj->mdev.name  = HWM_SENSOR_DEV_NAME;

         hwm_obj->mdev.fops  = &hwmsen_fops;

         if((err= misc_register(&hwm_obj->mdev)))                      //注册为一个杂项设备,提供ops

         {

                   HWM_ERR("unableto register sensor device!!\n");

                   gotoexit_misc_register_failed;

         }

         dev_set_drvdata(hwm_obj->mdev.this_device,hwm_obj);

 

         //add for fix resume bug

   atomic_set(&(hwm_obj->early_suspend), 0);

         hwm_obj->early_drv.level    = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1,

         hwm_obj->early_drv.suspend  = hwmsen_early_suspend,

         hwm_obj->early_drv.resume   = hwmsen_late_resume,   

         register_early_suspend(&hwm_obj->early_drv);

         wake_lock_init(&(hwm_obj->read_data_wake_lock),WAKE_LOCK_SUSPEND,"read_data_wake_lock");

         //add for fix resume bug end

         return0;

 

         exit_hwmsen_create_attr_failed:

         exit_misc_register_failed:   

//      exit_get_hwmsen_info_failed:

         exit_input_register_device_failed:

         input_free_device(hwm_obj->idev);

        

         exit_alloc_input_dev_failed:   

         kfree(hwm_obj);

        

         exit_alloc_data_failed:

         returnerr;

}

 

static void hwmsen_poll(unsigned long data)

{

         structhwmdev_object *obj = (struct hwmdev_object *)data;

         if(obj!= NULL)

         {

                   queue_work(sensor_workqueue,&obj->report);

         }

}

 

static struct hwmdev_object*hwmsen_alloc_object(void)

{

        

         structhwmdev_object *obj = kzalloc(sizeof(*obj), GFP_KERNEL);

         HWM_FUN(f);

        

         if(!obj)

         {

                   HWM_ERR("Allochwmsen object error!\n");

                   returnNULL;

         }       

 

         obj->dc= &dev_cxt;

         obj->active_data_sensor= 0;

         obj->active_sensor= 0;

         atomic_set(&obj->delay,200); /*5Hz*/// set work queue delay time 200ms

         atomic_set(&obj->wake,0);

         sensor_workqueue= create_singlethread_workqueue("sensor_polling");

         INIT_WORK(&obj->report,hwmsen_work_func);

         init_timer(&obj->timer);

         obj->timer.expires   = jiffies + atomic_read(&obj->delay)/(1000/HZ);

         obj->timer.function = hwmsen_poll;

         obj->timer.d

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值