Android电话系统rild-response analysis

本文将详细分析rild处理response的流程,包括一般的resonse和unsolicited response。

一、与request对应的response


1、Atchannel.c

  启动readerloop,调用readline(),循环读取modem发来的消息

2、如果读到数据,调用processline()进行处理,首先判断是否是unsolicited消息,如果不是,则调用handlerFinalResponse()进行处理

3、handlerFinalResponse()调用pthread_cond_signal(),唤醒正在等待response的主线程

4、主线程开始继续运行,at_send_commandxx()函数返回,最终调用RIL_onRequestComplete()函数,处理response

5、通过pRI->pCI->responseFunction(p, response, responselen);调用每条request命令对应的response函数,对response数据打包,如:

  

6、最后调用sendResponse()将打包好的数据写入socket,发送给上层ril-java


[edit]二、unsolicited response流程


1、与一般的response不同之处在于processline()的处理,如果是unsolicited消息,调用handleUnsolicited(line)进行处理;

2、再调用Reference-ril.c的onUnsolicited()方法对unsolicited消息进行解析,如下所示:



3、RIL_onUnsolicitedResponse(int unsolResponse, void *data,size_t datalen),处理response所有的unsolicited response 命令也都在ril.h中有定义,RIL_UNSOL_RESPONSE_xxx,从1000开始:

  #define RIL_UNSOL_RESPONSE_BASE 1000
 #define RIL_UNSOL_RESPONSE_NEW_SMS 1003
 #define RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT 1004

4、所有的unsolResponse对应的处理函数都按顺序定义在hardware\ril\libril\ ril_unsol_commands.h


5、如顺序图所示:RIL_onUnsolicitedSendResponse()函数将根据RIL_UNSOL_RESPONSE_xxx命令,调用其相应的responsexx()方法,对response处理,对数据进行打包

6、与一般response处理流程一样,调用sendResponse()将打包好的数据写入socket,发送给上层ril-java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值