首页 > 技术知识 > 正文

1. 前言

全志平台ap6476模组 gps功能调试

2. android定位服务框架

Android上可通过gps、wifi或电话基站进行定位,gps能提供最精准的定位但定位需要的时间是最多。Android的定位服务框架图如图:

全志平台ap6476模组 gps功能调试

由应用至实际的数据接收,可把服务框架划分为五层:

应用层,android.location包中包含的内容,以Java语言提供的API; 框架层,包含系统服务的实现,主要由Java语言实现; 共享库层,由C以及C++语言实现,框架层与共享库层使用JNI进行衔接; 内核层,android系统运行的基础,gps模组与android层交互的通道; gps模组,卫星定位数据接收模块; 3.android定位服务代码结构

android定位服务涉及到applicant、framework、JNI和HAL四层

(1)applicant

文件路径:\android4.2\frameworks\base\location 应用层实现供应用程序调用的类,如LocationManager、GpsStatus、LocationProvider等,这些实现的类均集成在android.location包中。

(2)framework

涉及的文件有: \frameworks\base\services\java\com\android\server\LocationManagerService.java \frameworks\base\services\java\com\android\server\location\GpsLocationProvider.java LocationManagerService.java是实现框架层位置服务的类,是一个系统服务。 GpsLocationProvider.java实现JNI层与framework层的通讯,为上层提供服务。

(3)JNI

文件路径:\frameworks\base\services\jni\com_android_server_location_GpsLocationProvider.cpp JNI层依赖HAL层接口,提供GpsLocationProvider.java本地方法的实现,本地方法和JNI方法是一一对应。

(4)HAL

文件路径:\hardware\libhardware\include\hardware\gps.h HAL层是与硬件相接触,用C语言实现,gps.h是gps模块HAL的头文件,里面包含很多常量(这些常量和GpsLocationProvider.java中的内容相对应)和结构体的定义。 Android源生代码中提供高通gps HAL层的实现,文件路径:\hardware\qcom\gps

4. 移植说明

gps功能移植只涉及android层的修改,内核不需要做修改,gps的数据通道是串口,跟蓝牙共用一路串口,串口会在系统启动被打开。

(1)fiber-xxx.mk

平台文件fiber-xxx.mk会把移植包的3个非源码文件拷贝到指定的目录。

PRODUCT_COPY_FILES += \ device/softwinner/fiber-xxx/ap6476/gps.default.so:system/lib/hw/gps.default.so \ device/softwinner/fiber-xxx/ap6476/gpsconfig.xml:system/etc/gps/gpsconfig.xml \ device/softwinner/fiber-xxx/ap6476/glgps:system/bin/glgps

(2)init.sun6i.rc 平台文件init.sun6i.rc会创建gps数据目录、修改glgps和gps.default.so的执行权限和指定执行组,开启gps服务进程。

/data/gps目录的创建,/data/gps、glgps、gps.default.so执行权限的修改和执行组的指定:

# ap6476 gps chmod 777 /system/bin/glgps chown root system /system/bin/glgps chmod 777 /system/lib/hw/gps.default.so chown root system /system/lib/hw/gps.default.so mkdir /data/gps chmod 777 /data/gps chown root system /data/gps

Gps服务进程的开启:

service gpsd /system/bin/glgps -c /system/etc/gps/gpsconfig.xml class main user root group system

gpsd进程的名称,/system/bin/glgps是进程的执行文件,gpsconfig.xml是glgps要解释的配置文件。 gpsd服务会在系统启动过程被加载,指定服务类是main,所在组是system,用户名是root。 由于服务开启中没有指定oneshot和onrestart选项,所以gpsd这个服务会一直存在,即使通过kill+进程号命令把其kill,它会立即被加载启动,可以看到gpsd的进程号是不一样的。

5. 调试及问题 (1)gpsd服务开启了但gps无法运行 问题:

系统启来后,由ps命令看到gpsd服务已正在运行,用gps测试apk测试定位,没接收到gps数,状态栏也没有显示gps运行的图标。

问题分析:

gps服务加载系统默认的gps库gps.fiber.so,而不是加载gpsd服务需要的gps.default.so库。 gps.fiber.so库是由于fiber-common下声明了BOARD_USES_GPS_TYPE为simulator而编译的,这是用于模拟器运行使用。

解决方法:

修改fiber-common/BoardConfigCommon.mk文件,把BOARD_USES_GPS_TYPE的声明去掉。

(2)gps数据 问题:

能否通过打印信息看gps是否能work。

解决方法:

可以打开gps HAL层的打印信息,通过打印看是否有接收到卫星数据初步判断gps是否work,若接收到卫星数据则代码gps已经在work。 gps HAL层打印信息的开关是在gpsconfig.xml文件中,把cLogEnabled赋值为true即可。

注:样机调试时可通过”busybox vi /system/etc/gps/gpsconfig.xml”对gpsconfig.xml文件进入修改而不用重新打包固件再烧写。

(3)天线问题

天线的好坏会直接影响到gps定位的速率和效果,能接收到卫星数据则代表gps已经在work,开始从卫星数据中提取星历的相关数据,相同的测试环境下,天线良好的样机定位时间比天线差的样机要短,天线差有可能会导致无法定位。

猜你喜欢