Android电话系统rild-response analysis

来源:互联网 发布:centos安装桌面环境 编辑:程序博客网 时间:2024/05/07 11:10

本文将详细分析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

原创粉丝点击