2010年6月8日 星期二

Android Reference-RIL -- 初始化/訊息處理 簡略文字流程

RIL 初始化流程:

  1. RILD 起動 RIL OBJ(ril.cpp) 中 RIL_StartLoop,其 New Thread 執行 RIL Event (ril_event.cpp) ::ril_event_loop() 為 for(;;) loop 等待處理 event list 中的訊息(event)
  2. RIL daemon(RILD) 載入 Libreferece-ril.so 
  3. RILD 透過 Dynaminc Loader(DL) dlsym() 取得 Librerfernce-ril.so 中的 RIL_Init function address(*rilInit).
  4. RILD 呼叫 (*rilInit) 取得 Reference-RIL callback function table[].
callback function table[] --
.RIL_VERSION,
.onRequest(),
.currentState(),
.onSupport(),
.onCancel(),
.getVersion(),
  1. RILD 透過 RIL OBJ :: RIL_Register() 將 callback function table[] 儲存在 RIL OBJ. 並且取得 RIL socket-s_fdListen,等待連線。

<<缺圖說明>>
RIL 事件處理流程:
  1. RIL OBJ :: listenCallback 檢查是否有從 Phone process 的連線。
  2. 一旦確認為 Phone Process 連線,開取讀取 command,將其 Command Data 及 handle function (RIL :: processCommandsCallback) 設定至 RIL Event,並交至 Event Loop 處理。
  3. RIL Event :: ril_event_loop() 檢查是否有訊息待處理。會觸發 RIL Event :: firePending() ,其中會呼叫 Event Element 中的 handle function。[該步驟會重覆執行至所有訊息被處理結束。]
  4. 通 常 handle function 都被設定為 RIL :: processCommandsCallback(),結束 Stream data 後,即呼叫 RIL OBJ :: processCommandBuffer() 。
  5. RIL OBJ :: processCommandBuffer() 將依上層的 Request Number 利用 s_command[] table 轉換成相對應之 Request data 。
  6. 並且呼叫 s_command[] command 已定義的 dispatchFunction()。
dispatchFunction() 大致分類為:void, string, strings, ints, smsWrite, Dail, SIM_IO, CallForward, Raw, CdmaSMS, CdmaSMSAck, GSMBrSmsCnf, CdmaBrSmsCnf, RilCdmaSMSWrite 這些類別。
  1. dispatchFunction 最終都會呼叫 Ref-RIL(Reference-RIL) callback function table[].onRequest() 並且代入 Request Number。
  2. Ref-RIL :: on Request() 會依 Requset Number 執行相對應之工作。

沒有留言: