歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android RIL源碼研究筆記 の ril (一)

Android源碼目錄hardware/ril/libril中總共包含5個C/CPP文件,它們分別是ril_commands.h、ril_unsol_commands.h、ril_event.h、ril_event.cpp和ril.cpp。這篇文章主要分析ril.cpp文件。

我們可以將該文件劃分為定義部分和實現部分,先來看定義部分:

  1. #define LOG_TAG "RILC"   
  2.   
  3. #include <hardware_legacy/power.h>   
  4.   
  5. #include <telephony/ril.h>   
  6. #include <telephony/ril_cdma_sms.h>   
  7. #include <cutils/sockets.h>   
  8. #include <cutils/jstring.h>   
  9. #include <cutils/record_stream.h>   
  10. #include <utils/Log.h>   
  11. #include <utils/SystemClock.h>   
  12. #include <pthread.h>   
  13. #include <binder/Parcel.h>   
  14. #include <cutils/jstring.h>   
  15.   
  16. #include <sys/types.h>   
  17. #include <pwd.h>   
  18.   
  19. #include <stdio.h>   
  20. #include <stdlib.h>   
  21. #include <stdarg.h>   
  22. #include <string.h>   
  23. #include <unistd.h>   
  24. #include <fcntl.h>   
  25. #include <time.h>   
  26. #include <errno.h>   
  27. #include <assert.h>   
  28. #include <ctype.h>   
  29. #include <alloca.h>   
  30. #include <sys/un.h>   
  31. #include <assert.h>   
  32. #include <netinet/in.h>   
  33. #include <cutils/properties.h>   
  34.   
  35. #include <ril_event.h>   
  36.   
  37. namespace android {  
  38.   
  39. #define PHONE_PROCESS "radio"   
  40.   
  41. #define SOCKET_NAME_RIL "rild"   
  42. #define SOCKET_NAME_RIL_DEBUG "rild-debug"   
  43.   
  44. #define ANDROID_WAKE_LOCK_NAME "radio-interface"   
  45.   
  46. #define PROPERTY_RIL_IMPL "gsm.version.ril-impl"   
  47.   
  48. // match with constant in RIL.java   
  49. #define MAX_COMMAND_BYTES (8 * 1024)   
  50.   
  51. // Basically: memset buffers that the client library   
  52. // shouldn't be using anymore in an attempt to find   
  53. // memory usage issues sooner.   
  54. #define MEMSET_FREED 1   
  55.   
  56. // 常見的獲取數組元素個數的方法   
  57. #define NUM_ELEMS(a)     (sizeof (a) / sizeof (a)[0])   
  58.   
  59. // 返回兩數中較小者   
  60. #define MIN(a,b) ((a)<(b) ? (a) : (b))   
  61.   
  62. /* 回復類型:經過請求的回復和未經請求的回復*/  
  63. #define RESPONSE_SOLICITED 0   
  64. #define RESPONSE_UNSOLICITED 1   
  65.   
  66. /* Negative values for private RIL errno's */  
  67. #define RIL_ERRNO_INVALID_RESPONSE -1   
  68.   
  69. // request, response, and unsolicited msg print macro   
  70. // 即打印緩沖區printBuf的大小   
  71. #define PRINTBUF_SIZE 8096   
  72.   
  73. // Enable RILC log   
  74. #define RILC_LOG 0   
  75.   
  76. #if RILC_LOG   
  77.     // 三個宏的調用順序是startRequest - printRequest - closeRequest   
  78. // 這樣打印出來的請求命令將包含在()中   
  79.     #define startRequest           sprintf(printBuf, "(")   
  80.     #define closeRequest           sprintf(printBuf, "%s)", printBuf)   
  81.     #define printRequest(token, req)           \   
  82.             LOGD("[%04d]> %s %s", token, requestToString(req), printBuf)  
  83. // 三個宏的調用順序是startResponse - printResponse - closeResponse   
  84. // 這樣打印出來的回復信息將包含在{}中   
  85.     #define startResponse           sprintf(printBuf, "%s {", printBuf)   
  86.     #define closeResponse           sprintf(printBuf, "%s}", printBuf)   
  87.     #define printResponse           LOGD("%s", printBuf)   
  88.   
  89.     #define clearPrintBuf           printBuf[0] = 0   
  90.     #define removeLastChar          printBuf[strlen(printBuf)-1] = 0   
  91.     #define appendPrintBuf(x...)    sprintf(printBuf, x)   
  92. #else   
  93.     #define startRequest   
  94.     #define closeRequest   
  95.     #define printRequest(token, req)   
  96.     #define startResponse   
  97.     #define closeResponse   
  98.     #define printResponse   
  99.     #define clearPrintBuf   
  100.     #define removeLastChar   
  101.     #define appendPrintBuf(x...)   
  102. #endif   
  103.   
  104. // 喚醒類型:不喚醒,部分喚醒   
  105. enum WakeType {DONT_WAKE, WAKE_PARTIAL};  
  106.   
  107. // "經過請求的回復"結構體定義:請求號,命令分發處理函數,返回結果響應函數   
  108. // 該結構體的取值見ril_commands.h文件   
  109. typedef struct {  
  110.     int requestNumber;  
  111.     void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);  
  112.     int(*responseFunction) (Parcel &p, void *response, size_t responselen);  
  113. } CommandInfo;  
  114.   
  115. //"未經請求的回復"結構體定義:請求號,事件響應函數,喚醒類型   
  116. // 該結構體的取值見ril_unsol_commands.h文件   
  117. typedef struct {  
  118.     int requestNumber;  
  119.     int (*responseFunction) (Parcel &p, void *response, size_t responselen);  
  120.     WakeType wakeType;  
  121. } UnsolResponseInfo;  
  122.   
  123. // 請求信息結構體,封裝CommandInfo,串成鏈表   
  124. typedef struct RequestInfo {  
  125.     int32_t token;      //this is not RIL_Token   
  126.     CommandInfo *pCI;  
  127.     struct RequestInfo *p_next;  
  128.     char cancelled;  
  129.     char local;  // responses to local commands do not go back to command process   
  130. } RequestInfo;  
  131.   
  132. // 用戶回調信息結構體   
  133. typedef struct UserCallbackInfo {  
  134.     RIL_TimedCallback p_callback; // 回調函數   
  135.     void *userParam;              // 回調函數的參數   
  136.     struct ril_event event;       // ril event   
  137.     struct UserCallbackInfo *p_next; // 指向下一個回調信息結構(鏈表形式)   
  138. } UserCallbackInfo;  
  139.   
  140. /*******************************************************************/  
  141. // 初始化回調結構   
  142. RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};  
  143. static int s_registerCalled = 0;  
  144.   
  145. static pthread_t s_tid_dispatch; // 分發處理線程ID   
  146. static pthread_t s_tid_reader;   // 讀者線程ID   
  147. static int s_started = 0;   
  148.   
  149. // 文件描述符初始化   
  150. static int s_fdListen = -1;  
  151. static int s_fdCommand = -1;  
  152. static int s_fdDebug = -1;  
  153.   
  154. static int s_fdWakeupRead;  
  155. static int s_fdWakeupWrite;  
  156.   
  157. // 5個相關的事件   
  158. static struct ril_event s_commands_event;  
  159. static struct ril_event s_wakeupfd_event;  
  160. static struct ril_event s_listen_event;  
  161. static struct ril_event s_wake_timeout_event;  
  162. static struct ril_event s_debug_event;  
  163.   
  164.   
  165. static const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0};  
  166.   
  167. // 初始化互斥量和條件變量   
  168. static pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;  
  169. static pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;  
  170. static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;  
  171. static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;  
  172.   
  173. static pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;  
  174. static pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;  
  175.   
  176. static RequestInfo *s_pendingRequests = NULL;  
  177.   
  178. static RequestInfo *s_toDispatchHead = NULL;  
  179. static RequestInfo *s_toDispatchTail = NULL;  
  180.   
  181. static UserCallbackInfo *s_last_wake_timeout_info = NULL;  
  182.   
  183. static void *s_lastNITZTimeData = NULL;  
  184. static size_t s_lastNITZTimeDataSize;  
  185.   
  186. #if RILC_LOG   
  187.     static char printBuf[PRINTBUF_SIZE]; // 緩存打印信息的數組   
  188. #endif   
  189.   
  190. /*******************************************************************/  
  191. // dispatch*系列函數是基帶處理器對應用處理器請求的處理函數   
  192. static void dispatchVoid (Parcel& p, RequestInfo *pRI);  
  193. static void dispatchString (Parcel& p, RequestInfo *pRI);  
  194. static void dispatchStrings (Parcel& p, RequestInfo *pRI);  
  195. static void dispatchInts (Parcel& p, RequestInfo *pRI);  
  196. static void dispatchDial (Parcel& p, RequestInfo *pRI);  
  197. static void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);  
  198. static void dispatchCallForward(Parcel& p, RequestInfo *pRI);  
  199. static void dispatchRaw(Parcel& p, RequestInfo *pRI);  
  200. static void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);  
  201.   
  202. static void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);  
  203. static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);  
  204. static void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);  
  205. static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);  
  206. static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);  
  207.   
  208. // response*系列函數是應用處理器對基帶處理器消息的響應函數   
  209. // 包括請求回復響應函數和事件響應函數   
  210. static int responseInts(Parcel &p, void *response, size_t responselen);  
  211. static int responseStrings(Parcel &p, void *response, size_t responselen);  
  212. static int responseString(Parcel &p, void *response, size_t responselen);  
  213. static int responseVoid(Parcel &p, void *response, size_t responselen);  
  214. static int responseCallList(Parcel &p, void *response, size_t responselen);  
  215. static int responseSMS(Parcel &p, void *response, size_t responselen);  
  216. static int responseSIM_IO(Parcel &p, void *response, size_t responselen);  
  217. static int responseCallForwards(Parcel &p, void *response, size_t responselen);  
  218. static int responseDataCallList(Parcel &p, void *response, size_t responselen);  
  219. static int responseRaw(Parcel &p, void *response, size_t responselen);  
  220. static int responseSsn(Parcel &p, void *response, size_t responselen);  
  221. static int responseSimStatus(Parcel &p, void *response, size_t responselen);  
  222. static int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);  
  223. static int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);  
  224. static int responseCdmaSms(Parcel &p, void *response, size_t responselen);  
  225. static int responseCellList(Parcel &p, void *response, size_t responselen);  
  226. static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);  
  227. static int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);  
  228. static int responseCallRing(Parcel &p, void *response, size_t responselen);  
  229. static int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);  
  230. static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);  
  231.   
  232. // 將數據結構信息轉換成字符串輸出   
  233. extern "C" const char * requestToString(int request);  
  234. extern "C" const char * failCauseToString(RIL_Errno);  
  235. extern "C" const char * callStateToString(RIL_CallState);  
  236. extern "C" const char * radioStateToString(RIL_RadioState);  
  237.   
  238. #ifdef RIL_SHLIB   
  239. extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,  
  240.                                 size_t datalen);  
  241. #endif   
  242.   
  243. static UserCallbackInfo * internalRequestTimedCallback  
  244.     (RIL_TimedCallback callback, void *param,  
  245.         const struct timeval *relativeTime);  
  246.   
  247. /** Index == requestNumber */  
  248. // 很不錯的一個用法,由於數組元素太多,為了代碼的整潔清晰,   
  249. // 將數組元素的定義放在一個單獨的頭文件中,並用#include進來即可   
  250. static CommandInfo s_commands[] = {  
  251. #include "ril_commands.h"   
  252. };  
  253.   
  254. static UnsolResponseInfo s_unsolResponses[] = {  
  255. #include "ril_unsol_commands.h"   
  256. };  
Copyright © Linux教程網 All Rights Reserved