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等等模块没有去了解。

posted @ 2014-09-09 16:49  elevenfeng  阅读(373)  评论(0编辑  收藏  举报