modem开机注网过程分析

https://blog.csdn.net/what_a_fuck/article/details/52671134

所涉及模块:CM/MMOC/SD/REG/MM等。

call manager (CM) ---呼叫管理

system determination (SD)--系统决策--搜网策略和算法相关的模块

multimode controller (MMoC)--多模控制器

nonvolatile (NV) --非易失性


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。如下图所示:

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 actionMMOC根据这个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状态。
 
---------------------  
作者:what_a_fuck  
来源:CSDN  
原文:https://blog.csdn.net/what_a_fuck/article/details/52671134  
版权声明:本文为博主原创文章,转载请附上博文链接!

调制解调器(Modem)连接络和维持络连接的工作原理主要涉及信号转换、通信协议协商以及持续的数据传输控制。以下是其工作过程的详细解析: 1. **信号转换与初始化** 调制解调器的主要功能是将计算机产生的数字信号转换为适合在电话线等模拟介质上传输的模拟信号,反之亦然。当用户尝试建立络连接时,调制解调器会通过拨号程序自动拨打预设的接入号码,并与远程服务器端的调制解调器进行握手操作。此过程中,双方交换通信参数,例如传输速率、纠错方式等,以确保数据的正确性和完整性[^2]。 2. **通信协议协商** 在握手阶段之后,调制解调器之间会协商使用何种协议来管理数据流。例如,PPP(点对点协议)常用于拨号连接中,它不仅负责链路的建立和维护,还支持身份验证、IP地址分配等功能。这一阶段决定了后续数据传输的稳定性和效率。 3. **数据传输与流量控制** 一旦通信协议确定并成功建立连接,调制解调器便开始执行数据的双向传输任务。在此期间,调制解调器会持续监控线路质量,并根据实际情况动态调整传输速率,以适应不同的络环境变化。此外,为了防止数据溢出或丢失,调制解调器还会实施流量控制机制,确保发送方不会超出接收方处理能力的速度发送数据。 4. **错误检测与纠正** 数据传输过程中可能会因为各种原因导致误码率增加。为此,现代调制解调器内置了多种错误检测与纠正算法,如V.42标准中的LAPM(链路访问过程调制解调器)协议,能够有效减少重传次数,提高整体通信效率[^2]。 5. **断开连接与状态保持** 当用户主动断开连接或者一段时间内无数据交互时,调制解调器会按照既定规则释放当前占用的资源,结束此次通信会话。然而,在某些应用场景下,比如DSL宽带服务,即使没有活跃的数据传输,调制解调器也会维持一个低级别的连接状态,以便快速响应新的请求。 以下是一个简单的Python脚本示例,模拟了调制解调器拨号连接的基本流程: ```python import time class Modem: def __init__(self, phone_number): self.phone_number = phone_number self.connected = False def dial(self): print(f"正在拨打 {self.phone_number}...") time.sleep(2) # 模拟拨号延迟 print("握手成功") self.negotiate_protocol() def negotiate_protocol(self): print("正在进行协议协商...") time.sleep(1) print("协议协商完成") self.start_data_transfer() def start_data_transfer(self): self.connected = True print("已建立连接,开始数据传输") def disconnect(self): if self.connected: print("断开连接") self.connected = False # 创建Modem实例并模拟拨号连接 modem = Modem('12345678') modem.dial() time.sleep(5) # 模拟数据传输时间 modem.disconnect() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值