歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

高通MSM8255 GPS 調試分析

整理一下GPS的流程,也算給自己一個交代。

1.硬件抽象層:

高通MSM的硬件層代碼在:hardware/qcom/gps/loc_api下,高通的GPS集成在baseband側,與Modem部分一樣,同樣是基於share Memory上高通自有的RPC協議實現。所以高通的硬件層分為兩部分,一部分實現的是:硬件抽象層的接口實現,另一部分實現的是基於RPC協議封裝的具體控制和數據操作,該部分主要是利用高通的RPC代碼生成器生成。兩個部分是通過一個glue層粘合在一起的。高通MSM的硬件抽象層在其子目錄 libloc_api中,主要在loc_eng.cpp中。loc_eng_ioctl.cpp用於承載到glue層的具體控制和回調。而剩余其它幾個文件主要是輔助GPS定位的XTRA和Net Initiated的實現。

GpsInterface接口實現如下:

 高通的GPS硬件抽象層包含GPS數據的“獲取”和“解析”,它們都通過RPC上報。然後再調用loc_eng_init注冊的回調,向上層上報。

上報部分的實現是基於loc_eng_process_deferred_action函數的線程中,該線程實現一個等待循環,當GPS有數據解析上報時,RPC部分會回調loc_eng_init初始化時的loc_event_cb,該回調函數會激活線程中的等待循環。線程通過loc_eng_process_loc_event函數處理獲取數據,並調用loc_eng_report_xxx(xxx代表position、衛星狀態sv等),將數據通過上層注冊的回調函數進行上報。這部分代碼如下:

高通GPS還實現了XTRA與AGPS,其中AGPS的接口在sLocEngAGpsInterface中實現,內容如下:

loc_eng_agps_set_server函數完成對server的配置。硬件抽象層根據loc_eng_set_position_mode中傳入的配置,決定是否啟用AGPS。其中啟動函數為set_agps_server,該函數最終通過RPC寫入GPS。

下面是GPS從上層調用到下層,再把數據上報給上層的流程圖:

Copyright © Linux教程網 All Rights Reserved