Android的電話功能介紹

來源:互聯網
上載者:User

第一部分 電話功能概述
     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結構體註冊到這個庫之中,在恰當的時候調用相應的函數。在執行的過程中,這個庫處理了一些將請求轉換成字串的功能。

Android相關內容:

  • Android怎麼實現EditText(文本地區)的多行進行垂直對齊
  • android如何在螢幕中把視圖都向靠右對齊?
  • android中如何讓按鈕排在一行顯示
  • Android如何添加一個自訂的按鈕狀態
  • Android下實現簡訊的收發
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.