modem开机注网过程分析

所涉及模块:CM/MMOC/SD/REG/MM等。
 CM:Call Manager,给AP提供API。
 MMOC:多模控制器,控制网络模式选择/切换/开关机/低电模式等。
 SD:系统抉择,通过自身存储的数据及算法,选择网络。
 REG:负责PLMN的选择和注册。
 MM:移动管理。
 以上模块除了SD是一个独立的库并且可以被其他模块调用之外,都是Task任务机制,即都是自己维护一个独立的消息队列。
CM过程:
 初始化是在cmtask.c中的cm_task()函数中进行的,包括初始化nv队列/客户端命令队列。该函数有一个for循环来不停的监听消息队列。CM下的所有子模块均使用该消息队列进行处理,CM根据消息类型不同调用子模块不同的消息处理函数。
 cmphone:CM的phone对象,主要用来处理client发来phone相关命令,以及上报处理结果和一些主动信息给其他客户端。cmphone在cmtask.c中初始化,其操作状态会被初始化为POWEROFF(CM未获取到UI的选择)。之后CM会读取NV的设置,如果NV设置了ftm工厂测试模式,那操作模式会由POWEROFF变为FTM,这种状态下容易不识别卡或者不能打电话。后续会对plmn进行undefine。
 对于Phone这个object,有标识phone的状态标识,CM_PH_STATE_NORMAL和CM_PH_STATE_EMERG_CB,分别表示紧急回调和正常模式。还有很多其他信息,包括是否正在使用/操作模式/PLMN等相关信息,CM通过提供一个接口让其他clients来获取当前的Phone的具体信息,判断是做什么样的动作,qcril就是通过这个接口来获取CM的phone信息。
 在代码中,phone object是用CMD和EVENT来区分client的请求和反馈。client发送一个CMD给CM,该CMD被做成消息队列放入cm_task的消息队列中等待处理,处理完成后将EVENT消息通知给相应的client。如下图所示:
modem开机注网过程分析_第1张图片

  cmregprx:这个object是一个桥梁接口,主要目的扮演REG/SD/MMOC之间代理接口的角色。其在初始化的时候,会对一个cmregprx_info的结构体进行初始化。该结构体中的变量包括了记录注册状态/是否可以重选标志位/GWL的用户激活状态等。和cmphone一样,也是使用cm的task,也会创建相应cmd放入cm的task队列。
MMOC模块:
 也是task机制,MMOC初始化时会创建一个静态的Transaction结构体,MMOC的生命周期内所有cmd和report的处理都伴随着该结构体内容的不断变化。
 没有事物处理时,Transaction处于MMOC_TRANS_NULL状态。mmoc_task()会开启一个for循环不断地监听处理接收到的event(cmd和report),并及时更新transaction的状态。
SD模块:
 在系统开机或者发生变化时候,SD会使用PRL和MRU结合自身存储算法给出一个最合适的系统得到最优网络。
开机注网过程:
 modem从最初开机到注册到网络上,主要经历以下步骤:
 操作模式的改变:POWEROFF--->LPM--->ONLINE并注册到limited service--->SIM卡Available的处理过程
 1.开机启动后,在cmphone的初始化过程中,CM在未获取到UI的选择时会首先将Phone的operating mode初始化为SYS_OPRT_MODE_PWROFF。 
 2.然后在接收到RIL发来的CFUN AT命令,调用CM的接口修改operating mode为SYS_OPRT_MODE_LPM配合MMOC切换到LPM低电模式。
 3.等待AP端启动后qcril发来RADIO ON消息切换到ONLINE操作模式,进入ONLINE模式后,CM会使用MMOC_SUBSC_CHG_SUBSC_AVAIL的消息通知MMoc subscription available。在处理 MMOC_SUBSC_CHG_SUBSC_AVAIL的过程中MMOC会去活所有active protocal,然后调用SD的相关函数对SD进行初始化。SD根据请求所携带的参数及自身数据库存储的数据利用相关算法返回给MMOC一个对应的SD action,MMOC根据这个action会通知下面的协议层进行激活操作并注册到网络。但是当前SIM卡暂时还没有准备完毕,无法获取SIM卡的相关信息,因此MODEM注册到一个limited service的网络上。此过程完毕之后CM的状态就是ACTIVE,REG的状态就是IDLE状态了。 在这个状态下就已经可以进行拨打紧急电话的操作了。
 4.最后等CM收到MMGSDI上报的MMGSDI_SUBSCRIPTION_READY_EVT的消息以后,即SIM卡准备OK,会通知MMoc。与之前的流程相同MMoc收到MMGSDI_SUBSCRIPTION_READY_EVT的消息以后,首先会Deactivate所有的Active的Protocol,因为之前的操作中Protocol已经被激活,所以CM首先会发送STOP Mode的请求给REG,当Protocol被去激活后,CM,Reg的状态都转变为INACTIVE。然后MMoc收到CM上报Ph_STAT_CHG_CNF的消息后,会通知SD进行Power Up的操作,然后利用SD返回的Action通知协议层进行注网操作。CM收到此消息后会修改自身状态为Active,然后向REG发送Service Request的请求。然后REG会获取SIM卡的PLMN进行注册进入IDLE状态。

你可能感兴趣的:(modem开机注网过程分析)