androidGPS驱动( 三 )


androidGPS驱动

文章插图
六、linux 层
UART接口,与gps模块通信,即读取gps的信息 。
七、 GPS hal层
因为linux底层驱动只需要有uart接口就可以接收到gps数据了,而的hal层会调用linux内核层的uart驱动,所以,这里uart驱动就不再分析了,只要hal层打开串口,然后read就可以了,这里我参考的是模拟器的gps 。
自己新建的文件夹,用来适配gps:
//gps
gps头文件:
////gps.h
首先看一下这个结构体 。
[html] view plain copy
/**.*/{/**()*/;/**.*/;/**.*/;/**.*/;/***.*/;/**.*/;/**.*/;/**.*/;/**.*/;};
所有我们要知道的数据都在这里了:经度、纬度、海拔、速度、精确度、世界标准时间等 。而上层也只是需要这个数据结构,所以只要把这个数据结构给上层,那么就OK了 。
下面还是主要分析下模拟器是如何实现的 。先看下简单的流程图:
androidGPS驱动

文章插图
首先看下hw主要结构体,gps是注册为hw模块的 。编译后是生成gps.*.so的,而他的方法是调用 。
[html] view plain copy
M={.tag=,.=1,.=0,.id=ID,.name="",.="",.=&,};而又调用了={.open=};
再看看做了什么,初始化了很多函数指针,具体含义可以看
[html] view plain copy
={(),,//打开接口,提供函数,//开始导航,//停止导航,//关闭接口,//注入当前时间tion,//注入从其他定位方式得的当前位置 。,//,//设置坐标模式on,//扩展信息};
然后再看看各个函数,这些函数是jni层会调用到的,这里简单介绍初始化、数据上报等操作 。
首先是初始化函数,这里调用了函数,然后在这里打开我们要的串口驱动设备,开启读取gps数据的线程 。
[html] view plain copy
state->fd=open(,);state->=->("”,,tate);
当线程启动以后,那么就会在这个线程中处理一些事情了,接着看下函数 。
这里会把函数给设置好,用以传数据给jni层 。
[html] view plain copy
back(,state->.);
串口读取gps的数据ret = read( fd, buff, (buff) );
解析数据 (, buff[nn] );
然后他会调用(r );函数
这个函数会根据不同的gps协议格式来分别处理 。
if ( !(tok.p, "GGA", 3) )
这里会根据GGA的格式来处理,比如:
androidGPS驱动

文章插图
更新时间ime(r, );
更新经纬度
更新海拔
[html] view plain copy
(!(tok.p,"GLL",3))(!(tok.p,"GSA",3))(!(tok.p,"GSV",3))
其他的依次都差不多 。具体可以看源码 。
最后处理完了以后,把便要把数据给jni层了 。通过r->( &r->fix );这个函数,就是数据传输的主要函数了 。
八、 GPS的JNI层
先还是看下jni层的主要流程吧:分为1、java到jni到hal和2、hal到jni到java 。
androidGPS驱动

文章插图

androidGPS驱动

文章插图
GPS的jni的代码是在下面这个目录下的:
[html] view plain copy
//base//jni/.cpp
在.cpp文件中,实现JNI方法 。注意文件的命令方法,前缀表示的是包名,表示硬件服务是放在/base//java目录的com///目录下的,即存在一个命令为
com....的类 。
在同一个目录下有一个.cpp,这个会注册这个jni并且调用来实现java层到hal层的接口的调用 。
在t函数中,通过硬件抽象层提供的方法来加载模块ID为ID的硬件抽象层模块,其中,ID是在中定义的 。硬件抽象层会根据ID的值在系统的//lib/hw目录中找到相应的模块,然后加载起来,并且返回接口给调用者使用 。在hods函数中,第二个参数的值必须对应所在的包的路径,即com//// 。