技术栈

主页 > 其他 >

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

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

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


评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款

责任编辑:admin  二维码分享:
点击我更换图片

评论列表