歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android RIL源碼研究筆記 の ril_command (一)

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

日期:2017/3/1 10:50:25   编辑:Linux編程
Android源碼目錄hardware/ril/libril中總共包含5個C/CPP文件,它們分別是ril_commands.h、ril_unsol_commands.h、ril_event.h、ril_event.cpp和ril.cpp。這篇文章主要分析commands相關的兩個頭文件,這兩個文件主要定義了所有telephony可以接收的命令或者響應的事件類型,以及相應的處理函數。

進行源碼分析前,我們必須先知道目前主流智能手機的硬件架構中有兩個處理器,一個稱為Application Processor(AP),主要用於運行操作系統,執行應用程序;一個稱為Baseband Processor(BP),專門負責手機中和射頻無線通信相關的功能。AP和BP芯片間通信基於串口,通信協議是廣泛使用的AT指令。

接著來了解下RIL中的兩種Response類型:

一是Solicited Response(經過請求的回復),應用的場景是AP主動向BP發送一個AT指令,請求BP進行相應處理並在處理結束時回復一個AT指令通知AP執行的結果。源碼中對應的文件是ril_commands.h。

一是Unsolicited Response(未經請求的回復),應用場景是BP主動向AP發送AT指令,用於通知AP當前系統發生的與Telephony相關的事件,例如網絡信號變化,有電話呼入等。源碼中對應的文件是ril_unsol_commands.h。

