---------------- 取芯片自检数据, 在工厂模式检测做fangdai处理 -----------
芯片都有自检程序, 驱动里面应该有一个节点, 调用自检程序, 返回自检程序结果. 工厂各器件测试, 先做器件的自检测试
. 然后再做其他, 先确定芯片有没有问题. 以此fangdai.
--------------- 板子调试初期, 先确定有无hall器件 -----------
hall器件对磁力线响应, 可以重直, 可以水平.
翻盖上的磁铁位置, 要先标记出hall在翻盖上的映射点, 还要根据磁铁磁力线分布, 来确定精确位置.
磁铁南北极, 以竖向分布 , 也可正反面分布.
有专门磁场强度的工具. 显示以高斯为单位.
南北极竖向分布的磁铁, 想象一下磁力线分布图, 测量时, 也是N S极测得的值最大.
正反面分布的磁铁, 边缘处比较大.
从测试来看, 磁铁上的磁场强度都是不均匀分布, 非常不均匀.
hall 反休眠. 翻盖折到手机背面时, 由于微小的错位, 磁力线也会背面chuan过hall器件, 导致手机黑屏. 如果用正反面磁
铁, 磁铁过强, 就容易发生反休眠.
如果用南北极竖向分布的磁铁, 这时磁力线水平穿越hall器件, 反休眠问题也是能生产的. 其实翻盖转360度, 就回到了0度的位置, 就是原来的位置. 只不过放在手机背面, 会距离hall器件更远一些. 正面出现的问题, 反面都有可能出现, 只不过离
hall器件更远一些.
对指南针有影响, 只因在调试初期, 有hall器件调试时, 没有把它和地磁sensor器件, 设计的距离太近, 由于没有翻盖, 开始
的时候就没有关注这个事情. 所以在调试地磁初期, 先明确有没有hall器件, 有的话, 一定要求硬件摆件摆的尽量远.
cm620放在小板上. 这样就不会有后来 这些麻烦的问题, 从源头就杜绝了这个问题
现在已经影响了, 就看影响有多大了. 有说翻盖固定在后面的, 校准好了, 不能再变的, 有的说翻盖保持与手机平行位置进
行校准的, 也有说如果不准, 就水平180度就准了. 这些现象的背后的本质原因:
指南针校准后,磁场环境就不能变了,如果翻盖一会360度,一会180度,相当于校准时,在手机后面固定了一个大磁铁, 校
准好后,看时,把这个磁铁拿下来了,然后放在手机左面3limi位置.指南针算法面对这样空间磁场变化,是无法左右逢源的
.这个环境的变化已经超出指南针算法应对范围.无力处理这样的事情 .
-------------- 指南针算法在超过70ut时进入校准状态 -----------
磁场强度有两种单位, 一是高斯, 一是特斯拉(即T), 一高斯等于100 miuT. 地球磁场在正负40 miuT, bosch九轴融合算法在受到4 miuT的干扰就进入校准状态.
有专门测量磁场强度的工具.
磁场强度随距离衰减的非常快.
附近一li米, 衰减几百高斯.
--------------------
使用体验: 模拟导航使用场景,有轻微
原始数据: 地磁sensor上报的三个数据分别是磁力线在x,y, z三个轴的磁分量。 一个轴的数据,由两个寄存器存储, 一个寄存器8位, 所以sensor数据范围0到65535. 磁场强度有正负之分,磁力线顺着坐标轴的就是正向。 正负的实现,以65535的一半,即32767来分界。大于32767,就是正的。 地磁算法先将Sensor数据剪掉32767,然后转换为高斯单位。 Sensor_list.apk看到的mag field 这个sensor就是这个数据。
硬磁软磁校准:手机上有软磁干扰和硬磁干扰。硬磁干扰使磁力线整体偏移,这种干扰物本身带有磁性物质,如磁铁。板子上的马达, 喇叭都属于硬磁。 软磁干扰使磁力线变形,磁力线会绕过去,这种干扰物本身不带磁性,如铁。如板子上的螺丝就属于软磁。 为了把手机上的硬磁,软磁校掉。 就要采集地磁数据。采集的办法,每一家不太相同。 美新的做法是,首先找一个没有磁场干扰的环境, 用机械指南针确定正北方向。 然后将手机在水平面上摆八个方向, 每个方向分正反面放置。 总共16个位置的数据。 这些数据采集好,传给特定的软件工具处理。 得到一组参数。这个参数会放到地磁算法库。 地磁算法库会建立一个球的模型, 如果没有这些校准数据, 这个球可能是个椭球, 地磁算法库根据校准数据,把这个椭球捏成一个球。
地磁算法进程把手机映射成这个球中的一个面,手机转动时,这个球是不变的,变的是映射的面。 这样,就可以得到手机的方向角(以z轴为中心的转角),滚转角(以y轴为中心的转角),俯仰角(以x轴为中心的转角)。飞机导航需要这个三个角度。
干扰: 在手机放在有干扰的环境,如果有硬磁干扰, 球心就会偏离了原点,8字校准就是把球心拉到原点。 在有软磁干扰时,球的形状发生变化, 8字校准就是要把非球的部分捏成球。
加速度对地磁算法的补偿: 若加速度变动,指南针就抖动,若加速度值不对,地磁偏差就变大,加速度若为10点多,就必须校准,所以地磁在校准前,必须先校准加速度。
坐标系映射: 地磁芯片在主板正面有四个方向摆放为,东,南,西, 北。在班子反面也有四个方向摆放,一共8个。 把芯片坐标系映射为手机坐标系(手机坐标系的原点在左下角)。 美新用左手坐标系,安卓手机默认用右手坐标系, 美新算法进程要把左手转换为右手,与bosch配合。cust_mag.c的direction代表坐标系的映射方式。 这个映射如果错了, 芯片的x轴可能映射为安卓手机的y轴或其他轴,指南针的方向角就会出错。 遇到过W3机器差了90度的情况。 当时rotation vector测试游戏每个方向都有偏差。尝试改成bosch的orientaion才发现, 偏差超过90度。 经fae提示, 改了映射方式,就解了。
虽然sensor芯片是美新的, 指南针方向角orientaion也可交给bosch去算。 由bosch算的一个好处是, 在手机静止时, 如果有磁场干扰,指南针可以定住,即抗干扰能力。
-------------------
代码是一些log在正式版本不需要出现,最好用log包起来。
sensor_list数据有异常,算法进程把算好的数据写到驱动,上层应用从驱动读出这个数据。
这个数据再从驱动o函数取出来的。 驱动相当于一个中转。 但从算法进程log来看,传进去的数
据都是对的。 但从驱动log看,给上层的数据是有异常的。 调试驱动时,要把调试log的宏打开
, 可以加上判断这个宏打没打开的log,用开关宏包起来的log能提供重要线索。 有些不是自己
能想到的, 一定要把调试的宏打开。 在解决指南针数据异常大的问题, 就是从宏包起来的log
看到的线索。 从log看, 驱动的log,可以显示出触发这个动作的上层进程。 出现异常的log是
陀螺仪算法进程, 硬件上没有陀螺仪,这个进程是不应该有的,把这个进程结束掉,问题就解决
了。
----------------------------- suspend 下电, resume上电 不init ------------
从bmg_resume(client), 即i2c_resume传过来的client参数不能用. 要用全局的i2c client.
只有有一个正确可用的client, 才能使用i2c通信.
对sensor来说, 一般在suspend有下电动作. 在resume有上电动作.
Bosch在resume有对芯片的init动作. yamahs地磁, akm地磁在resume里没有init动作.
后来bosch确认, 芯片一次init后, 再下电再上电后, 就不用再init. resume里可以不用init动作.
--------------
akm 地磁, user版本, 第一次i2c通信, 读芯片, check芯片时就出错, 原因是user版本很多log没了, 缺少了延迟, akm还没准备好, 就去读芯片id了. 结果出错. 在读芯片id前, mdelay(5) 添加5hao秒延迟. 即在reset动作后, 在读芯片前, 加5毫秒延迟. 问题就解决了.