地磁驱动及算法进程

----------------    取芯片自检数据, 在工厂模式检测做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毫秒延迟.  问题就解决了.

时间: 2024-10-14 13:18:57

地磁驱动及算法进程的相关文章

YJX_Driver_032_自写驱动保护XX进程

1. 自写驱动保护XX进程(HOOK SSDT) A.构建自己的内核函数(用来替换对应的内核函数) C.Hook和UnHook函数构建 D.修改EXE和SYS对应源代码实现所谓保护 E.测试效果 2. 一.以28课的代码为例 新建一个hook.h单元 #pragma once#ifdef __cplusplusextern "C"{#endif #include <NTDDK.h> //这里包含需要用C方式编译的头文件 #ifdef __cplusplus}#endif /

【转】[内核/驱动]驱动中获取进程全路径和注册表全路径

转载地址: http://blog.sina.com.cn/s/blog_60a1a51d0100e78g.html 2008.07.05 经过这几天的努力,注册表保护驱动已经基本稳定.很多人都在网上问如何获取访问注册表的进程全路径和被访问的注册表的全路径,下面就将部分代码贴出来. //驱动中获取被访问注册表的全路径 BOOLEAN GetRegFullPath(HANDLE KeyHandle, PUNICODE_STRING pRegFullPath) { POBJECT pKey = NU

驱动层得到进程的完整路径

在得到进程EProcess之后,对于进程完整路径的获得一般有两种方法,一种是访问的进程的PEB结构,在PEB结构中保存有进程的完整路径,另一种方法就是采用访问_FILE_OBJECT的方法. 访问PEB的方法便存在线程靠挂的问题,因为运行于Ring0层的线程是无法去访问用户地址空间的,需要将线程暂时靠挂到目标呢进程,进而去访问进程的PEB结构.我一般都采用的访问_FILE_OBJECT的方法,避免了线程的靠挂问题,而且访问peb的方法会存在一个问题:如果想要进行进程拦截,在进程未启动之前就阻止进

(56)Linux驱动开发之二

内核基础 1.linux内核主要是由进程调度.内存管理.虚拟文件系统(字符设备驱动和块设备驱动).网络接口(网络设备驱动)和进程通信5个子系统组成的. 1)进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中"微观串行,宏观并行"地执行. 2)内存管理的主要作用就是控制多个进程安全的共享主内存区域,当CPU提供内存管理单元时,linux内存管理完成为每个进程进行虚拟内存到物理内存的转换.一般而言,linux的每一个进程享有4GB的内存空间.0~3GB为用户空间,3~4G

图解zookeeper FastLeader选举算法【转】

转自:http://codemacro.com/2014/10/19/zk-fastleaderelection/ zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader.其默认选举算法为FastLeaderElection. 不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务.其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务.在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些

【算法基础】由插入排序来看如何分析和设计算法

插入排序及其解决思路 算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的. 就像编程语言中的"Hello World!"程序一般,学习算法一开始学的便是排序算法.排序问题在日常生活中也是很常见的,说得专业点: 输入是:n个数的一个序列<a1,a2,...,an?1,an> 输出是:这n个数的一个全新的序列<a,1,a,2,...,a,n?1,a,n>,其特征是a,1≤a,2≤...≤a,n?1≤a,n 举

基于请求的分布式互斥算法

一个悲剧的文章,研究的东西确实比较老,但是因为这些研究,让我对分布式的底层的关系有了更加清晰的认识,也算是不枉此功. 下面贴出来核心的部分. 引言 分布式系统中的一组进程可能会同时访问一个资源或者同时执行一个给定的函数,我们称这些资源或者函数为临界区(Critical Section),若不加控制的话,会造成资源或者环境的不一致的现象.保证任何给定时刻只允许一个进程或者给定的进程去执行临界区的算法称为互斥算法.互斥也可以称为并发控制. 这个问题最早由Dijkstra[1]在1965年提出.互斥可

Linux进程查看与管理、作业控制、网络客户端工具

写在前面: 博客书写牢记5W1H法则:What,Why,When,Where,Who,How. 本篇主要内容: ● 基础概念介绍 进程优先级 进程状态 ● 进程查看与管理命令     pstree     ps     pgrep/pkill     pidof     top     htop     vmstat     pmap     glances     dstat     kill     killall ● linux作业控制     nice     renice ● 网络客户

【万字博文】分析与设计:插入排序和分治算法、递归和迭代的探讨

插入排序及其解决思路 算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的. 就像编程语言中的"Hello World!"程序一般,学习算法一开始学的便是排序算法.排序问题在日常生活中也是很常见的,说得专业点: 输入是:n个数的一个序列<a1,a2,...,an?1,an> 输出是:这n个数的一个全新的序列<a,1,a,2,...,a,n?1,a,n>,其特征是a,1≤a,2≤...≤a,n?1≤a,n 举