导航:首页 > 操作系统 > android编译mma

android编译mma

发布时间:2023-03-14 05:23:31

‘壹’ 如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转

一部智能手机或便携设备应具有Wi-Fi 和互联网功能,能够运行应用软件等诸多特征,而且一定会具有内置传感器。高端智能手机可能集成接近传感器,环境光传感器,3
轴加速度计,以及磁力计等多种传感器。 Android 2.3
添加了一些支持多种新型传感器的API,包括陀螺仪、旋转向量、线性加速度、重力和气压传感器等。应用软件可以使用这些新型传感器,将它们组合起来,就可以实现高精确度的高级运动检测功能。

3 轴加速度计或低g 值传感器是Android API
支持的传感器之一,具有特定的坐标系统,可以给应用程序提供标准的接口数据。坐标空间的定义与手机屏幕的默认方向有关,如图1所示。



1. 3 轴加速度计的Android 坐标系统

在Android 坐标系统中,坐标原点位于屏幕的左下角,X 轴水平指向右侧,Y 轴垂直指向顶部,Z
轴指向屏幕前方。在该系统中,屏幕后方的坐标具有负的Z 轴值。Android 加速度计数据定义为:

Sensor.TYPE_ACCELEROMETER

所有数值都采用SI
标准单位(m/s2),测量手机的加速度值,并减去重力加速度分量。

values[0]:x 轴上的加速度值减去Gx
values[1]:y
轴上的加速度值减去Gy
values[2]:z 轴上的加速度值减去Gz

例如,当设备平放在桌上并推着其左侧向右移动时,x
轴加速度值为正。当设备平放在桌上时,加速度值为+9.81,这是用设备的加速度值 (0 m/s2) 减去重力加速度值 (-9.81 m/s2)得到的。


当设备平放在桌上放,并以加速度A m/s2 朝天空的方向推动时,加速度值等于A+9.81,这是用设备加速度值(+A
m/s2)减去重力加速度值(-9.81 m/s2)得到的。

表 1
列出了与设备的各个位置相对应的传感器的加速度值读数。用户可以用下表检查加速度计的方向与系统坐标是否一致。

在 Android HAL 文件中改变 X、Y 和Z 轴的方向

在 HAL
文件中,会有一组宏定义,用于把从传感器中读取的加速度数据转换为标准单位(m/s2)。如以下代码:

// conversion of
acceleration data to SI units (m/s^2)
#define CONVERT_A (GRAVITY_EARTH /
LSG)
#define CONVERT_A_X (-CONVERT_A)
#define CONVERT_A_Y (CONVERT_A)

#define CONVERT_A_Z (CONVERT_A)

在这个宏定义中,常量GRAVITY_EARTH
是一个标准重力加速度值,即9.81m/s2,LSG为一个重力加速度值的最小有效计数值,例如,MMA8452
在正常模式下的读数为1024。因此,CONVERT_A 用于把从加速度传感器中读取的数据,从数字读数转换为标准重力加速度单位。


通过分别修改CONVERT_A_X、CONVERT_A_Y 和CONVERT_A_Z,我们可以轻松地改变X、Y 和Z
轴的方向。如果该轴的方向与系统定义相反,可以使用(-CONVERT_A)来改变其方向。如果方向一致,就使用(CONVERT_A),则保持方向不变。


这个宏定义位于FSL Android 9 (Android 2.2)驱动程序的HAL文件sensor.c 中。对于FSLAndroid 10
(Android 2.3),您可以在’libsensors’文件夹的HAL 文件Sensor.h 中找到它。

在 Android 2.2 HAL
文件中交换X 轴和Y 轴

在某些情况下,X 和Y 轴必须进行交换,以便使传感器数据的坐标与系统坐标保持一致。

对于 FSL
Android 9 (Android 2.2)驱动程序来说,X 轴和Y 轴的交换非常简单。首先,在HAL 文件sensor.c
中,在函数sensor_poll() 中找到以下代码:

switch (event.code) {
case ABS_X:

sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case
ABS_Y:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;

case ABS_Z:
sSensors.acceleration.z = event.value * CONVERT_A_Z;

break;
}

然后,根据如下所示修改代码:

switch (event.code) {
case
ABS_X:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;

case ABS_Y:
sSensors.acceleration.x = event.value * CONVERT_A_X;

break;
case ABS_Z:
sSensors.acceleration.z = event.value *
CONVERT_A_Z;
break;
}

在 Android 2.3 的HAL 文件中交换X 轴和Y 轴


