|
Gsensor
调试方法
-Allwinner
1
/*
Gsensor
调试方法-Version
0.1
*
Allwinner
Platform
*
2013-09-20
*
Author:
tzx-leis
tzx-hkz
*/
----------------------------------------------------------------------------------------------------------------
gsensor
原理:
gsensor
的作用是测量重力在
x,y,z
3个方向的分量。重力是1G=9.8。在
gsensor
driver
打印出的
x,y,z
值就是
gsensor
对3个分量经
ADC
转换后的原始值。
故在
HAL
层中,对其会做一个转换。
xx
=
9.8*(x/(2的
n
次方))
,n
为
ADC
的位数。dmard10为10bit
ADC,
故2的
n
次方为4*256=1024。而
d06是7bit。
----------------------------------------------------------------------------------------------------------------
本文主要从
gsensor
的驱动层、HAL
层、上层校准
APK
的添加三方面来阐述
gsensor
调试的简单方法。
----------------------------------------------------------------------------------------------------------------
1,驱动层:
文件路径:\lichee\linux-3.4\drivers\gsensor
驱动层是关键,有没有数据上报,是着整个
gsensor
是否能正常工作的基础。
a),确保驱动模块已经加载(默认编译为模块方式)
$
adb
shell
进入小机
$
lsmod
查看是否
gsensor
对应的模块。
若没有加载,则通过
cat
/proc/kmsg
>
gsensor.log
查看开机
log
中加载失败原因进行分析。
b),
利用
getevent
查看驱动是否有数据上报。
$
adb
shell
进入小机
$
getevent
-p
列出所有的
input
设备,查看对应的
event0还是
event1
$
getevent
/dev/input/event1
查看数据是否连续不断上报?
若没有数据上报,则分析驱动,打印
report
处上报的值。
通常出现以上问题,常为
I2C
通信失败,在软件端可以通过驱动
log
看出。
此时先检查
I2C
地址是否正确,然后重点检查硬件
I2C
是否连好,可能是由于虚焊或者芯片损坏导致。
c),
辅助查看
gsensor
属性,获取
gsensor
设备名
$
adb
shell
进入小机
$
cd
/sys/devices/sw_device/gsensor
(文件目录不尽相同,可从驱动文件中获知实际路径)
$
cat
即可获取
gsensor
name
通常还有其他的属性可以辅助查看,以详细了解
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
轴的方向。
调试时,直接
adb
pull
出来之后修改对应的
gsensor
方向,再
adb
push
进去,重启即可生效。
----------------------------------------------------------------------------------------------------------------
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),
上层添加校准
APK
d),
配置
sys_config.fex
文件
e),
增加
recovery
功能,即恢复出厂设置后也能保存校准文件
f),
gsensor.cfg
文件
----------------------------------------------------------------------------------------------------------------
Gsensor
调试方法
-Allwinner
3
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)//default
value
is
270;
for
adapt
gsensor
rotation
set
as
180
for
720D
4,
搞不清
x、y
轴如何判定,以及是否需要对调。
5,
没有生成校准文件。可能是由于没有权限或者是丢失了
APK
对应的库文件。
6,
da311待机唤醒时概率性不报点,由于待机后,gsensor
模块断电,唤醒后寄存器会重新初始化,但是时序受
到干扰,导致有些寄存器的值发生变化,导致不报点。修改对应的驱动文件中的变化的寄存器即可。
7,
dmard10、dmard06不管校准不校准都会出现一个现象,即
x/y
轴的数值上报抖动,导致玩一些游戏(竞技
摩托)时候会左右偏,不稳定。原因是报点不稳,在驱动
read_xyz
函数中加入滤波功能。效果好很多。d10的
抖动受到喇叭声音的影响很大,是由于
IC
内部对声音噪点的抗干扰的能力很弱,暂时不能解决。
8,
da311系统重启时,概率性出现
detect
函数失败,导致检测不到
da311
gsensor。由于寄存器中分两页,
在
切页过程中出现问题,因此
detect
读之前,做一次
wirte
切页操作。
9,
软件正常,但是有些
gsensor
校准之后,报点仍然出现问题,此时芯片损坏的概率比较大,属于不良芯片。
10,
调试时发现
gsensor
报点
x,y,z
轴均为0,调试发现
gsensor.cfg
中没有对应
gsensor
的配置导致,加
上即可。
---------------------------------------------------------------------------------------------------------------- |
|