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