之前讲了 loc eng 是如何把 SV status(SV是Satellite Value,可以看做是卫星信息的简称)信息传递给 Android framework层,都是一系列 callback 而已。

本文要讲的是 SV status 如何从 Modem层(由于 QMI层 是高通的 Ap 跟 Modem 的通信机制,不需要我们来处理,所以我这里把 QMI+Modem 统称为 Modem层,可能不准确,但是大家理解了就行)传递到 loc eng层。

loc eng层 的 SV status 是通过 sv_status_cb函数 来扔给 Android framework层,我们需要看下loc eng层的sv_status_cb是在哪里被调用的,具体如下:

hardware/qcom/gps/loc_api/libloc_api_50001/loc_eng.cpp

// 我们需要记住的是:loc eng层 是通过一个 proc()方法 把数据传递到上层的

840 void LocEngReportSv::proc() const {

841     LocEngAdapter* adapter = (LocEngAdapter*)mAdapter;
 842     loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner()     ;
 843 
 844     if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION)
 845     {
 846         if (locEng->sv_status_cb != NULL) {
 847             locEng->sv_status_cb((GpsSvStatus*)&(mSvStatus),
 848                                  (void*)mSvExt);
 849         }
 850 
 851         if (locEng->generateNmea)
 852         {
 853             loc_eng_nmea_generate_sv(locEng, mSvStatus, mLocationExtended);
 854         }
 855     }
 856 }

由于 loc eng层 到 Modem层 是属于消息触发的,也就是说正常的流程是:Modem层 传上来一个消息,经过一系列处理传递到 loc eng层,loc eng层 传递给 Android framework层,然后交给 App 来处理。所以本文的讲解flow跟上一篇可能有一些不一样,需要从底层(loc_api层)往上层讲(loc eng层)。

在讲解flow之前,有一个架构性的东西需要讲解一下。高通平台的GPS核心部分都在 Modem里面,这里面实现了GPS相关的协议,类似 Wi-Fi的 supplicant + driver 部分。我们把这个部分(Modem 中的 GPS)看做是GPS Service;另外一部分在 Ap 里面,我们把这部分看做是GPS Client。Client 主要是通过 QMI 的通信方式接收 Service 发过来的信息,当然 Client也可以通过 QMI 发送信息给 Service,这个就是GPS的最大的框架。

QMI 暂时不是本文需要关注的,所以这里从 QMI 之上开始讲起,QMI 之上有一个叫 loc_api 的层,具体作用是通过 QMI 读取 Service 发送过来的信息,当然也可以通过 QMI 发送信息给 Service,有一个专门处理 Service 发送过来信息的 callback 需要重点关注,在看 callback 之前有一些数据结构需要先给出来,不然后续代码理解起来可能会比较麻烦。

locClientCallbackDataType的各种callback定义:

vendor/qcom/opensource/location/loc_api/loc_api_v02/loc_api_v02_client.c

629 typedef struct locClientCbDataStructT locClientCallbackDataType;
 630 
 631 struct locClientCbDataStructT
 632 {
 633  // client cookie
 634   void *pClientCookie;
 635   //QCCI handle for this control point
 636   qmi_client_type userHandle;
 637 
 638   // callbacks registered by the clients
 639   locClientEventIndCbType eventCallback;
 640   locClientRespIndCbType respCallback;
 641   locClientErrorCbType   errorCallback;
 642 
 643   // the event mask the client has registered for
 644   locClientEventMaskType eventRegMask;
 645 
 646   //pointer to itself for checking consistency data
 647    locClientCallbackDataType *pMe;
 648 };

