一、 RIL介绍
无线接口层(Radio Interface Layer)简称RIL,是AP与Modem连接的管理层。它用于管理AP与Modem之间一对一的响应以及Modem主动上报命令,以及控制Modem硬件的驱动。
Android的Radio Interface Layer (RIL)提供了电话服务和radio硬件之间的抽象层。负责数据的可靠传输、AT命令的发送以及response的解析。应用处理器通过AT命令集与Modem模块通信。
二、 Android RIL架构
三、 Android的ril包括JAVA框架和C框架两部分。
四、 对于RIL的java框架部分,被分成了两个部分,一个是RIL模块,这个模块主要用于与下层C框架部分的rild进行通信,另外一个是Phone模块,这个模块直接暴露电话功能接口给应用开发用户调用。
五、 C框架部分为整个RIL的核心,称为RIL的本地代码。google提供了deamon,MTK对这部分进行了修改,并封装成库。
六、 Java层与RIL本地代码的接口,是名为“rild”的Socket,该Socket是电话服务命令的收发通道;而负责处理与RIL本地代码通信的是RIL.java。
七、 Android的RIL本地代码位于Android/hardware/ril文件夹,有三个子模块:rild, libril , reference-ril
include文件夹:
包含RIL头文件,最主要的是ril.h
●rild文件夹:
RIL守护进程,开机时被init守护进程调用启动,里面仅有main函数作为入口点,负责完成RIL初始化工作。
●libril文件夹:
在编译时libril被链入rild,它为rild提供了event处理功能(类似于消息队列),还提供了在rild与reference-ril之间传递请求和响应消息的能力。
●reference-ril文件夹:
编译成libreference-ril.so,完成从具体电话服务命令到实际的AT命令之间的转换,也就是负责解释上层的命令。它同时完成对AT端口的监控、读取并解析响应信息,以及主动上报的信息。
三、双网双待的RIL设计
如图3的Android电话部分的主体框架,双网双待的RIL设计有以下几种方案:
3.1 双模共用RIL
这种方案使用现有的Android RIL,先不区分G网和C网的AT命令,使所有的request通过RIL.JAVA,RILD,然后在RIL driver进行端口区分,G网的AT命令给G网端口,C网的AT命令给C网端口。
MTK在Windows Mobile双模手机使用的是该方案,工作量和难度相对较小。但这种方案需要透彻的理解 AT命令的处理机制,以及电话短信的业务模型,才能完成电话短信的状态机的处理。同时,受限于系统提供的开发接口,MTK平台对C框架基本全部封装,无法实现。
3.2 双模各建RIL
这种方案新增一套RIL,上层直接与各自独立的RIL交互,电话短信的状态机以及并发处理在上层就直接控制,灵活性较强,双模Feature Phone与这种方案更类似。
在界面上MTK Andriod已经支持双卡gemini版本,对UI的开发相对容易很多,但需要为C网模块开发或移植一套RIL,在RIL的工作量较大。
在Android系统,双模各建RIL,同时也有两种方法:
方法一:相互独立的框架,即JAVA和C框架同时区分,RIL.java需要新增,CommandInterface接口需要新建。
方法二:使用相同的JAVA框架,通过socket区分消息流。在MTK双卡版本使用的是方法二,在双模手机可以沿用这种方法,工作量相对较小。
四、RIL移植及Modem控制
4.1 RIL移植
RIL移植工作量主要在C框架部分,JAVA框架部分使用MTK 卡SIM2的socket建立方法。如图6,同Feature Phone有很多相似的地方,libril先使用IO多路转接技术实现消息队列,通过socket发送的命令解析出request info,这里先挂入队列,利用表驱动的方式分派。Reference ril根据分派的回调函数组装AT命令并发送,所不同的是在Andriod里挂入队列的不是完整的AT命令,而是先有一个onRequest()的过程。
这里需要注意以下几点:
1. RIL.java里的CommandInterface接口(相当于Feature Phone各消息结构体的数据组装与解析)需要上层与底层共同商议,这里是工作量比较大的地方。具体按模块可以分为通话,电话本,短信,彩信,RUIM卡等。建议上层牵头完成。
2. 表驱动的各个列表尽量顺序一致,对每一个request检查是否有response回调。
3. 短信格式解析单独做处理,这里是后续定制的重点区域。
4. RIL driver实际有一层对EVDO进行驱动适配,MTK原先定义为ECI(EVDO控制接口)层,在Android里实际是一个硬件抽象层,建议单独列出来。
5. 对新建的RIL建立模拟器适配,启用定时器,定时返回一个AT命令对应返回的响应,以便上层进行调试。建议对CommandInfo结构体
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p,struct RequestInfo *pRI);
int (*responseFunction) (Parcel &p, void *response, size_t responselen);
#ifdef 双网双待
…
#endif
}CommandInfo;
进行扩展,加入模拟器的响应,根据request号返回AT命令,可以供上层调试,同时也可检验解析的正确性。