第一部分 電話功能概述 Android的Radio Interface Layer (RIL)提供了電話服務和的radio硬件之間的抽象層。 Radio Interface Layer RIL(Radio Interface Layer)負責數據的可靠傳輸、AT命令的發送以及response的解析。應用處理器經過AT命令集與帶GPRS功能的無線通信模塊通訊。 AT command由Hayes公司發明,是一個調制解調器製造商採用的一個調制解調器命令語言,每條命令以字母"AT"開頭。 JAVA Framework 代碼的路徑爲: frameworks/base/telephony/java/android/telephony android.telephony以及android.telephony.gsm Core native: 在hardware/ril目錄中,提供了對RIL支持的本地代碼,包括4個文件夾: hardware/ril/include hardware/ril/libril hardware/ril/reference-ril hardware/ril/rild kernel Driver 在Linux內核的驅動中,提供了相關的驅動程序的支持,能夠創建在UART或者SDIO,USB等高速的串行總線上。 第二部分 電話功能各個部分 hardware/ril/include/telephony/目錄中的ril.h文件是ril部分的基礎頭文件。 其中定義的結構體RIL_RadioFunctions以下所示: typedef struct { int version; RIL_RequestFunc onRequest; RIL_RadioStateRequest onStateRequest; RIL_Supports supports; RIL_Cancel onCancel; RIL_GetVersion getVersion; } RIL_RadioFunctions; RIL_RadioFunctions中包含了幾個函數指針的結構體,這其實是一個移植層的接口,下層的庫實現後,由rild守護進程獲得這些函數指針,執行對應的函數。 幾個函數指針的原型爲: typedef void (*RIL_RequestFunc) (int request, void *data, size_t datalen, RIL_Token t); typedef RIL_RadioState (*RIL_RadioStateRequest)(); typedef int (*RIL_Supports)(int requestCode); typedef void (*RIL_Cancel)(RIL_Token t); typedef const char * (*RIL_GetVersion) (void); 其中最爲重要的函數是onRequest(),它是一個請求執行的函數。 2.1 rild守護進程 rild 守護進程的文件包含在hardware/ril/rild目錄中,其中包含了rild.c和radiooptions.c兩個文件,這個目錄中的文件通過編譯後生成一個可執行程序,這個程序在系統的安裝路徑在: /system/bin/rild rild.c是這個守護進程的入口,它具備一個主函數的入口main,執行的過程是將請求轉換成AT命令的字符串,給下層的硬件執行。在運行過程當中,使用dlopen 打開路徑爲/system/lib/中名稱爲libreference-ril.so的動態庫,而後從中取出 RIL_Init符號來運行。 RIL_Init符號是一個函數指針,執行這個函數後,返回的是一個RIL_RadioFunctions類型的指針。獲得這個指針後,調用RIL_register()函數,將這個指針註冊到libril庫之中,而後進入循環。 事實上,這個守護進程提供了一個申請處理的框架,而具體的功能都是在libril.so和libreference-ril.so中完成的。 2.2 libreference-ril.so動態庫 libreference-ril.so動態庫的路徑是: hardware/ril/reference-ril 其中主要的文件是reference-ril.c和atchannel.c。這個庫必須實現的是一個名稱爲RIL_Init的函數,這個函數執行的結果是返回一個RIL_RadioFunctions結構體的指針,指針指向函數指針。 這個庫在執行的過程當中須要建立一個線程來執行實際的功能。在執行的過程當中,這個庫將打開一個/dev/ttySXXX的終端(終端的名字是從上層傳入的),而後利用這個終端控制硬件執行。 2.3 libril.so動態庫 libril.so庫的目錄是: hardware/ril/libril 其中主要的文件爲ril.cpp,這個庫主要須要實現的如下幾個接口爲: RIL_startEventLoop(void);void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);RIL_register (const RIL_RadioFunctions *callbacks);RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);void RIL_onUnsolicitedResponse(int unsolResponse, void *data, size_t datalen);RIL_requestTimedCallback (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime); 這些函數也是被rild守護進程調用的,不一樣的vendor能夠經過本身的方式實現這幾個接口,這樣能夠保證RIL能夠在不一樣系統的移植。其中RIL_register()函數把外部的RIL_RadioFunctions結構體註冊到這個庫之中,在恰當的時候調用相應的函數。在執行的過程當中,這個庫處理了一些將請求轉換成字符串的功能。 |