首先當然先看下ril_commands.h文件:

  1. // 每一列分別對應:
  2. // BP接收的請求 - BP對請求的處理函數 - AP對返回結果的處理函數
  3. {0, NULL, NULL}, //none
  4. // #define RIL_REQUEST_GET_SIM_STATUS 1(in ril.h)
  5. // 獲取SIM接口和SIM卡的狀態,傳入參數"data"是NULL
  6. // 響應函數"response"是const RIL_CardStatus *
  7. // 有效的返回碼:無,該函數必須保證成功調用
  8. {RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus},
  9. // #define RIL_REQUEST_ENTER_SIM_PIN 2
  10. // 請求pin碼的輸入,"data"是const char**
  11. // 其中((const char**)data)[0]是pin碼
  12. // "response"是int*,其中((int*)response)[0]是剩余可輸入次數
  13. // 有效的返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  14. {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseInts},
  15. // #define RIL_REQUEST_ENTER_SIM_PUK 3
  16. // 請求PUK碼和新的PIN碼的輸入,"data"是const char**
  17. // 其中((const char**)data)[0]是PUK碼,((const char**)data)[1]是新的PIN碼
  18. // "response"是int*,其中((int*)response)[0]是剩余可輸入次數
  19. // 有效的返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  20. {RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, responseInts},
  21. // #define RIL_REQUEST_ENTER_SIM_PIN2 4
  22. // 請求PIN2碼的輸入,"data"是const char**
  23. // 其中((const char**)data)[0]是pin2碼
  24. // "response"是int*,其中((int*)response)[0]是剩余可輸入次數
  25. // 有效的返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  26. {RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, responseInts},
  27. // #define RIL_REQUEST_ENTER_SIM_PUK2 5
  28. // 請求PUK2碼和新的PIN2碼的輸入,"data"是const char**
  29. // 其中((const char**)data)[0]是PUK2碼,((const char**)data)[1]是新的PIN2碼
  30. // "response"是int*,其中((int*)response)[0]是剩余可輸入次數
  31. // 有效的返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  32. {RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, responseInts},
  33. // #define RIL_REQUEST_CHANGE_SIM_PIN 6
  34. // 請求更改PIN碼,"data"是const char**
  35. // 其中,((const char**)data)[0]是舊PIN碼,((const char**)data)[1]是新PIN碼
  36. // "response"是int*,其中((int*)response)[0]是剩余可輸入次數
  37. // 有效的返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  38. {RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, responseInts},
  39. // #define RIL_REQUEST_CHANGE_SIM_PIN2 7
  40. // 請求更改PIN2碼,"data"是const char**
  41. // 其中,((const char**)data)[0]是舊PIN2碼,((const char**)data)[1]是新PIN2碼
  42. // "response"是int*,其中((int*)response)[0]是剩余可輸入次數
  43. // 有效的返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  44. {RIL_REQUEST_CHANGE_SIM_PIN2, dispatchStrings, responseInts},
  45. // #define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8
  46. // 請求輸入網絡個人碼以便去激活,"data"是const char**
  47. // 其中,((const char**)data))[0]是網絡個人碼
  48. // "Response"是int*,((int*)response)[0]是剩余可輸入次數
  49. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT
  50. {RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, dispatchStrings, responseInts},
  51. // #define RIL_REQUEST_GET_CURRENT_CALLS 9
  52. // 請求獲取當前呼叫列表,"data"是NULL
  53. // "response"類型必須是const RIL_Call **
  54. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  55. {RIL_REQUEST_GET_CURRENT_CALLS, dispatchVoid, responseCallList},
  56. // #define RIL_REQUEST_DIAL 10
  57. // 初始化一個語音呼叫,"data"是const RIL_Dial*類型
  58. // "response"是NULL
  59. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  60. {RIL_REQUEST_DIAL, dispatchDial, responseVoid},
  61. // #define RIL_REQUEST_GET_IMSI 11
  62. // 獲取SIM卡中的國際移動用戶識別碼IMSI,只在RADIO_STATE_SIM_READY時可用
  63. // "data"是NULL,"response"是包含IMSI的const char*類型
  64. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  65. {RIL_REQUEST_GET_IMSI, dispatchVoid, responseString},
  66. // #define RIL_REQUEST_HANGUP 12
  67. // 掛斷某一激活的通話,類似AT指令:AT+CHLD=1x;在HANDUP請求返回時,RIL將在
  68. // 下一次RIL_REQUEST_GET_CURRENT_CALLS請求時,顯示這個連接不可用
  69. // "data"是int*,其中((int*)data)[0]包含連接的索引,即上面CHLD中的x值
  70. // "response"是NULL
  71. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  72. {RIL_REQUEST_HANGUP, dispatchInts, responseVoid},
  73. // #define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13
  74. // 掛斷所有等待的或者保持的通話,類似AT指令:AT+CHLD=0;在HANDUP請求返回時,
  75. // RIL將在下一次RIL_REQUEST_GET_CURRENT_CALLS請求時,顯示這個連接不可用
  76. // "data"和"response"都是NULL
  77. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  78. {RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, dispatchVoid, responseVoid},
  79. // #define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14
  80. // 釋放所有激活的通話並激活保持的或者等待的通話,類似AT指令:AT+CHLD=1
  81. // 在HANDUP請求返回時
  82. // RIL將在下一次RIL_REQUEST_GET_CURRENT_CALLS請求時,顯示這個連接不可用
  83. // "data"和"response"都是NULL
  84. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  85. {RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, dispatchVoid, responseVoid},
  86. // #define RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE 15
  87. // 通話連接狀態的轉換,將所有激活的通話轉為保持或等待狀態,或者將保持或等待的
  88. // 通話轉為激活狀態,類似AT指令:AT+CHLD=2
  89. // 狀態的轉換有以下幾種,假設通話1處於等待態,通話處於是激活態
  90. // 轉換前 轉換後
  91. // 通話1 通話2 通話1 通話2
  92. // ACTIVE HOLDING HOLDING ACTIVE
  93. // ACTIVE WAITING HOLDING ACTIVE
  94. // HOLDING WAITING HOLDING ACTIVE
  95. // ACTIVE IDLE HOLDING IDLE
  96. // IDLE IDLE IDLE IDLE
  97. // "data"和"response"都是NULL
  98. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  99. {RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, dispatchVoid, responseVoid},
  100. // #define RIL_REQUEST_CONFERENCE 16
  101. // 請求加入電話會議,類似AT指令:AT+CHLD=3
  102. // "data"和"response"都是NULL
  103. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  104. {RIL__CONFERENCE, dispatchVoid, responseVoid},
  105. // #define RIL_REQUEST_UDUB 17
  106. // 發送用戶確定用戶忙UDUB(user determined user busy)信號
  107. // "data"和"response"都是NULL
  108. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  109. {RIL_REQUEST_UDUB, dispatchVoid, responseVoid},
  110. // #define RIL_REQUEST_LAST_CALL_FAIL_CAUSE 18
  111. // 請求最近一次通話中斷的錯誤碼,"data"是NULL,"response"是int*
  112. // ((int*)response)[0]是RIL_LastCallFailCause類型。
  113. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE
  114. {RIL_REQUEST_LAST_CALL_FAIL_CAUSE, dispatchVoid, responseInts},
  115. // #define RIL_REQUEST_SIGNAL_STRENGTH 19
  116. // 請求當前的信號強度等相關信息,當天線打開時必須返回成功
  117. // "data"是NULL,"response"是const RIL_SignalStrength
  118. // 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE
  119. {RIL_REQUEST_SIGNAL_STRENGTH, dispatchVoid, responseRilSignalStrength},
  120. // #define RIL_REQUEST_REGISTRATION_STATE 20
  121. // 請求當前的注冊狀態,"data"是NULL,"response"是const char**類型
  122. // ((const char **)response)[0]表示注冊狀態,取值如下:
  123. // 0 - 未注冊,移動終端MT當前沒有搜索新的運營商去注冊
  124. // 1 - 已注冊,本地網絡
  125. // 2 - 未注冊,移動終端MT當前正在搜索新的運營商去注冊
  126. // 3 - 拒絕注冊
  127. // 4 - 未知
  128. // 5 - 已注冊,漫游
  129. // 10 - 類似0,但指示緊急呼叫使能
  130. // 12 - 類似2,但指示緊急呼叫使能
  131. // 13 - 類似3,但指示緊急呼叫使能
  132. // 14 - 類似4,但指示緊急呼叫使能
  133. // ((const char **)response)[1],如果注冊在GSM/WCDMA網絡上,則表示LAC,
  134. // 否則是NULL,有效的LAC值是0x0000 -- 0xffff
  135. // ((const char **)response)[2],如果注冊在GSM/WCDMA網絡上,表示CID,
  136. // 否則是NULL,有效的CID值是0x00000000 -- 0xffffffff
  137. // GSM網絡中,CID指Cell ID,以16bits表示
  138. // UMTS網絡中(3G網絡),CID指UMTS Cell Identity,以28bits表示
  139. // ((const char **)response)[3],指示可用的無線技術:
  140. // 0 - Unknown, 1 - GPRS, 2 - EDGE, 3 - UMTS, 4 - IS95A, 5 - IS95B
  141. // 6 - 1xRTT, 7 - EvDo Rev.0, 8 - EvDo Rev.A, 9 - HSDPA, 10 - HSUPA
  142. // 11 - HSPA, 12 - EVDO Rev B
  143. // ((const char **)response)[4],CDMA網絡中表示基站ID,否則為NULL
  144. // 基站ID是十進制表示的
  145. // ((const char **)response)[5],CDMA網絡中表示基站緯度,否則為NULL
  146. // ((const char **)response)[6],CDMA網絡中表示基站經度,否則為NULL
  147. // ((const char **)response)[7],CDMA網絡中表示是否支持並發服務
  148. // 0 - 不支持,1 - 支持
  149. // ((const char **)response)[8],CDMA網絡中表示系統ID,否則為NULL
  150. // 取值范圍是0 - 32767
  151. // ((const char **)response)[9],CDMA網絡中表示網絡ID,否則為NULL
  152. // 取值范圍是0 - 65535
  153. // ((const char **)response)[10],CDMA和EVDO網絡中表示TSB-58漫游指示符
  154. // 否則為NULL,有效值是0 - 255
  155. // ((const char **)response)[11],CDMA和EVDO網絡中表示當前系統是否在PRL中
  156. // 否則為NULL,0 - 不在,1 - 在
  157. // ((const char **)response)[12],CDMA和EVDO網絡中表示默認的TSB-58漫游指示符
  158. // 否則為NULL,有效值是0 - 255
  159. // ((const char **)response)[13],如果注冊狀態是3(拒絕注冊),這個值表示拒絕的
  160. // 原因,取值如下:0 - 一般,1 - 認證失敗,2 - IMSI在HLR中是未知的,3 - 非法MS,// 4 - 非法ME,5 - PLMN不允許,6 - 本地網絡不允許,7 - 漫游不允許,
  161. // 8 - 本地網絡沒有可用的蜂窩站點,9 - 網絡失效,10 - 持續定位更新拒絕// ((const char **)response)[13],當前蜂窩站點的主要擾碼,十進制表示
  162. // 如果未在UMTS網絡中注冊,或者注冊狀態未知,則為NULL
  163. // 注意:當注冊狀態未知時,在Android電話系統中將作為服務不可用來處理
  164. {RIL_REQUEST_REGISTRATION_STATE, dispatchVoid, responseStrings},
Copyright © Linux教程網 All Rights Reserved