Android GPS中间层驱动开发调试

~.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个像素,而触摸屏处理的数据是点的物理坐标,该坐标是通过触摸屏控制器采集到的。两者之间需要一定的转换。
    其次, 在安装触摸屏时,不可避免的存在着一定的误差,如旋转,平移的,这同样需要校正解决。
    再次,电阻式触摸屏的材料本身有差异而且随着时间的推移,其参数也会有所变化,因此需要经常性的校正(电容式触摸屏只需要一次校正即可,这是由两者不同的材料原理造成的 。

你可能感兴趣的:(手持端软件开发)