vendor/qcom/opensource/location/loc_api/loc_api_v02/loc_api_v02_client.c

 865 /** locClientIndCb
 866  *  @brief handles the indications sent from the service, if a
 867  *         response indication was received then the it is sent
 868  *         to the response callback. If a event indication was
 869  *         received then it is sent to the event callback
 870  *  @param [in] user handle
 871  *  @param [in] msg_id
 872  *  @param [in] ind_buf
 873  *  @param [in] ind_buf_len
 874  *  @param [in] ind_cb_data */
 875 
 876 static void locClientIndCb
 877 (
 878  qmi_client_type                user_handle,
 879  unsigned int                   msg_id,
 880  void                           *ind_buf,
 881  unsigned int                   ind_buf_len,
 882  void                           *ind_cb_data
 883 )
 884 {
 885   locClientIndEnumT indType;
 886   size_t indSize = 0;
 887   qmi_client_error_type rc ;
 888   locClientCallbackDataType* pCallbackData =
 889       (locClientCallbackDataType *)ind_cb_data;
 890 
 891   LOC_LOGV("%s:%d]: Indication: msg_id=%d buf_len=%d pCallbackData = %p\n",
 892                 __func__, __LINE__, (uint32_t)msg_id, ind_buf_len,
 893                 pCallbackData);
 894 
 895   // check callback data
 896   if(NULL == pCallbackData ||(pCallbackData != pCallbackData->pMe))
 897   {
 898     LOC_LOGE("%s:%d]: invalid callback data", __func__, __LINE__);
 899     return;
 900   }
 901 
 902   // check user handle
 903   if(memcmp(&pCallbackData->userHandle, &user_handle, sizeof(user_handle)))
 904   {
 905     LOC_LOGE("%s:%d]: invalid user_handle got %p expected %p\n",
 906         __func__, __LINE__,
 907         user_handle, pCallbackData->userHandle);
 908     return;
 909   }
 910   // Get the indication size and type ( eventInd or respInd)
 911   if( true == locClientGetSizeAndTypeByIndId(msg_id, &indSize, &indType))
 912   {
 913     void *indBuffer = NULL;
 914 
 915     // decode the indication
 916     indBuffer = malloc(indSize);
 917 
 918     if(NULL == indBuffer)
 919     {
 920       LOC_LOGE("%s:%d]: memory allocation failed\n", __func__, __LINE__);
 921       return;
 922     }
 923 
 924     rc = QMI_NO_ERR;
 925 
 926     if (ind_buf_len > 0)
 927     {
 928         // decode the indication
 929         rc = qmi_client_message_decode(
 930             user_handle,
 931             QMI_IDL_INDICATION,
 932             msg_id,
 933             ind_buf,
 934             ind_buf_len,
 935             indBuffer,
 936             indSize);
 937     }
 938 
 939     if( rc == QMI_NO_ERR )
 940     {
 941       if(eventIndType == indType)
 942       {
 943         locClientEventIndUnionType eventIndUnion;
 944 
 945         /* copy the eventCallback function pointer from the callback
 946          * data to local variable. This is to protect against the race
 947          * condition between open/close and indication callback.
 948          */
 949         locClientEventIndCbType localEventCallback =
 950             pCallbackData->eventCallback;
 951 
 952         // dummy event
 953         eventIndUnion.pPositionReportEvent =
 954             (qmiLocEventPositionReportIndMsgT_v02 *)indBuffer;
 955 
 956         /* call the event callback
 957          * To avoid calling the eventCallback after locClientClose
 958          * is called, check pCallbackData->eventCallback again here
 959          */
 960         if((NULL != localEventCallback) &&
 961            (NULL != pCallbackData->eventCallback))
 962         {
 963           localEventCallback(
 964               (locClientHandleType)pCallbackData,
 965               msg_id,
 966               eventIndUnion,
 967               pCallbackData->pClientCookie);
 968         }
 969       }
 970       else if(respIndType == indType)
 971       {
 972         locClientRespIndUnionType respIndUnion;
 973 
 974         /* copy the respCallback function pointer from the callback
 975          * data to local variable. This is to protect against the race
 976          * condition between open/close and indication callback.
 977          */
 978         locClientRespIndCbType localRespCallback =
 979             pCallbackData->respCallback;
 980 
 981         // dummy to suppress compiler warnings
 982         respIndUnion.pDeleteAssistDataInd =
 983             (qmiLocDeleteAssistDataIndMsgT_v02 *)indBuffer;
 984 
 985         /* call the response callback
 986          * To avoid calling the respCallback after locClientClose
 987          * is called, check pCallbackData->respCallback again here
 988          */
 989         if((NULL != localRespCallback) &&
 990            (NULL != pCallbackData->respCallback))
 991         {
 992           localRespCallback(
 993               (locClientHandleType)pCallbackData,
 994               msg_id,
 995               respIndUnion,
 996               pCallbackData->pClientCookie);
 997         }
 998       }
 999     }
1000     else
1001     {
1002       LOC_LOGE("%s:%d]: Error decoding indication %d\n",
1003                     __func__, __LINE__, rc);
1004     }
1005     if(indBuffer)
1006     {
1007       free (indBuffer);
1008     }
1009   }
1010   else // Id not found
1011   {
1012     LOC_LOGE("%s:%d]: Error indication not found %d\n",
1013                   __func__, __LINE__,(uint32_t)msg_id);
1014   }
1015   return;
1016 }
1017 

