Android 系统中,很多东西会依赖 Gsensor 方向,比如:Camera、系统转屏,及其他 APP,因此 Gsensor 的方向正不正常,将会影响到系统能不能正常用。
在 Rom 开发,Gsensor 的调校往往是由驱动工程师去做的,但求人不如求自己,作为软件工程师,至少应该了解一下如何调节 Gsensor 方向。
下面将简单介绍一下Gsensor的方向调节,不需要看懂代码,知道怎么调节就可以了。
1、
找到项目的 dts 文件,它一般在:
\kernel-xx\arch\arm\boot\dts\project.dts
这里的kernel-xx
取决于项目用的哪个,不清楚可以咨询下驱动的同事;project 替换成对应的项目名,也就是launch时选的那个。
2、
在 dts 文件中搜索gsensor
,将会看到如下代码:
gsensor@18 {
compatible = "mediatek,gsensor";
reg = <0x18>;
direction = <13>;/* ,5,*/
};
这里面direction
就是用来控制 Gsensor 方向的,13
就是当前的方向,具体调节时,需要以13
作为参考依据。
3、
这个13
到底代表什么,我们不知道,不过源码上给了一段Human readable
的对照代码,这段代码在:
\kernel-xx\drivers\misc\mediatek\sensors-1.0\hwmon\hwmsen\hwmsen_helper.c
在这个文件中,搜索hwmsen_convert
,就会看到这段代码:
struct hwmsen_convert map[] = {
/*0*/ {{ 1, 1, 1},{1,0,2}},
/*1*/ {{-1, 1, 1},{1,0,2}},
/*2*/ {{ 1,-1, 1},{1,0,2}},
/*3*/ {{ 1, 1,-1},{1,0,2}},
/*4*/ {{-1,-1, 1},{1,0,2}},
/*5*/ {{-1, 1,-1},{1,0,2}},
/*6*/ {{ 1,-1,-1},{1,0,2}},
/*7*/ {{-1,-1,-1},{1,0,2}},
/*8*/ {{ 1, 1, 1},{0,1,2}},
/*9*/ {{-1, 1, 1},{0,1,2}},
/*10*/ {{ 1,-1, 1},{0,1,2}},
/*11*/ {{ 1, 1,-1},{0,1,2}},
/*12*/ {{-1,-1, 1},{0,1,2}},
/*13*/ {{-1, 1,-1},{0,1,2}},
/*14*/ {{ 1,-1,-1},{0,1,2}},
/*15*/ {{-1,-1,-1},{0,1,2}},
};
这里面,第一组{1, 1, 1}
用来控制 XYZ 轴的反转,也就是说,当 XYZ 某一个或某几个出现反向了,就需要调整这一组,将对应的值取修改为负值
。
灵魂画师来煮个栗子,比如Y轴正常,X轴表现出来是反的那么就是下面这个样子:(Z轴垂直于屏幕向上,灵魂画师画不出来,大家凑合看看,自己脑补一下Z轴。)
第二组{1,0,2}
用来控制 XYZ 轴的对调,意思就是说,当 XYZ 变成 XZY、ZXY、ZYX 等时,就需要调整这一组值,但这里调整的时候,不需要取负值,直接交换位置就可以了。
灵魂画师决定再煮个栗子,假设XY轴表现出来的是对调的,也就是下面这个样子:(灵魂画师仍旧画不出来 Z 轴)
到这里,相信大家已经明白为什么要记住前面的direction = <13>
,并要以它为参考依据进行调整了。
总结:
如何调整 Gsensor 方向并不难,重点在理清楚 hwmsen_convert 的对应关系,然后根据机器表现进行修正就可以了。
但是,这里还有一个重中之重的问题,那就是如何确定 XY 轴!要想确定 XY 轴,首先得搞清楚机器的0度方向,这个方向一般就是平放机器,开机后机器显示的方向。
注意,Android 设备这么多种,并不是所有设备都是长边是 Y轴,短边是 X轴 的。
灵魂画师继续煮栗子,假设机器平放开机后是竖屏显示的,那 XY 就是这样的:
假设平放开机后是横屏显示的,那 XY 就是这样子的:
上面的事例图仅供参考,实际情况可能远比这个复杂,请根据实际情况来。