概述
环境:MTK Android4.4
硬件:MT8127 MMA8653
日期:2015年6月19日
在MTK的Gsensor构架中有一个auto detect的功能,只要作用是可以添加多个GSensor驱动,然后会自动找到与硬件匹配的Gsensor驱动,这个功能是用hwmsen驱动模块来完成的。
先来看看驱动里是如何使用auto detect的
1 | static struct sensor_init_info mma8653q_init_info = { |
首先是整个hwmsen驱动的hwmsen_driver和hwmsen_device的匹配
1 | static struct platform_driver hwmsen_driver = { |
hwmsen_probe
1 | static int hwmsen_probe(struct platform_device *pdev) { |
接下来按照上面的使用流程来分析hwmsen
hwmsen_gsensor_add, 就是把sensor_init_info结构体加入到list中
1 | static struct platform_driver gsensor_driver = { |
gsensor_driver如果与gsensor_device匹配上了之后就会调用gsensor_probe
1 | static int gsensor_probe(struct platform_device *pdev) { |
gsensor_probe会调用驱动的init函数,这里是mma8653q_local_init
1 | static int mma8653q_local_init(void) { |
后面的就会在mma8653q_i2c_probe中执行,其主要是执行struct hwmsen_object sobj;并加入到hwmsen的sensor队列中。
hwmsen_get_convert:决定gsensor数据的格式
1 | struct hwmsen_convert map[] = { |
hwmsen_attach:把sensor加入到总的sensor队列里,这个队列里可以有光感,陀螺仪等...
1 | struct dev_context { |
到这里hwmsens的初始化就完成了
接下来就先open hwmsen驱动,然后就把工作都交给了hwmsen的unlocked_ioctl,即hwmsen_unlocked_ioctl函数
里面的操作函数主要是调用hwmsen_attach函数传入的hwmsen_object里面的sensor_operate,即为mma8653q_operate
1 | int mma8653q_operate(void *self, uint32_t command, void *buff_in, int size_in, |
hwmsen_unlocked_ioctl首先是HWM_IO_ENABLE_SENSOR命令,调用的是hwmsen_enable();
1 | static int hwmsen_enable(struct hwmdev_object *obj, int sensor, int enable) { |
数据的读取:
在sensro初始化的时候,初始化了一个工作队列和一个定时器:
1 | sensor_workqueue = create_singlethread_workqueue("sensor_polling"); |
每次对sensor enable后就会使能这个定时器,会执行hwmsen_poll,这个函数会唤醒工作队列。工作队列会执行hwmsen_work_func函数
1 |
|
然后会调用hwmsen_unlocked_ioctl的HWM_IO_GET_SENSORS_DATA命令即可读取数据
最后
以上就是时尚小兔子为你收集整理的android g-sensor 驱动源码分析的全部内容,希望文章能够帮你解决android g-sensor 驱动源码分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复