当前位置:操作系统 > 安卓/Android >>

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文件:
[cpp]
// 每一列分别对应: 
// BP接收的请求 - BP对请求的处理函数 - AP对返回结果的处理函数 
{0, NULL, NULL},                   //none 
 
// #define RIL_REQUEST_GET_SIM_STATUS 1(in ril.h) 
// 获取SIM接口和SIM卡的状态,传入参数"data"是NULL 
// 响应函数"response"是const RIL_CardStatus * 
// 有效的返回码:无,该函数必须保证成功调用 
{RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus}, 
 
// #define RIL_REQUEST_ENTER_SIM_PIN 2 
// 请求pin码的输入,"data"是const char** 
// 其中((const char**)data)[0]是pin码 
// "response"是int*,其中((int*)response)[0]是剩余可输入次数 
// 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_ENTER_SIM_PUK 3 
// 请求PUK码和新的PIN码的输入,"data"是const char** 
// 其中((const char**)data)[0]是PUK码,((const char**)data)[1]是新的PIN码 
// "response"是int*,其中((int*)response)[0]是剩余可输入次数 
// 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_ENTER_SIM_PIN2 4 
// 请求PIN2码的输入,"data"是const char** 
// 其中((const char**)data)[0]是pin2码 
//  "response"是int*,其中((int*)response)[0]是剩余可输入次数 
// 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_ENTER_SIM_PUK2 5 
// 请求PUK2码和新的PIN2码的输入,"data"是const char** 
// 其中((const char**)data)[0]是PUK2码,((const char**)data)[1]是新的PIN2码 
// "response"是int*,其中((int*)response)[0]是剩余可输入次数 
// 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_CHANGE_SIM_PIN 6 
// 请求更改PIN码,"data"是const char** 
// 其中,((const char**)data)[0]是旧PIN码,((const char**)data)[1]是新PIN码 
// "response"是int*,其中((int*)response)[0]是剩余可输入次数 
// 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_CHANGE_SIM_PIN2 7 
// 请求更改PIN2码,"data"是const char** 
// 其中,((const char**)data)[0]是旧PIN2码,((const char**)data)[1]是新PIN2码 
// "response"是int*,其中((int*)response)[0]是剩余可输入次数 
// 有效的返回码:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_CHANGE_SIM_PIN2, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8 
// 请求输入网络个人码以便去激活,"data"是const char** 
// 其中,((const char**)data))[0]是网络个人码 
// "Response"是int*,((int*)response)[0]是剩余可输入次数 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT 
{RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, dispatchStrings, responseInts}, 
 
// #define RIL_REQUEST_GET_CURRENT_CALLS 9 
// 请求获取当前呼叫列表,"data"是NULL 
// "response"类型必须是const RIL_Call ** 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE 
{RIL_REQUEST_GET_CURRENT_CALLS, dispatchVoid, responseCallList}, 
 
// #define RIL_REQUEST_DIAL 10 
// 初始化一个语音呼叫,"data"是const RIL_Dial*类型 
// "response"是NULL 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE 
{RIL_REQUEST_DIAL, dispatchDial, responseVoid}, 
 
// #define RIL_REQUEST_GET_IMSI 11 
// 获取SIM卡中的国际移动用户识别码IMSI,只在RADIO_STATE_SIM_READY时可用 
// "data"是NULL,"response"是包含IMSI的const char*类型 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE 
{RIL_REQUEST_GET_IMSI, dispatchVoid, responseString}, 
 
// #define RIL_REQUEST_HANGUP 12 
// 挂断某一激活的通话,类似AT指令:AT+CHLD=1x;在HANDUP请求返回时,RIL将在 
// 下一次RIL_REQUEST_GET_CURRENT_CALLS请求时,显示这个连接不可用 
// "data"是int*,其中((int*)data)[0]包含连接的索引,即上面CHLD中的x值 
// "response"是NULL 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE 
{RIL_REQUEST_HANGUP, dispatchInts, responseVoid}, 
 
// #define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13 
// 挂断所有等待的或者保持的通话,类似AT指令:AT+CHLD=0;在HANDUP请求返回时, 
// RIL将在下一次RIL_REQUEST_GET_CURRENT_CALLS请求时,显示这个连接不可用 
// "data"和"response"都是NULL 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE 
{RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, dispatchVoid, responseVoid}, 
 
// #define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14 
// 释放所有激活的通话并激活保持的或者等待的通话,类似AT指令:AT+CHLD=1 
// 在HANDUP请求返回时 
// RIL将在下一次RIL_REQUEST_GET_CURRENT_CALLS请求时,显示这个连接不可用 
// "data"和"response"都是NULL 
// 有效返回码是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE 
{RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, dispatchVoid, responseVoid}, 
 
// #define RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE 15 
// 通话连接状态的转换,将所有激活的通话转为保持或等待状态,或者将保持或等待的 
// 通话转为激活状态,类似AT指令:AT+CHLD=2 
// 状态的转换有以下几种,假设通话1处于等待态,通话处于是激活态 
//      转换前                       转换后 
// 通话1    通话2        
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,