首页 > 代码库 > Android 无线启动过程分析
Android 无线启动过程分析
之前我们要可以详细了解RIL层的工作过程,不过如果单纯去调reference-ril库的话,也没有必要详细了解其他库。但我们要知道基本的启动过程,以便于调试。
开机过程中无线模块的初始化过程:
rild 调用参考实现 Reference-ril.c (hardware/ril/reference-ril) 中的函数:
const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);
static void *mainLoop(void *param) ret = at_open(fd, onUnsolicited);
RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);
在 initializeCallback 函数中对猫进行了初始化。
即发送一堆AT命令,进行相应的设置,我们可以进行相应的设置修改。
默认状况下假设射频模块是好的,
通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对无线模块的初始化。
通过 static void onRadioPowerOn() 对无线模块初始化。
首先通过 pollSIMState(NULL); 轮询 sim卡状态 。
static void pollSIMState (void *param)
{
ATResponse *p_response;
int ret;
if (sState != RADIO_STATE_SIM_NOT_READY) {
// no longer valid to poll
return;
}
switch(getSIMStatus()) {
case RIL_SIM_ABSENT:
case RIL_SIM_PIN:
case RIL_SIM_PUK:
case RIL_SIM_NETWORK_PERSONALIZATION:
default:
setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT);
return;
case RIL_SIM_NOT_READY:
RIL_requestTimedCallback (pollSIMState, NULL, &TIMEVAL_SIMPOLL);
return;
case RIL_SIM_READY:
setRadioState(RADIO_STATE_SIM_READY);
return;
}
}
读取sim卡状态的函数是:getSIMStatus()
err = at_send_command_singleline(”AT+CPIN?”, “+CPIN:”, &p_response);
它向猫发送了at命令 AT+CPIN? 来查询无线模块的状态,如果无线模块还没有就绪,那么他隔1秒钟
继续调用
sim卡状态轮询函数 pollSIMState,直到获得sim卡状态。
当sim卡状态为就绪,那么通过 setRadioState(RADIO_STATE_SIM_READY) 设置变量 sState
为:
RADIO_STATE_SIM_READY,这时候会调用函数 static void onSIMReady()来进一步初始化无线
模块。
发送的at命令有:
at_send_command_singleline(”AT+CSMS=1″, “+CSMS:”, NULL);
at_send_command(”AT+CNMI=1,2,2,1,1″, NULL);
基本的启动过程就是这样,起来后,继续去调试各种请求。每个模块都不一样,我们需要不同的AT命令集。
我当时做的任务仅仅是调试3g模块,所以对于wifi等等模块没有去了解。
Android 无线启动过程分析