七、RilProxy
对于MTK平台,在RILC与RILJ之间,有一个RilProxy层。
之所以要使用proxy,一个好处是在上层,不仅仅是RILJ与RILC通过Socket连接,还有其他地方也可以与RILC连接,来向下才层Modem通信,比如如可以通过终端ATCI接口直接向Modem发送命令。
另一个好处是proxy层的下层,可以自由选择切换其所对接的RILC层,因为对于不同的项目,所需要适配的RILC层不同,比如可以从默认切换到C2K RIL。
当然,proxy层的作用不仅仅连接上层和下层的中介,而且也可以在其中进行一些消息的过滤操作,如当Radio unavailable 时,就可以过滤一些需要Radio工作的request。
关于RilProxy的结构,其实和RILC差不多,也是分为LibRIL层和MtkRIL层。可以说在LibRIL层,他们是完全相似的,只是RilProxy在这里直接监听了RILJ的Socket接口。那么关于RilProxy从Socket句柄监听,建立流套接字,处理流套接字的流程就不在此说明,详细流程可以参考第二章。
7.1 RilProxy层处理流程
与之前说的RILC不同的是,在RILProxy中,从LibRIL调用MtkRIL回调函数onRequest这一步开始,它的流程就开始了不同。因此,我们就从这个地方着手来分析其流程。
先来一张总体的流程图:
首先来回顾一下RILC的onRequest函数,它通过不同的request码来判断,最后使用不同函数来预处理请求,最终将请求解释成AT命令并发送到AT通道。
如下代码,来看RilProxy层的onRequest函数:
1. 首先在ril_callbacks中直接将request发到了Rfx中,Rfx是处理不同的request,并将其发送到不同socket的模块,其代码主要在/ril/rilproxy/mtk-rilproxy/framework/core/
目录中。
2. Rfx中有一个是属于dispatch thread的dispatch queue。Rfx先将request封装成Message对象并放入dispatch queue中,在dispatch thread会有一个looper读取dispatch queue的Message,并将其分发到main thread,让main thread的Looper去处理。
//ril_callbacks.c
static void
onRequest (int request, void *data, size_t datalen, RIL_Token t){
//Radio不可用,过滤request
if (radioState == RADIO_STATE_UNAVAILABLE &&
request != RIL_REQUEST_OEM_HOOK_RAW && //This is for ATCI
...){
}
//添加到请求队列
rfx_enqueue_request_message(request, data, datalen, t, socket_id);
}
//Rfx.cpp
void rfx_enqueue_request_message(int request, void *data, size_t datalen, RIL_Token t,
RIL_SOCKET_ID socket_id) {
//添加到请求队列
dispatchThread->enqueueRequestMessage(request, data, datalen, t, socket_id);
}
//RfxDispatchThread.cpp
void RfxDispatchThread::enqueueRequestMessage(int request, void *data, size_t datalen,
RIL_Token t, RIL_SOCKET_ID socket_id) {
RequestInfo *requestInfo = (RequestInfo *)t;
...
//使用请求数据购进R分析Message对象
sp<RfxMessage> msg = RfxMessage::obtainRequest(socket_id, dest, request, requestInfo->token,
parcel, t);
//构建MessageObj
MessageObj *obj = createMessageObj(msg);
//将消息添加到了dispatchRequestQueue中
dispatchRequestQueue.enqueue(obj);
}
// RfxDispatchThread.cpp
extern "C"
void *rfx_process_request_messages_loop(void *arg) {
while (1) {
RfxDispatchThread *dispatchThread = (RfxDispatchThread *) arg;
dispatchThread->processRequestMessageLooper();
}
return