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

9 篇文章 0 订阅

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进行,传感器使能与否,读取数据频率设置,读取数据之类的功能操作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统传感器驱动是通过HAL来实现的。HALAndroid系统架构的一部分,主要负责与硬件设备进行交互。对于传感器驱动,HAL会提供一些标准的接口和函数,以便应用程序可以方便地访问和使用传感器数据。HAL的代码通常是由硬件厂商提供的,并且可能不会开源。在HAL,还有一个子系统叫做hemon,它主要用于监控硬件设备的传感器,比如温度传感器等。一个典型的例子是LM75温度传感器,它的代码可以在Linux内核的`driver/hwmon/lm75.c`位置找到。通过HAL和hemon子系统,Android系统可以实现对传感器的驱动和监控。\[2\]\[3\] #### 引用[.reference_title] - *1* [安卓RK3399编译驱动MPU6050,实现内核与HAL驱动](https://blog.csdn.net/qq_35158197/article/details/128165092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android模拟器学framework和driver传感器篇3(Android HAL)](https://blog.csdn.net/weixin_39885067/article/details/117509807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android Sensor Driver(三)——其它传感器驱动](https://blog.csdn.net/weixin_39610631/article/details/117531840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值