可能是我太笨了,总是建立不起一种纵览全局的思考方式,总是一头扎进代码的海洋里,然后在里面迷失不能自拔。就拿ril部分来说,看了几天了,有一些眉目,但是又讲不出来。看到人家的博客里面的总结,或者是流程图,状态图,类图,很是生动,自己在这方面的能力实在贫乏。
电话部分ril代码在路径/hardware/ril下
查看代码结构可以发现
./rild/ 主要执行守护进程的代码
./mtk-gsm-ril/ 等类似代码,即对应不同的模组的ril实现
./include/ ril库,定义了标准的ril命令,对应有不同的模组有不同的实现
./libril/ ril的通用函数库
1、守护进程的启动
a、读取命令行参数
b、开线程用作事件循环
c、注册回调函数
RIL_startEventLoop(void) @ril.cpp
1、初始化事件源
2、进入事件循环
事件循环用select实现,事件列表分三个,timer_list, watch_table, pending_list,不断将wtch_table, timer_list里面的事件移向pending_list里面做添加删除操作,事件源处理有:超时事件(processTimeout @ril_event.cpp),读等待的事件源(processReadReadies() @ril_event.cpp),最后调用回调进行处理(firePending() @ril_event.cpp)
两个重要的回调结构
59 static struct RIL_Env s_rilEnv = {
60 RIL_onRequestComplete,
61 RIL_onUnsolicitedResponse,
62 RIL_requestTimedCallback
63 };
这三个回调函数在ril.cpp里面实现,是注册到mtk-gsm-ril的,供其调用,注意这个顺序,是模组ril.cpp的,在mian @rild.c里面,有这样一条语句
rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
dlHandle是通过dlopen打开的动态库,寻找到里面的RIL_init函数进行初始化
先看RIL_onRequestComplete,
在等mtk-gsm-ril/处理完以后,会调用到那里
另外一个重要的回调结构是
79 static const RIL_RadioFunctions s_callbacks = {
80 RIL_VERSION,
81 onRequest,
82 currentState,
83 onSupports,
84 onCancel,
85 getVersion
86 };
这三个回调函数在mtk-gsm-ril里面实现,是注册到ril.cpp的,供其调用,跟上一个回调结构相反的顺序,而ril.cpp正式我们要打交道的。当接收到上层的命令的时候,经过分发之后,会调用到这里的onRuest。
---------------------------待续