Android的RIL驅動模塊啟動流程_第1頁
Android的RIL驅動模塊啟動流程_第2頁
Android的RIL驅動模塊啟動流程_第3頁
Android的RIL驅動模塊啟動流程_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Android的RIL驅動模塊啟動流程Android 的 RIL 驅動模 塊,在 hardware/ril 目錄下,一共分 rild, libril.so 以及librefrence_ril.so三個部分,另有一 radiooptions可供自動或手動調試使用。 都依賴于include目錄中ril.h頭文件。目前cupcake分支上帶的是gsm的支持, 另有一 cdma分支,這里分析的是gsm驅動。GSM模塊,由于Modem的歷史原因,AP一直是通過基于串口的AT命令 與BB交互。包括到了目前的一些edge或3g模塊,或像omap這類ap,bp集成 的芯片,已經使用了 USB或其他等高速總線通

2、信,但大多仍然使用模擬串口機 制來使用AT命令。這里的RIL(Radio Interface Layer)層,主要也就是基于AT 命令的操作,如發命令,response解析等。(gprs等傳輸會用到的MUX協議等 在這里并沒有包含,也暫不作介紹。)以下是詳細分析,本文主要涉及基本架構和初始化的內容:首先介紹一下rild與libril.so以及librefrence_ril.so的關系:rild:僅實現一 main函數作為整個ril層的入口點,負責完成初始化。libril.so:與rild結合相當緊密,是其共享庫,編譯時就已經建立了這一關系。組成 部分為ril.cpp, ril_eventcpp

3、。libril.so駐留在rild這一 守護進程中,主要完成 同上層通信的工作,接受 ril請求并傳遞給librefrence_ril.so,同時把來自 librefrence_ril.so的反饋回傳給調用進程。librefrence_ril.so:rild通過手動的dlopen方式加載,結合稍微松散,這也是因為librefrence.so 主要負責跟Modem硬件通信的緣故。這樣做更方便替換或修改以 適配更多的 Modem種類。它轉換來自libril.so的請求為AT命令,同時監控Modem的反饋 信息,并傳遞回libril.so.在初始化時,rild通過符號RIL_Init獲取一組函數 指

4、針并以此與之建立聯系。radiooptions:radiooptiongs通過獲取啟動參數,利用socket與rild通信,可供調試時配 置Modem參數.接下來分析初始化流程,主入口是rild.c中的main函數,主要完成三個任 務:開啟libril.so中的event機制,在RIL_startEventLoop中,是最核心的由多 路I/O驅動的消息循環。初始化librefrence_ril.so,也就是跟硬件或模擬硬件modem通信的部分(后面統一稱硬件),通過RIL_Init函數完成。通過 RIL_Init 獲取一組函數指針 RIL_RadioFunctions,并通過 RIL_regi

5、ster 完成注冊,并打開接受上層命令的socket通道。首先看第一個任務,也就是 RIL_startEventLoop 函數。RIL_startEventLoop 在ril.cpp中實現,它的主要目的是通過pthread_create(&s_tid_dispatch, &at切 eventLoop, NULL)建立一個 dispatch線程,入口點在 eventLoop.而 eventLoop 中,會調ril_event.cpp中的ril_event_loop()函數,建立起消息(event)隊列機 制。我們來仔細看看這一消息隊列的機制,這些代碼都在ril_event.cpp中。 void

6、ril_event_init();void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb fUnc, void * param);void ril_event_add(struct ril_event * ev);void ril_timer_add(struct ril_event * ev, struct timeval * tv);void ril_event_del(struct ril_event * ev);void ril_event_loop();struct ril_event

7、struct ril_event *next;struct ril_event *prev;int fd;int index;bool persist;struct timeval timeout;ril_event_cb func;void *param;每個ril_event結構,與一個fd句柄綁定(可以是文件,socket,管道等), 并且帶一個func指針去執行指定的操作。具體流程是:ril_event_init完成后,通過ril_event_set來配置一新ril_event, 并通過ril_event_add加入隊列之中(實 際通常用rilEventAddWakeup來添加), a

8、dd會把隊列里所有ril_event的fd,放入一個fd集合readFds中。這樣 ril_event_loop能通過一個多路復用I/O的機制( select)來等待這些fd,如果 任何一個fd有數據寫入,則進入分析流程processTimeouts(), processReadReadies(&rfds, n),firePending()o 后丈會詳細分析這些流程。另外我們可以看到,在進入ril_event_loop之前,已經掛入了一 s_wakeupfd_event,通過pipe的機制實現的,這個event的目的是可以在一些 情況下,能內部喚醒ril_event_loop的多路復用阻塞,比

9、如一些帶timeout的命 令timeout到期的時候。至此第一個任務分析完畢,這樣便建立起了基于event隊列的消息循環,稍 后便可以接受上層發來的的請求了(上層請求的event對象建立,在第三個任務 中)。接下來看第二個任務,這個任務的入口是RIL_Init, RIL_Init首先通過參數 獲取硬件接口的設備文件或模擬硬件接口的socket.接下來便新開一個線程繼 續初始化,即mainLoopomainLoop的主要任務是建立起與硬件的通信,然后通過read方法阻塞等 待硬件的主動上報或響應。在注冊一些基礎回調(timeout, readerclose)后, mainLoop首先打開硬件設

10、備文件,建立起與硬件的通信,s_device_path和s_port 是前面獲取的設備路 徑參數,將其打開(兩者可以同時打開并擁有各自的 飽籍妙,這里也很容易添加雙卡雙待等支持)o接下來通過at_open函數建立 起這一設備文件上的reader等待循環,這也 是通過新建一個線程完成,ret = pthread_create(&s_tid_readei, &attr, readerLoop, &attr),入口點 readerLoop。AT命令都是以rn或nr的換行符來作為分隔符的,所以readerLoop是 line驅動的,除非出錯,超時等,否則會讀到一行完整的響應或主動上報,才會 返回。這個

11、循環跑起來以后,我們基本的AT響應機制 已經建立了起來。它的 具體分析,包括at_open中掛接的ATUnsolHandler我們都放到后面分析 response的連載文章里去。有了響應的機制(當然,能與硬件通信也已經可以發請求了),通過 RIL_requestTimedCallback (initializeCallback, NULL, &TIMEVAL_0),跑到 initializeCallback中,執行一些Modem的初始化命令,主要都是AT命令的方 式。發AT命令的流程,我們放到后面分析request的連載文章里。這里可以看 到,主要是一些參數配置,以及網絡狀態的檢查等。至此第二

12、個任務分析完畢, 硬件已經可以訪問了。最后是第三個任務。第三個任務是由RIL_Init的返回值開始的,這是一個 RIL_RadioFunctions 結構的指針。typedef struct int version; /* set to RIL_VERSION */ RIL_RequestFunc onRequest;RIL_RadioStateRequest onStateRequest;RIL_Supports supports;RIL_Cancel onCancel;RIL_GetVersion getVersion; RIL_RadioFunctions;其中最重要的是onRequest域,上層來的請求都由這個函數進行映射后轉換 成對應的AT命令發給硬件。rild通過RIL_register注冊這一指針。RIL_register中要完成的另夕一個任務,就是打開前面提到的跟上層通信的 socket 接口( s_fdListen 是主接口,s_fdDebug 供調試時使用)。然后將這兩個socket接口使用任 一中實現的機制進行注冊(僅列出 s_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論