搜星流程(1)-[Qualcomm][BSP-GPS]
之前讲了 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
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
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 }
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
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]相关推荐
- 亚马逊产品雷区_进入数字联系追踪的雷区
亚马逊产品雷区 People across America and the world remain under strong advisories or outright orders to she ...
- IoT设备 AGPS 网络辅助定位服务
由于IoT 物联网设备分布在全球各地,按地域做设备管理,固件升级,配置参数更新等需求越来越多,设备位置服务逐渐成为了各大IoT云平台必不可少的能力. AGPS定位(Assisted GPS网络辅助定位 ...
- gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评
1导航平板信号性能横评 十一长假转眼即逝,不少朋友美好的旅游愿望都被淹没在了人山人海和高速大堵车中,让人甚至郁闷.不过现在丰富的电子产品还是让我们的出行路途方便和丰富了很多,比如指引我们到旅游景点目的 ...
- c# point偏移_GMap.NET开发技巧(四)-GPS百度地图坐标偏移及地图加偏和逆向纠偏解决方法和代码...
很多国内开发者使用GMap.NET开发地图应用程序,非常方便,可是在实际应用中傻眼了,因为GPS坐标的位置在谷歌和百度地图上出现了严重的便宜,这个是要了命的,地图应用就是要给别人一个精确的Locati ...
- 程鑫峰:1.23日央行推行负利率政策,伦敦金后市行情解析
程鑫峰:1.23日央行推行负利率政策,伦敦金后市行情解析 QQ截图20180123153028.png 尽管美国政府关门闹剧刚刚结束,但交易员.投资者和策略师对于美元的前景依然不太乐观.美国货 ...
- 晶圆代工28nm制程市场动向
为什么80%的码农都做不了架构师?>>> 2015-08-21 拓墣 集邦DRAMeXchange 虽然先进制程的代工市场正迈入16/14nm,但目前仍以28nm制程需求量最大 ...
- 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析
程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析 古语有云物极必反.否极泰来是有道理的,用来形容最近黄金和美元的行情再符合不过,同时也在某种意义上迎合了市场风险偏好者释放一部分风险的要求 ...
- 程鑫峰:3.1余威未散鲍威尔再度归来,伦敦金、长江金业行情分析
程鑫峰:3.1余威未散鲍威尔再度归来,伦敦金.长江金业行情分析 各位投资的朋友,大家好!对于近两天的行情相信大家是有目共睹的,鲍威尔讲话犹如一颗深水炸.弹,重挫了黄金,而今晚鲍威尔将会再度发言 ...
- 彻底解决Android系统A-GPS搜不到卫星的问题!亲测!
问题类型! 1.手机搜不到卫星! 2.下载相关搜星软件也搜不到卫星,或者偶尔能搜到! 3.修改过gps.conf这个文件也搜不到卫星,或者偶尔能搜到! 相信你安照以下教程,保证你的手机搜星快!(前提是 ...
- GPS的一些浅显知识兼介绍一下GPS测试仪
很多人其实对GPS一知半解,我在这里尝试使用一些容易理解的语言说一下有关GPS的知识,捎带着介绍一下GPS测试仪这个软件的几个界面.有说的不妥的地方,还请指正. GPS是什么?简单的说,就是一个帮助你 ...
最新文章
- 新疆那些大学在计算机专业好,新疆哪些二本大学的计算机科学与技术专业最好?...
- 从HTML5移动应用现状谈发展趋势
- IPFS: NAT traversal(NAT穿越)
- PHP多进程之pcntl扩展的使用详解
- ES6学习笔记(五):轻松了解ES6的内置扩展对象
- 基于java的qq屏幕截图工具的设计与实现_几款鲜为人知的实用工具,你都尝试过吗?...
- mysql 面试题笔记_MYSQL面试题(摘抄/个人笔记)
- 4.nslookup
- caxa自动保存的文件在哪里_CAXA2011突然退出如何找回未保存文件,新建菜单里的文档恢复没有存档。...
- 基于matlab的中值滤波算法浅析
- iPhone5主摄像头图像传感器来自SONY
- 货币供应量(年底余额)的意义,如何获取
- 冷却塔为什么设计成双曲线型?
- 【西电—英美国家概况(英美概况/英美文化)2023第一学期】第九章参考课后答案
- ISO26262:功能安全解决了什么问题?
- LVS负载均衡群集合集
- 苹果电脑(mac)的快捷键大全
- html 5 时代来了 视频播放还用falsh 还要找播放器 你out 了
- Base 64 编码
- python 无脸男
热门文章
- java 实验报告模板_Java实验报告模板.doc.doc
- mysql slave 线程 简书_MySQL主从复制(Master-Slave)实践
- axure删除的页面怎么恢复_Axure如何应对意外关闭
- 029_jdbc-mysql二进制数据
- mysql json 中日期_mysql 转换json 时间问题
- php动态网页转换成html,怎么把动态的php文件转换成静态的html文件,html文件是php文件…...
- 性能分析工具 Android TraceView
- RHCSA7-NOTE(红帽管理员-题库详细笔记)
- 互联网项目开始时需要去谈的产品需求分析:
- 物理主机安装linux的方法