android系统双模手机-RIL设计

一、             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命令,可以供上层调试,同时也可检验解析的正确性。

你可能感兴趣的:(android,框架,socket,手机,MTK,电话)