Android 2.3 的HAL 文件中交换X 轴和Y 轴会更加复杂些,因为它具有更复杂的HAL文件结构。所有HAL
文件都位于文件夹‘libsensors’中。文件AccelSensor.cpp 中的两个函数需要修改。


首先,修改函数AccelSensor()的代码,如下所示:

if
(accel_is_sensor_enabled(SENSOR_TYPE_ACCELEROMETER)) {
mEnabled |=
1<<accelerometer; if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X),
&absinfo)) {
mPendingEvents[Accelerometer].acceleration.y =
absinfo.value * CONVERT_A_Y;
}
if (!ioctl(data_fd,
EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) {

mPendingEvents[Accelerometer].acceleration.x = absinfo.value * CONVERT_A_X;

}
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) {

mPendingEvents[Accelerometer].acceleration.z = absinfo.value * CONVERT_A_Z;

}
}

然后,修改函数processEvent()的代码,如下所示:

void
AccelSensor::processEvent(int code, int value)
{
switch (code) {

case EVENT_TYPE_ACCEL_X:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.y = value * CONVERT_A_Y;
break;

case EVENT_TYPE_ACCEL_Y:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.x = value * CONVERT_A_X;
break;

case EVENT_TYPE_ACCEL_Z:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.z = value * CONVERT_A_Z;
break;

}
}

完成后,X 轴和Y 轴的数据就互相交换了。

在 Kernel 驱动文件中交换X 轴和Y 轴


X 轴和Y 轴的数据交换可以在底层的Linux 驱动中,在刚开始读取传感器数据时实施。通过这种方法,无论传感器芯片以何种方式安装在PCB
中,或者使用各种不同类型的传感器,HAL 文件都可以保持一致。

对于 Android 2.2 和2.3
来说,执行该操作的最便捷的方式是修改函数report_abs()中的代码。在该函数中,传感器数据通过调用函数mma8452_read_data()读取,如下所示(当使用的传感器为MMA8452Q
时):

if (mma8452_read_data(&x,&y,&z) != 0) {

//DBG("mma8452 data read failed ");
return; }

X 轴和Y
轴可以通过以下方式轻松交换:

if (mma8452_read_data(&y,&x,&z) != 0) {

//DBG("mma8452 data read failed ");
return; }

对于 Android
2.2,MMA8452 的Kernel 驱动文件为mma8452.c;对于Android 2.3,驱动文件是‘hwmon’文件夹中的mxc_mma8452.c。


在 Kernel 驱动文件中改变 X、Y 和Z 轴的方向

传感器数据的方向也可以在Kernel
驱动文件中更改。以下带有注释的语句可以添加到函数report_abs()中,从而改变数据方向:

if
(mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read
failed ");
return;
}
x *= -1; //Reverse X direction
y *= -1;
//Reverse Y direction
z *= -1; //Reverse Z direction

input_report_abs(mma8452_idev->input, ABS_X, x);

input_report_abs(mma8452_idev->input, ABS_Y, y);

input_report_abs(mma8452_idev->input, ABS_Z, z);

input_sync(mma8452_idev->input);

总结

Android
系统已经为加速度计定义了坐标系统,因此用户必须转换从实际传感器中读取的数据,从而与其保持一致。无论是否需要转换,都应检查X、Y 和Z
轴的方向以及X-Y轴坐标。我们可以更改HAL 文件或Kernel 驱动文件来改变轴的方向,或交换X 和Y 轴,但是不要同时修改HAL 文件和Kernel 驱动。

找找

阅读全文

与android编译mma相关的资料

热点内容
qt用vs2015编译 浏览:547
结婚日子最好的算法 浏览:791
安卓怎么把数据传到苹果里 浏览:501
编译器标识 浏览:789
编程珠玑第三章 浏览:782
windows如何开启tftp服务器 浏览:107
欧姆龙plc编程指令表 浏览:186
程序员远程收入不稳定 浏览:860
算法原理怎么写 浏览:469
有个动漫女主蓝头发是程序员 浏览:998
云服务器资源评估 浏览:882
微云下载文件夹是空的 浏览:3
r9数控车的编程 浏览:403
为什么删不掉ksafe文件夹 浏览:291
理科男学编程用什么电脑 浏览:839
安阳弹性云服务器 浏览:570
压缩空气储罐有效期 浏览:408
英国文学PDF 浏览:175
软件编程需求 浏览:626
广州哪里解压 浏览:253