搜星流程(1)-[Qualcomm][BSP-GPS]相关推荐

  1. 亚马逊产品雷区_进入数字联系追踪的雷区

    亚马逊产品雷区 People across America and the world remain under strong advisories or outright orders to she ...

  2. IoT设备 AGPS 网络辅助定位服务

    由于IoT 物联网设备分布在全球各地,按地域做设备管理,固件升级,配置参数更新等需求越来越多,设备位置服务逐渐成为了各大IoT云平台必不可少的能力. AGPS定位(Assisted GPS网络辅助定位 ...

  3. gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评

    1导航平板信号性能横评 十一长假转眼即逝,不少朋友美好的旅游愿望都被淹没在了人山人海和高速大堵车中,让人甚至郁闷.不过现在丰富的电子产品还是让我们的出行路途方便和丰富了很多,比如指引我们到旅游景点目的 ...

  4. c# point偏移_GMap.NET开发技巧(四)-GPS百度地图坐标偏移及地图加偏和逆向纠偏解决方法和代码...

    很多国内开发者使用GMap.NET开发地图应用程序,非常方便,可是在实际应用中傻眼了,因为GPS坐标的位置在谷歌和百度地图上出现了严重的便宜,这个是要了命的,地图应用就是要给别人一个精确的Locati ...

  5. 程鑫峰:1.23日央行推行负利率政策,伦敦金后市行情解析

      程鑫峰:1.23日央行推行负利率政策,伦敦金后市行情解析 QQ截图20180123153028.png   尽管美国政府关门闹剧刚刚结束,但交易员.投资者和策略师对于美元的前景依然不太乐观.美国货 ...

  6. 晶圆代工28nm制程市场动向

    为什么80%的码农都做不了架构师?>>>    2015-08-21 拓墣 集邦DRAMeXchange 虽然先进制程的代工市场正迈入16/14nm,但目前仍以28nm制程需求量最大 ...

  7. 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析

      程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析   古语有云物极必反.否极泰来是有道理的,用来形容最近黄金和美元的行情再符合不过,同时也在某种意义上迎合了市场风险偏好者释放一部分风险的要求 ...

  8. 程鑫峰:3.1余威未散鲍威尔再度归来,伦敦金、长江金业行情分析

      程鑫峰:3.1余威未散鲍威尔再度归来,伦敦金.长江金业行情分析   各位投资的朋友,大家好!对于近两天的行情相信大家是有目共睹的,鲍威尔讲话犹如一颗深水炸.弹,重挫了黄金,而今晚鲍威尔将会再度发言 ...

  9. 彻底解决Android系统A-GPS搜不到卫星的问题!亲测!

    问题类型! 1.手机搜不到卫星! 2.下载相关搜星软件也搜不到卫星,或者偶尔能搜到! 3.修改过gps.conf这个文件也搜不到卫星,或者偶尔能搜到! 相信你安照以下教程,保证你的手机搜星快!(前提是 ...

  10. GPS的一些浅显知识兼介绍一下GPS测试仪

    很多人其实对GPS一知半解,我在这里尝试使用一些容易理解的语言说一下有关GPS的知识,捎带着介绍一下GPS测试仪这个软件的几个界面.有说的不妥的地方,还请指正. GPS是什么?简单的说,就是一个帮助你 ...

最新文章

  1. 新疆那些大学在计算机专业好,新疆哪些二本大学的计算机科学与技术专业最好?...
  2. 从HTML5移动应用现状谈发展趋势
  3. IPFS: NAT traversal(NAT穿越)
  4. PHP多进程之pcntl扩展的使用详解
  5. ES6学习笔记(五):轻松了解ES6的内置扩展对象
  6. 基于java的qq屏幕截图工具的设计与实现_几款鲜为人知的实用工具,你都尝试过吗?...
  7. mysql 面试题笔记_MYSQL面试题(摘抄/个人笔记)
  8. 4.nslookup
  9. caxa自动保存的文件在哪里_CAXA2011突然退出如何找回未保存文件,新建菜单里的文档恢复没有存档。...
  10. 基于matlab的中值滤波算法浅析
  11. iPhone5主摄像头图像传感器来自SONY
  12. 货币供应量(年底余额)的意义,如何获取
  13. 冷却塔为什么设计成双曲线型?
  14. 【西电—英美国家概况(英美概况/英美文化)2023第一学期】第九章参考课后答案
  15. ISO26262:功能安全解决了什么问题?
  16. LVS负载均衡群集合集
  17. 苹果电脑(mac)的快捷键大全
  18. html 5 时代来了 视频播放还用falsh 还要找播放器 你out 了
  19. Base 64 编码
  20. python 无脸男

热门文章

  1. java 实验报告模板_Java实验报告模板.doc.doc
  2. mysql slave 线程 简书_MySQL主从复制(Master-Slave)实践
  3. axure删除的页面怎么恢复_Axure如何应对意外关闭
  4. 029_jdbc-mysql二进制数据
  5. mysql json 中日期_mysql 转换json 时间问题
  6. php动态网页转换成html,怎么把动态的php文件转换成静态的html文件,html文件是php文件…...
  7. 性能分析工具 Android TraceView
  8. RHCSA7-NOTE(红帽管理员-题库详细笔记)
  9. 互联网项目开始时需要去谈的产品需求分析:
  10. 物理主机安装linux的方法