ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年1月11日 星期三

android code trace -- rild. reference-ril

從前一篇,可以知道,rild daemon ,處理 command 的部份是libril/ril.cpp 的 processCommandCallback
其中的 processCommandBuffer( )

Command 的內容格式 (protocol) 好像是 Parcel 這個 structure。
分為 request, token。
request 就是 command 的 id。

然後簡單由查表找出 request command id 對應的 function 是 ?
然後去執行他。

這個 table 就是 static CommandInfo s_commands[] = { #include "ril_commands.h" };

trace 一下,以 QUERY_AVAILABLE_NETWORKS.

在 ril_commands.h 裡,有 {RIL_REQUEST_QUERY_AVAILABLE_NETWORKS , dispatchVoid, responseStrings},T 所以,是 call dispatchVoid(),然後 response 送到 reponseStrings( )。

dispatchVoid( ) 實際 call s_callbacks.onRequest( )。
s_callbacks 是: static const RIL_RadioFunctions s_callbacks = { RIL_VERSION, onRequest, currentState, onSupports, onCancel, getVersion }; 所以 call 的是 onRequest (reference-ril.c)

rild support 的 command 就寫在 onRequest。
.. 裡面沒有 implement AVAILABLE_NETWORK..

... 難怪每一家 modem vendor 都不願意給 source,都給so.

AVAILABLE_NETWORK 的 AT COMMAND 是 at+cops=? response 是 一行:
ref: http://r40eubuntu.blogspot.com/2012/01/modem-at-command-cops-operator.html

所以送的 at_command 應該用 SINGLELINE。 at_send_command_singleline reponse 也是以 COPS: 開始,所以送command 應該是: err = at_send_command_singleline("AT+COPS=?","+COPS:",&p_response);
response 的部份可以參考 CM 的 android_hardware_ril 為了 htc 的 reference-ril.so 的修改: https://github.com/CyanogenMod/android_hardware_ril/commit/90102813ee766b658c9d11f47bfffa785a98b6cd

沒有留言:

標籤

網誌存檔