Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108987
  • 博文数量: 13
  • 博客积分: 489
  • 博客等级: 一等列兵
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-12 10:06
文章分类

全部博文(13)

文章存档

2011年(13)

分类: LINUX

2011-02-17 09:56:41

TI平台使用SIRF GPS
2.Android HAL的实现
(1)制作libgps.so库
google提供的方法
 
Android.mk:
LOCAL_SRC_FILES:= main.c    //指定库的源码
LOCAL_MODULE := libgps    //指定库的名称
include $(BUILD_SHARED_LIBRARY)    //指定编译成.so库
 
(2)修改BoardConfig.mk
添加BOARD_GPS_LIBRARIES := libgps
 
由于hardware/libhardware_legacy/gps/Android.mk中指定LOCAL_SHARED_LIBRARIES
ifneq ($(BOARD_GPS_LIBRARIES),)
  LOCAL_CFLAGS           += -DHAVE_GPS_HARDWARE
  LOCAL_SHARED_LIBRARIES += $(BOARD_GPS_LIBRARIES)
endif
 
(3)修改hardware/libhardware_legacy/gps/gps.cpp
  1. static void
  2. gps_find_hardware( void )
  3. {
  4.     sGpsInterface = gps_get_hardware_interface();
  5.     if (!sGpsInterface)
  6.         LOGD("no GPS hardware on this device\n");
  7. }
gps_get_hardware_interface()在libgps.so源码中实现
 
(4)实现libgps.so源码main.c
(可参考hardware/libhardware_legacy/gps/gps_qemu.c)
 
  1. static const GpsInterface sirfGpsInterface = {
  2.     sirf_gps_init,
  3.     sirf_gps_start,
  4.     sirf_gps_stop,
  5.     sirf_gps_cleanup,
  6.     sirf_gps_inject_time,
  7.     sirf_gps_inject_location,
  8.     sirf_gps_delete_aiding_data,
  9.     sirf_gps_set_position_mode,
  10.     sirf_gps_get_extension,
  11. };
  12. const GpsInterface* gps_get_hardware_interface()
  13. {
  14.     return &sirfGpsInterface;
  15. }

下面将介绍下需要修改的函数,其他函数都可以仿照gps_qemu.c

sirf_gps_start()函数中添加SiRF_Start();

sirf_gps_stop()函数中添加SiRF_Stop();

sirf_gps_init()函数中调用gps_state_init,作用是创建socket通信和gps_state_thread线程;

gps_state_init()函数中需要根据具体的GPS模块实现state->fd = channel_open();

gps_state_thread()函数中去掉两句nmea_reader_set_callback调用;

nmea_reader_parse()函数添加callbacks.nmea_cb和callbacks.location_cb:

  1. if (r->pos < 9) {
  2.         D("Too short. discarded.");
  3.         return;
  4. }
  5. {
  6.     struct timeval tv;
  7.     gettimeofday(&tv, NULL);
  8.      _gps_state->callbacks.nmea_cb(tv.tv_sec*1000+tv.tv_usec/1000, r->in, r->pos);
  9. }
  10. nmea_tokenizer_init(tzer, r->in, r->in + r->pos);
  1. if (_gps_state->callbacks.location_cb) {
  2.      _gps_state->callbacks.location_cb( &r->fix );
  3.      r->fix.flags = 0;
  4. }
  5. else {
  6.      D("no callback, keeping data until needed !");
  7. }

(5)NMEA数据上报

Android本身的GPS读取NMEA信息机制是调用read函数读取串口信息并解析上报,但SIRF提供了SiRF_Output函数用于底层与应用层的数据上报,GPS工作后会有线程不停调用SiRF_Output,因此只要在SiRF_Output函数中添加:

  1. NmeaReader reader[1];
  2. nmea_reader_init( reader );

  3. for (nn = 0; nn < sizeof(buf); nn++)
  4.      nmea_reader_addc( reader, buf[nn] );

现在GPS可以上报GGA、GSA、RMC等数据(GSA数据需添加nmea_reader_parse函数中关于GSA数据解析)

 

后面还会继续研究GSA等数据的解析上报...期待o ^-^

 

 

阅读(18548) | 评论(24) | 转发(1) |
给主人留下些什么吧!~~

lassur2011-03-28 09:50:03

尝试在andriod源码线程中取消read,直接赋值buff[]="$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18";,然后nmea_reader_addc,上层apk程序依然无法获取数据,我想问一下,什么样的格式在nmea_reader_addc之后,state->callbacks.location_cb上去,才能被上层apk程序解析?
另外,我可以open,但无法read到数据,测试程序又可以通过串口读取到以上赋值格式的数据,不知道为什么,希望得到你的协助!

Z-yalinux2011-03-25 13:53:18

lassur: 博主你好,我做的和sniper167相似,cat /dev/tty0 通过串口能读到nmea数据,但在Android中还没调通,我直接在glgps.c中参照gps_qemu该写,操作我需要的端口,可.....
直接该名字当然不行,qemu_channel_open()是模拟器模拟串口的打开,和真实打开串口方式不一样,你要看你的串口驱动中open函数提供给上层的系统调用

lassur2011-03-24 14:10:55

博主你好,我做的和sniper167相似,cat /dev/tty0 通过串口能读到nmea数据,但在Android中还没调通,我直接在glgps.c中参照gps_qemu该写,操作我需要的端口,可能是我的C基础不够好,改写后open/read 的时候老出问题。问一下在qemu.c中:qemu_channel_open()部分,我自己该如何实现?不太明白
总不至于把这个函数改个名字拿过来就用吧

tchely2011-03-23 09:16:03

Z-yalinux: 你是不是使用原始版本的Android?原始版本是所以没有的,教你一个简单的方法,hardware/libhardware_legacy/gps目录下有gps_qemu.c,你参照它写自己的.c文件,可
是的,呵呵,谢谢楼主

sniper1672011-03-22 11:47:05

我的GPS已经可以收星了,但我发现,start和stop两个函数,没有发现被调用过,开GPS调用的是init,关GPS调用的是cleanup。下午再看看是否休眠唤醒调用到了start和stop两个函数。