您的位置:首页 > 移动开发 > Android开发

Android系统之G-sersor调试

2016-02-28 00:17 260 查看

----------------------------------------------------------------------------------------------------------------gsensor原理:

gsensor的作用是测量重力在x,y,z3个方向的分量。重力是1G=9.8。在gsensordriver打印出的x,y,z值就是gsensor对3个分量经ADC转换后的原始值。

故在HAL层中,对其会做一个转换。xx=9.8*(x/(2的n次方)),n为ADC的位数。dmard10为10bitADC,故2的n次方为4*256=1024。而d06是7bit。

----------------------------------------------------------------------------------------------------------------本文主要从gsensor的驱动层、HAL层、上层校准APK的添加三方面来阐述gsensor调试的简单方法。----------------------------------------------------------------------------------------------------------------1,驱动层:

文件路径:\lichee\linux-3.4\drivers\gsensor

驱动层是关键,有没有数据上报,是着整个gsensor是否能正常工作的基础。a),确保驱动模块已经加载(默认编译为模块方式)

$adbshell

进入小机

$lsmod查看是否gsensor对应的模块。

若没有加载,则通过cat/proc/kmsg>gsensor.log查看开机log中加载失败原因进行分析。b),利用getevent查看驱动是否有数据上报。

$adbshell

进入小机

$getevent-p列出所有的input设备,查看对应的event0还是event1$getevent/dev/input/event1查看数据是否连续不断上报?若没有数据上报,则分析驱动,打印report处上报的值。

通常出现以上问题,常为I2C通信失败,在软件端可以通过驱动log看出。

此时先检查I2C地址是否正确,然后重点检查硬件I2C是否连好,可能是由于虚焊或者芯片损坏导致。c),辅助查看gsensor属性,获取gsensor设备名

$adbshell进入小机

$cd/sys/devices/sw_device/gsensor(文件目录不尽相同,可从驱动文件中获知实际路径)$cat即可获取gsensorname

通常还有其他的属性可以辅助查看,以详细了解gsensor的状态,如enable、delay等属性。

----------------------------------------------------------------------------------------------------------------2,HAL层

文件路径:\android\device\softwinner\common\hardware\libsensors

Gsensor调试方法-Allwinner

2

HAL主要是处理驱动层上报的数据,并对数据进行转换,由1024的DA值转换为1g。此部分需要修改较少,仅注意在兼容时,加入对新增gsensor的支持即可。HAL层与驱动层的结口为delay和enable。

gsensor.cfg存放在小机的system/usr/gsensor.cfg,用于记录各gsensor的x,y,z轴的方向。调试时,直接adbpull出来之后修改对应的gsensor方向,再adbpush进去,重启即可生效。

----------------------------------------------------------------------------------------------------------------3,上层添加校准APK文件路径:/system/app

/system/lib

上层添加校准的APK具体实现方法可参考原厂提供的文件。一般包括APK以及对应的库文件。

设置选项中添加校准APK后,最重要的一点是如何通过APK判断gsensor的报点是否准确,以及gsensor的x、y、z轴判定。a),报点是否准确

通常不经过校准的gsensor都不是非常准的,即使在小机界面能左右旋转画面,一定需要通过报点数值进行判定。

一般通过APK查看的默认的x、y、z值分别在自己的方向上为9.8附近的值即可满足校准的需求。若值为9.8的4倍或者1/2倍或者N倍,均可相应的通过驱动或者HAL进行一个修改及补偿。b),gsensor的x、y、z轴判定

当数值准确时,此时应该判断以及修改gsensor的方向,此点非常重要,一旦没有调好会导致整个gsensor的功能失效,前面所有的工作也将失去意义。

评判gsensor的方向一定不能从界面旋转正确来作为标准,需要参考标准坐标系(符合右手定则)。

何为标准坐标系:平板水平放置在桌面上,正面面对自己。此时Z轴应该为+值,且值为9.8左右,x、y轴应该为0值左右。

平行于身体的为x轴,左边不动,右边抬起时,x轴的数值应该由0开始增大,直到垂直时为+9.8左右。垂直于身体的为y轴,下边不动,上边抬起时,y中的数值应该由0开始增大,直到垂直时为+9.8左右。在辅助功能,先关闭“自动旋转屏幕”功能,安装SensorMoniter.apk,通过以上动作进行操作。若有不符合以上情况的,则相应的修改gsensor.cfg调整x、y轴的位置以及正负值,直到满足为止。然后水平放置,点击校准,此时gsensor可以正常工作。

----------------------------------------------------------------------------------------------------------------4,移植gsensor涉及的几部分a),驱动,兼容列表

b),HAL层对gsensor的支持c),上层添加校准APKd),配置sys_config.fex文件

e),增加recovery功能,即恢复出厂设置后也能保存校准文件f),gsensor.cfg文件

----------------------------------------------------------------------------------------------------------------

NOTE:各种小问题集锦

1,gsensor没有校准,导致旋转缓慢。

2,gsensor水平放置的时候z轴为-9.8附近的值,导致需要垂直操作才能旋转(正常情况下45°即可旋转)。3,没有参考标准坐标系,只通过小机界面的方向来判断x、y轴的值。导致玩神庙逃亡的时候,前后摇摆对应左右摇摆,此需要修改framework层,设置ro.sw.hwrotation。----|device目录下的wing_k70.mk文件添加:ro.sf.rotation=180

----|frameworks/base/core/java/android/hardware/SystemSensorManager.java修改如下:

----|if(SystemProperties.getInt("ro.sf.hwrotation",0)==180)//defaultvalueis270;foradaptgsensorrotationsetas180for720D

4,搞不清x、y轴如何判定,以及是否需要对调。

5,没有生成校准文件。可能是由于没有权限或者是丢失了APK对应的库文件。

6,da311待机唤醒时概率性不报点,由于待机后,gsensor模块断电,唤醒后寄存器会重新初始化,但是时序受到干扰,导致有些寄存器的值发生变化,导致不报点。修改对应的驱动文件中的变化的寄存器即可。

7,dmard10、dmard06不管校准不校准都会出现一个现象,即x/y轴的数值上报抖动,导致玩一些游戏(竞技摩托)时候会左右偏,不稳定。原因是报点不稳,在驱动read_xyz函数中加入滤波功能。效果好很多。d10的抖动受到喇叭声音的影响很大,是由于IC内部对声音噪点的抗干扰的能力很弱,暂时不能解决。

8,da311系统重启时,概率性出现detect函数失败,导致检测不到da311gsensor。由于寄存器中分两页,在切页过程中出现问题,因此detect读之前,做一次wirte切页操作。

9,软件正常,但是有些gsensor校准之后,报点仍然出现问题,此时芯片损坏的概率比较大,属于不良芯片。10,调试时发现gsensor报点x,y,z轴均为0,调试发现gsensor.cfg中没有对应gsensor的配置导致,加上即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android