Android RIL源码研究笔记 の ril_command (一)


    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.   
  5. // #define RIL_REQUEST_GET_SIM_STATUS 1(in ril.h)   
  6. // 获取SIM接口和SIM卡的状态,传入参数"data"是NULL   
  7. // 响应函数"response"是const RIL_CardStatus *   
  8. // 有效的返回码:无,该函数必须保证成功调用   
  9. {RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus},  
  10.   
  11. // #define RIL_REQUEST_ENTER_SIM_PIN 2   
  12. // 请求pin码的输入,"data"是const char**   
  13. // 其中((const char**)data)[0]是pin码   
  14. // "response"是int*,其中((int*)response)[0]是剩余可输入次数   
  15. // 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  16. {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseInts},  
  17.   
  18. // #define RIL_REQUEST_ENTER_SIM_PUK 3   
  19. // 请求PUK码和新的PIN码的输入,"data"是const char**   
  20. // 其中((const char**)data)[0]是PUK码,((const char**)data)[1]是新的PIN码   
  21. // "response"是int*,其中((int*)response)[0]是剩余可输入次数   
  22. // 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  23. {RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, responseInts},  
  24.   
  25. // #define RIL_REQUEST_ENTER_SIM_PIN2 4   
  26. // 请求PIN2码的输入,"data"是const char**   
  27. // 其中((const char**)data)[0]是pin2码   
  28. //  "response"是int*,其中((int*)response)[0]是剩余可输入次数   
  29. // 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  30. {RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, responseInts},  
  31.   
  32. // #define RIL_REQUEST_ENTER_SIM_PUK2 5   
  33. // 请求PUK2码和新的PIN2码的输入,"data"是const char**   
  34. // 其中((const char**)data)[0]是PUK2码,((const char**)data)[1]是新的PIN2码   
  35. // "response"是int*,其中((int*)response)[0]是剩余可输入次数   
  36. // 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  37. {RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, responseInts},  
  38.   
  39. // #define RIL_REQUEST_CHANGE_SIM_PIN 6   
  40. // 请求更改PIN码,"data"是const char**   
  41. // 其中,((const char**)data)[0]是旧PIN码,((const char**)data)[1]是新PIN码   
  42. // "response"是int*,其中((int*)response)[0]是剩余可输入次数   
  43. // 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  44. {RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, responseInts},  
  45.   
  46. // #define RIL_REQUEST_CHANGE_SIM_PIN2 7   
  47. // 请求更改PIN2码,"data"是const char**   
  48. // 其中,((const char**)data)[0]是旧PIN2码,((const char**)data)[1]是新PIN2码   
  49. // "response"是int*,其中((int*)response)[0]是剩余可输入次数   
  50. // 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  51. {RIL_REQUEST_CHANGE_SIM_PIN2, dispatchStrings, responseInts},  
  52.   
  53. // #define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8   
  54. // 请求输入网络个人码以便去激活,"data"是const char**   
  55. // 其中,((const char**)data))[0]是网络个人码   
  56. // "Response"是int*,((int*)response)[0]是剩余可输入次数   
  57. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT   
  58. {RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, dispatchStrings, responseInts},  
  59.   
  60. // #define RIL_REQUEST_GET_CURRENT_CALLS 9   
  61. // 请求获取当前呼叫列表,"data"是NULL   
  62. // "response"类型必须是const RIL_Call **   
  63. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  64. {RIL_REQUEST_GET_CURRENT_CALLS, dispatchVoid, responseCallList},  
  65.   
  66. // #define RIL_REQUEST_DIAL 10   
  67. // 初始化一个语音呼叫,"data"是const RIL_Dial*类型   
  68. // "response"是NULL   
  69. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  70. {RIL_REQUEST_DIAL, dispatchDial, responseVoid},  
  71.   
  72. // #define RIL_REQUEST_GET_IMSI 11   
  73. // 获取SIM卡中的国际移动用户识别码IMSI,只在RADIO_STATE_SIM_READY时可用   
  74. // "data"是NULL,"response"是包含IMSI的const char*类型   
  75. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  76. {RIL_REQUEST_GET_IMSI, dispatchVoid, responseString},  
  77.   
  78. // #define RIL_REQUEST_HANGUP 12   
  79. // 挂断某一激活的通话,类似AT指令:AT+CHLD=1x;在HANDUP请求返回时,RIL将在   
  80. // 下一次RIL_REQUEST_GET_CURRENT_CALLS请求时,显示这个连接不可用   
  81. // "data"是int*,其中((int*)data)[0]包含连接的索引,即上面CHLD中的x值   
  82. // "response"是NULL   
  83. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  84. {RIL_REQUEST_HANGUP, dispatchInts, responseVoid},  
  85.   
  86. // #define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13   
  87. // 挂断所有等待的或者保持的通话,类似AT指令:AT+CHLD=0;在HANDUP请求返回时,   
  88. // RIL将在下一次RIL_REQUEST_GET_CURRENT_CALLS请求时,显示这个连接不可用   
  89. // "data"和"response"都是NULL   
  90. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  91. {RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, dispatchVoid, responseVoid},  
  92.   
  93. // #define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14   
  94. // 释放所有激活的通话并激活保持的或者等待的通话,类似AT指令:AT+CHLD=1   
  95. // 在HANDUP请求返回时   
  96. // RIL将在下一次RIL_REQUEST_GET_CURRENT_CALLS请求时,显示这个连接不可用   
  97. // "data"和"response"都是NULL   
  98. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  99. {RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, dispatchVoid, responseVoid},  
  100.   
  101. // #define RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE 15   
  102. // 通话连接状态的转换,将所有激活的通话转为保持或等待状态,或者将保持或等待的   
  103. // 通话转为激活状态,类似AT指令:AT+CHLD=2   
  104. // 状态的转换有以下几种,假设通话1处于等待态,通话处于是激活态   
  105. //      转换前                       转换后   
  106. // 通话1    通话2              通话1      通话2   
  107. // ACTIVE    HOLDING            HOLDING    ACTIVE   
  108. // ACTIVE    WAITING            HOLDING    ACTIVE   
  109. // HOLDING   WAITING            HOLDING    ACTIVE   
  110. // ACTIVE    IDLE               HOLDING    IDLE   
  111. // IDLE      IDLE               IDLE       IDLE   
  112. // "data"和"response"都是NULL   
  113. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  114. {RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, dispatchVoid, responseVoid},  
  115.   
  116. // #define RIL_REQUEST_CONFERENCE 16   
  117. // 请求加入电话会议,类似AT指令:AT+CHLD=3   
  118. // "data"和"response"都是NULL   
  119. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  120. {RIL__CONFERENCE, dispatchVoid, responseVoid},  
  121.   
  122. // #define RIL_REQUEST_UDUB 17   
  123. // 发送用户确定用户忙UDUB(user determined user busy)信号   
  124. // "data"和"response"都是NULL   
  125. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  126. {RIL_REQUEST_UDUB, dispatchVoid, responseVoid},  
  127.   
  128. // #define RIL_REQUEST_LAST_CALL_FAIL_CAUSE 18   
  129. // 请求最近一次通话中断的错误码,"data"是NULL,"response"是int*   
  130. // ((int*)response)[0]是RIL_LastCallFailCause类型。   
  131. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE   
  132. {RIL_REQUEST_LAST_CALL_FAIL_CAUSE, dispatchVoid, responseInts},  
  133.   
  134. // #define RIL_REQUEST_SIGNAL_STRENGTH 19   
  135. // 请求当前的信号强度等相关信息,当天线打开时必须返回成功   
  136. // "data"是NULL,"response"是const RIL_SignalStrength   
  137. // 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE   
  138. {RIL_REQUEST_SIGNAL_STRENGTH, dispatchVoid, responseRilSignalStrength},  
  139.   
  140. // #define RIL_REQUEST_REGISTRATION_STATE 20   
  141. // 请求当前的注册状态,"data"是NULL,"response"是const char**类型   
  142. // ((const char **)response)[0]表示注册状态,取值如下:   
  143. //  0 - 未注册,移动终端MT当前没有搜索新的运营商去注册   
  144. //  1 - 已注册,本地网络   
  145. //  2 - 未注册,移动终端MT当前正在搜索新的运营商去注册   
  146. //  3 - 拒绝注册   
  147. //  4 - 未知   
  148. //  5 - 已注册,漫游   
  149. //  10 - 类似0,但指示紧急呼叫使能   
  150. //  12 - 类似2,但指示紧急呼叫使能   
  151. //  13 - 类似3,但指示紧急呼叫使能   
  152. //  14 - 类似4,但指示紧急呼叫使能   
  153. // ((const char **)response)[1],如果注册在GSM/WCDMA网络上,则表示LAC,   
  154. // 否则是NULL,有效的LAC值是0x0000 -- 0xffff   
  155. // ((const char **)response)[2],如果注册在GSM/WCDMA网络上,表示CID,   
  156. // 否则是NULL,有效的CID值是0x00000000 -- 0xffffffff   
  157. // GSM网络中,CID指Cell ID,以16bits表示   
  158. // UMTS网络中(3G网络),CID指UMTS Cell Identity,以28bits表示   
  159. // ((const char **)response)[3],指示可用的无线技术:   
  160. // 0 - Unknown, 1 - GPRS, 2 - EDGE, 3 - UMTS, 4 - IS95A, 5 - IS95B   
  161. // 6 - 1xRTT, 7 - EvDo Rev.0, 8 - EvDo Rev.A, 9 - HSDPA, 10 - HSUPA   
  162. // 11 - HSPA, 12 - EVDO Rev B   
  163. // ((const char **)response)[4],CDMA网络中表示基站ID,否则为NULL   
  164. // 基站ID是十进制表示的   
  165. // ((const char **)response)[5],CDMA网络中表示基站纬度,否则为NULL   
  166. // ((const char **)response)[6],CDMA网络中表示基站经度,否则为NULL   
  167. // ((const char **)response)[7],CDMA网络中表示是否支持并发服务   
  168. // 0 - 不支持,1 - 支持   
  169. // ((const char **)response)[8],CDMA网络中表示系统ID,否则为NULL   
  170. // 取值范围是0 - 32767   
  171. // ((const char **)response)[9],CDMA网络中表示网络ID,否则为NULL   
  172. // 取值范围是0 - 65535   
  173. // ((const char **)response)[10],CDMA和EVDO网络中表示TSB-58漫游指示符   
  174. // 否则为NULL,有效值是0 - 255   
  175. // ((const char **)response)[11],CDMA和EVDO网络中表示当前系统是否在PRL中   
  176. // 否则为NULL,0 - 不在,1 - 在   
  177. // ((const char **)response)[12],CDMA和EVDO网络中表示默认的TSB-58漫游指示符   
  178. // 否则为NULL,有效值是0 - 255   
  179. // ((const char **)response)[13],如果注册状态是3(拒绝注册),这个值表示拒绝的   
  180. // 原因,取值如下:0 - 一般,1 - 认证失败,2 - IMSI在HLR中是未知的,3 - 非法MS,// 4 - 非法ME,5 - PLMN不允许,6 - 本地网络不允许,7 - 漫游不允许,   
  181. // 8 - 本地网络没有可用的蜂窝站点,9 - 网络失效,10 - 持续定位更新拒绝// ((const char **)response)[13],当前蜂窝站点的主要扰码,十进制表示   
  182. // 如果未在UMTS网络中注册,或者注册状态未知,则为NULL   
  183. // 注意:当注册状态未知时,在Android电话系统中将作为服务不可用来处理   
  184. {RIL_REQUEST_REGISTRATION_STATE, dispatchVoid, responseStrings}, 

相关内容