Android 传感器分析之Driver层(轮寻方式)

1.随便以一个Andorid中的传感为例,我这里用alsp中的stk3x1x为例子。

  首先在这个传感器驱动入口stk3x1x_init中调用函数hwmsen_alsps_add,将该驱动初始化之类操作函数注册到alsps_init_list中.

2.然后在开机初始化时候,调用hwmsen_dev.c驱动入口函数hwmsen_init,首先调用函数hwmsen_driver->probe,在该函数中进行了一系列传感器组工作的初始化.
          (1)初始化传感器组接受数据的数据结构,init_static_data();
          (2)定义工作列队(hwmsen_work_func),和初始化定时时钟(init_timer(&obj->timer);),之后hwmsen_work_func就会以obj->delay的频率循环运行.
                  hwmsen_work_func作用:
                             循环扫描注册了的所有传感器,调用他们各自的操作函数obj.sensor_operate ,读取数据,之后更行定时时钟mod_timer,

                             延时obj->delay后在重新运行hwmsen_work_func.

          (3)注册Input子系统,input在传感器hwmsen_work_func函数有数据更新时候之后,上报键值。
          (4)注册混杂设备#define HWM_SENSOR_DEV_NAME "hwmsensor"
                                            hwm_obj->mdev.name = HWM_SENSOR_DEV_NAME;
                                            misc_register(&hwm_obj->mdev);
                              在hwmsen_fops中,实现了函数hwmsen_unlocked_ioctl;
                              在hwmsen_unlocked_ioctl中,实现了:
                                                 HWM_IO_SET_DELAY 设置延时
                                                 HWM_IO_ENABLE_SENSOR 使能传感器
                                                 HWM_IO_GET_SENSORS_DATA 读取传感器数据等功能。
         (5)设置传感器电源管理挂起和恢复相关函数:
                             hwm_obj->early_drv.suspend = hwmsen_early_suspend。
                             hwm_obj->early_drv.resume = hwmsen_late_resume。

3.继续以stk3x1x.c为例,它属于alsp,继续调用函数: alsps_driver->alsps_probe;
         alsp_probe功能:
          (1)扫描alsps_init_list,在最开始时候我们将stk3x1x加入了alsps_init_list中,所以扫描到了stk3x1x,然后调用它初始化函数alsps_init_list[i]->init()
          (2)init对应的就是stk3x1x.c中的stk3x1x_init_info->stk3x1x_local_init
                      该函数会:得到struct alsps_hw *hw 的初始数据
                                          注册到I2c中:i2c_add_driver(&stk3x1x_i2c_driver)
          (3)注册I2c之后,接着I2c子系统会扫描,i2c对应总线上是不是真的挂了stk3x1x,得到了stk3x1x的应答之后,调用函数:
                            stk3x1x_i2c_driver->stk3x1x_i2c_probe
          (4)在i2c_probe中,比较重要的是:对stk3x1x做一些初始化赋值,
                            注册混杂设备als_ps。
                            关联传感器的操作函数.
                     注:stk3x1x有两个传感器,光线亮度和压力
                     对应的操作函数为:
                                obj_ps.sensor_operate = stk3x1x_ps_operate;
                                obj_als.sensor_operate = stk3x1x_als_operate;
                     在上述的hwmsen_work_func函数中循环扫描的传感器操作函数obj.sensor_operate,对应stk3x1x的就是如上关联的函数。
4.最后在driver层中,就是hwmsen_work_func不断地以频率obj->delay循环的调用注册了的传感组关联的操作函数obj.sensor_operate。
   当传感器有数据更新的时候,input会上报键值做标示位,然后通过混杂设备接口hwmsensor可以读取到更新的传感器数据。
  同时可以通过hwmsensor实现的hwmsen_unlocked_ioctl进行,传感器使能与否,读取数据频率设置,读取数据之类的功能操作。

你可能感兴趣的:(android,传感器,linux驱动)