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

Android GPS中间层驱动开发调试相关推荐

  1. Android底层HAL驱动开发学习笔记

    2017.3.27 1.确定任务:加快摄像头的信息获取速率:缩减驱动程序.减小帧的大小,缩减一个像素点的比特流(6/8/10bit) 2.重点了解函数:camerabuffer *buffer=mPr ...

  2. WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建

    为什么80%的码农都做不了架构师?>>>    一.准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SD ...

  3. android 不通过数据线打印日志_人人都可写代码-Android零基础编程-开发调试、APK编译04...

    欢迎来到人人都可写代码,大家好,我是杨晓华,今天我们的课程内容是,讲解Android开发中如何调试代码程序,开发完后如何打包成可发布的apk文件. 开发调试 在开发中,难免我们会遇到BUG,快速定位问 ...

  4. Linux驱动开发(外传)---驱动开发调试方法

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  5. ADI最新基带处理芯片 ADRV9002特性及 FPGA 驱动开发调试记录分享

    ADI的产品迭代还是非常迅速的,继ADRV9009之后,又相继退出ADRV9026,ADRV9040,射频通道数量都是呈指数倍增加,今天要介绍一款低功耗产品ADRV9002, 数据接口从高速串行口又回 ...

  6. 多种模块拔号上网驱动开发调试

    拔号上网 前后调试了几种上网卡模块,现在把几种模块调试记录下来,并做一下备份. 操作系统:Linux (none) 2.6.30 #112 Thu Sep 7 16:01:33 CST 2017 ar ...

  7. MS5182N(AD7682)驱动开发调试总结(一)

    简介 MS5182N芯片是瑞盟科技的一款4通道的16位SAR ADC芯片,其对标的是ADI的AD7682芯片,或者说基本上两者功能一样,可以作为国产替代.另外其MS5189(8通道的)对标的则是AD7 ...

  8. 【Android 逆向】Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )

    文章目录 一.调试进程中寄存器的作用 二.通过 EIP 寄存器控制程序运行 三.EIP 寄存器的存档与恢复 一.调试进程中寄存器的作用 内存是一个线性结构 , 将动态库加载到内存中后 , 每个动态库文 ...

  9. Android驱动开发之陀螺仪(三)

    Android驱动开发之陀螺仪(二) 五.安卓hal层驱动数据读取 使能陀螺仪后,由于我配置的是原始数据准备中断,所以陀螺仪数据一旦准备好,就会发送中断信号,之前在第二章已经分析过中断的注册流程,这里 ...

最新文章

  1. ORM单表查询,跨表查询,分组查询
  2. 笔试算法题及解答(Python)
  3. 遍历可执行文件所在目录下的指定类型的文件
  4. CSS 元素的绝对定位 position: absolute 和 position: fixed
  5. STM32 SDIO详解
  6. Javascript:关闭当前界面
  7. python+selenium常见坑
  8. java 硬盘序列号_如何使用Java获取硬盘序列号?
  9. 思维破局:认知水平低,是一个人最致命的短板
  10. 程序员计算机常用快捷键,19个程序员都爱不释手的键盘快捷键,快来看看你知道几个又用过几个吧!...
  11. 《工程电磁场》学习笔记2-恒定电场
  12. (原创文章)羊毛党何去何从
  13. table标签的介绍
  14. android权限编辑xml大全(中英文对照)
  15. Cocoapods 黑魔法
  16. 春节大礼包!——海多PS游戏下载及PS模拟器EPSXE VGS设置指南
  17. 2021年 PAT(乙级)
  18. 听说这玩意可以安全交换密钥 —— Diffie-Hellman 算法
  19. python check module_Python 的 module 机制(重要)
  20. 蓝桥31天|今天4道题Day11|C++

热门文章

  1. 四川一度智信:如何做好店铺数据运营?
  2. 目标分割(六)RefineNet讲解
  3. 基于ROCKCHIP的ubuntu-base根文件系统构建
  4. java 数字转换开发票大写格式_Java转化数字为大写人民币
  5. Line 14: Char 22: runtime error: signed integer overflow: 1000000000 * 9 cannot be represented
  6. pytorch 指定卡1_如何为TensorFlow和PyTorch自动选择空闲GPU,解决抢卡争端
  7. 微信内测新功能(深度清理),瞬间释放几个G内存!
  8. SpringBoot物流管理项目,拿去学习吧(源码)
  9. 百度大数据+零售发挥引擎优势 ------BDL ,大数据+亚当科茨领导的人工智能实验室和由张潼领导的大数据实验室
  10. 【排序算法(三)】直接插入排序及其改进