首先我们要了解这么一个基本概念:地磁传感器必须和重力传感器一起工作,指南针才可以正常工作。
一. 调试要点:
1. 重力传感器的3轴有方向性,地磁传感器的数据输出也有方向性。我们必须根据硬件layout布板传感器的相对LCD视图的位置配置正确的位置,指南针才能指示正确的方向。
2. Mag3110的驱动在linux底层注册时,其实是注册了两种Input设备,一种是地磁设备FreescaleMagnetometer,另一种是电子罗盘eCompass。后者会输出指南针等APP应用所需要的两种类型数据(magnetic 地磁和orientation方向)。
3. 飞思卡尔在系统启动时额外增加了一个名为magd的service,当系统启动时该service会检查系统中是否存在地磁传感器FreescaleMagnetometer及重力传感器以及eCompass这三种设备(前两者实际存在,有具体的硬件IC),如果不存在,则退出服务。
4. 使用地磁传感器,我们还需要在HAL 层的sensors.cpp里注册两种类型的传感器:magnetic 地磁和orientation方向。也就说上层APP可以看到有地磁传感器和方向传感器存在。
5. Mag3110的HAL层代码MagSensor.cpp,负责读取的数据为eCompass设备的input数据(包括magnetic 地磁和orientation方向),所以在FreescaleMagnetometer被enable之后,我们用getevent命令可以看到底层有报数据,但如果magd这个service未正确运行,在HAL层中是不会去读取这个数据并显示出来的。
6. 正确运行中的magd,读取FreescaleMagnetometer及gsensor传来的两种数据,经过一系列运算(飞思卡尔自己的算法,用库封装)之后生成eCompass类型的input数据,该数据才会被Mag3110的HAL层正确读取识别,并最终在上层APP中显示出来(参见附图)。
7. 但是,但是…FreescaleMagnetometer及gsensor这两种数据在被magd 这个serivice处理后会生成magnetic(地磁)数据,但如果数据输入不正确(例如gsensor 或Magnetometer方向设置不正确、数据不准确等),则orientation(方向)这个数据并不会生成出来,则此时指南针仍然不能正常工作。
8. 由于各个地方的磁场强度不同,所以我们在每个地方初次使用指南针应用时,为保准确,请先使用指南针应用中的“校准”操作,否则会出现方向偏差的问题。具体在飞思卡尔的代码中,它会保存/data/misc/fsl_mag.txt这么一个文件来保留校准参数。而在调试时,我们在需要改变数据大小或方向配置时,也请务必记得首先删除这个文件并执行重新校准的操作。
二. 调试中的重要问题:
1. HAL层代码中SensorBase(NULL, "FreescaleAccelerometer")指令,后一个参数为Input设备名,一定要以linux驱动层注册的设备名一致,否则会造成hal 层读取不到底层数据。
2. 我们在init.rc文件中除了可以对各种设备文件设置其读写权限之外,我们还可以在此启动一些可执行的文件(service服务)。例如我们增加了magd服务。
service magdservice /system/bin/magd
class main
user root
group root
onshot
需要进一步补充说明的是:
(1) 在系统system/bin中的文件为可执行文件;
(2) 如何将某个模块编译为可执行文件并放置在系统system/bin目录下呢?
LOCAL_MODULE_PATH := $(TARGET_OUT)/bin #设置编译后生成的模块需要存放的位置;
LOCAL_MODULE_CLASS := EXECUTABLES #指定编译类型为可执行文件
include $(BUILD_EXECUTABLE) #引入编译成可执行文件的规则
3. 在调试过程中指南针方向不准确,原厂FAE让检查输入的地磁数据和重力数据是否正确。在打log 中发现magd获取到的重力数据与实际输出的重力传感器数据有很大差别,进一步分析发现重力传感器输出的数据类型为int类型,而magd程序中获取重力数据时用的是short Int类型,从而造成数据只获取到重力传感器的Input数据的低16位。
4. 同样是在调试过程中,由于没有删除/data/misc/fsl_mag.txt这个文件,造成系统每次启动时仍然使用这个旧的校准参数,从而造成数据不准确,甚至无orientation(方向)数据输出(在指南针APP界面看到的现象就是指针一直静止不动)。
附图:地磁传感器数据生成流程图