您的位置:首页 > 移动开发 > Android开发

Android GPS中间层驱动开发调试

2014-12-23 18:57 239 查看
~.Android GPS中间层驱动开发调试小结 // rkeclair_v1.02_sdkdemo , ublox芯片

调通GPS功能,用串口可打印出位置数据,并可在gpslogger应用界面上显示出来,现借此文档简要总结如下。

本文述及的GPS功能实现基于Android 2.1平台,发行版为瑞星微rkeclair_v1.02_sdkdemo及其内核工程kernel25_A7_281x,硬件开发板为瑞星微RK2818_SDK_Main_V1.0,GPS芯片为ublox 。

1、主要涉及源模块

gps_qemu.c/gps.h , android_locationProvider.cpp.

gpstest.c (新增)

2、开发思路

(1)命令行驱动,简便的调试方法。

直接利用现有的gps_qemu.c来修改部分代码,另ToolBox中增加一个Linux外部命令,作为测试桩,在测试程序里调用GPS接口,打印出GPS经纬度、方位、状态等目标数值。

(2)init进程,程序的必经之路。

同样在改完gps_qemu模块的相关代码,让它对实际终端设备进行控制后,不是手工加一个命令,而是在必经的路径上自动调用GPS上行接口gps_get_interface()以进入GPS功能程序流程来调试,一个尝试是在init 1号进程中调用gps功能,init是系统启动后第一个加载的用户空间进程。

3、开发过程及问题解决过程

(1)程序开发。

1)改造gps_qemu模块

(1)主要函数。

gps_state_thread gps_state_init/gps_state_done

(2) gps_state_init( GpsState* state )

a. 模拟器的qemu_channel_open()用宏屏蔽,改为设置实际终端设备的参数:/dev/ttyS0

b. 封装终端API以设置串口设备的波特率,奇偶性等硬件参数。

set_speed 。

set_parity。

(3) gps_state_thread( void* arg )

工作主线程,不断轮询gps芯片获取数据,解析并上报。

(4) 恢复原来的设备参数

gps_state_init/gps_state_done中成对编码,即设备初始化前识记原来设备参数值,退出GPS程序前还原它们。

2)toolbox中新增模块gpstest

增加一个源模块gpstest.c ,主函数gpstest_main(),实现GPS经纬度、状态,SV状态等数据捕捉、打印功能。

修改本地Android.mk,主要是加入gpstest命令(编译器加后缀".c",转为源文件名),且要求链接libhardware_legacy.so ,libandroid_runtime以调用gps接口,makefile脚本修改如下图所示。

(1)tool列表中加入新命令名 gpstest 。

(2)加入动态库*.so链接: libhardware_legacy

3)JNI 接口编译方式调整

C++和C是两种完全不同的编译链接处理方式,直接在C++里面调用C函数,会报链接错误,找不到相关实体。所以,要在C中调用C++的接口,C++的全局变量或函数名需编译成C的风格,使C代码可以识别到。

本例是要在C模块中调用 C++的非成员函数,只需将 C++ 函数或全局变量声明为 extern "C"(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。如果是要在 C 里调用成员函数(包括虚函数),则另需提供一个简单的包装(wrapper)。

gpstest.c中要与GPS的JNI模块android_location_GpsLocationProvider.cpp (frameworks\base\core\jni)关联,要调用其中的sGpsCallbacks全局量、location_callback函数等等,截图快照如下。

(2)程序BUG修改

a.

//gps_qemu.c

gps_state_init()中:if(state->fd < 0) { state->init = 0; }

// 补充蓝色句子:恢复gps初始状态,可在android系统启动进入“设置”界面触发gps功能。

(3)硬件模块确认

可用示波器抓出ublox芯片波形,确认gps芯片工作正常。

(4)串口无响应,内核修改

Modem抢占串口资源,可在内核配置菜单中剔除它,释放系统资源给串口/dev/ttyS0 。解决过程如下:

~1~.查找原因

root@Ubuntu>; grep "GPIOG1_UART0_MMC1WPT_NAME" ./ -R

./arch/arm/mach-rockchip/rk28_devices.c: rockchip_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT);

./arch/arm/mach-rockchip/rk28_devices.c: rockchip_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT);

./arch/arm/mach-rockchip/iomux.c:MUX_CFG(GPIOG1_UART0_MMC1WPT_NAME, A, 14, 2, 0, DEFAULT) /* 00 : gpio_g1 01 : uart0_sout 10 : sdmmc1_write_prt */

./include/asm-arm/arch/iomux.h:#define GPIOG1_UART0_MMC1WPT_NAME "gpiog1_uart0_mmc1wpt"

./include/asm-arm/arch-rockchip/iomux.h:#define GPIOG1_UART0_MMC1WPT_NAME "gpiog1_uart0_mmc1wpt"

./include/asm/arch/iomux.h:#define GPIOG1_UART0_MMC1WPT_NAME "gpiog1_uart0_mmc1wpt"

./include/asm/arch-rockchip/iomux.h:#define GPIOG1_UART0_MMC1WPT_NAME "gpiog1_uart0_mmc1wpt"

./drivers/misc/rk281x_modem/rk28_modem.h:#define G3_RESET_IOMUX_NAME GPIOG1_UART0_MMC1WPT_NAME

~2.~内核修改

make menuconfig

启动内核菜单配置环境,屏蔽modem设备,释放资源给串口0即ttyS0.

~3.~内核替换

重新编译内核 ./sh_new 出现下列错误,在power.c中修改如下.

T:\release_fae_version\kernel25_A7_281x\drivers\android\power.c

///#define ENABLE_MODEM_SUSPEND //屏蔽了这行 //此宏开关原为打开

drivers/built-in.o: In function `android_power_suspend':

/home/chenlx/release_fae_version/kernel25_A7_281x/drivers/android/power.c:941: undefined reference to `turn_on_modem'

/home/chenlx/release_fae_version/kernel25_A7_281x/drivers/android/power.c:889: undefined reference to `modem_is_turn_on'

/home/chenlx/release_fae_version/kernel25_A7_281x/drivers/android/power.c:892: undefined reference to `turn_off_modem'

(5)定位无效,天线调整

最好拉出窗外,如果天线够长。

(6)触摸屏校正

第一次系统启动后,进入桌面前,需作触摸屏校正: 点击屏幕四个角及屏中心五个点校正.

触屏校正后,进入系统桌面.

//-------

触摸屏与LCD显示屏是两个不同的物理器件。LCD处理的像素,例如我们通常所说的分辨率是600x800,实际就是指每行的宽度是600个像素,高度是800个像素,而触摸屏处理的数据是点的物理坐标,该坐标是通过触摸屏控制器采集到的。两者之间需要一定的转换。

其次, 在安装触摸屏时,不可避免的存在着一定的误差,如旋转,平移的,这同样需要校正解决。

再次,电阻式触摸屏的材料本身有差异而且随着时间的推移,其参数也会有所变化,因此需要经常性的校正(电容式触摸屏只需要一次校正即可,这是由两者不同的材料原理造成的 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: