RIL层源码分析w

2019-09-01 20:03

RIL层源码分析2

@杜少峰

写在前面 ................................................................................................................................................................................ 1 从Main函数开始的故事 ...................................................................................................................................................... 2 一、Event机制 ...................................................................................................................................................................... 4

1.1、Event框架 ............................................................................................................................................................. 4 1.2、EventLoop的搭建过程 ......................................................................................................................................... 7

1.2.1、Event初始化过程 ...................................................................................................................................... 7 1.2.2、Event循环的过程 ...................................................................................................................................... 8

二、reference库的加载 ...................................................................................................................................................... 10

2.1、reference中readerLoop建立和循环过程 ........................................................................................................ 11 2.2、URC消息处理流程.............................................................................................................................................. 14 2.3、非URC消息处理流程......................................................................................................................................... 19 三、一个完整的过程 .......................................................................................................................................................... 22

3.1、Eventloop把RILJ命令发送给reference库 ...................................................................................................... 22 3.2、reference将Eventloop的数据发送到Modem................................................................................................. 29 3.3、reference通过readerLoop得到Modem回应后把数据返回给Eventloop .................................................... 36 3.4、Eventloop把数据返回给RILJ ............................................................................................................................. 44 四、一些重要概念 .............................................................................................................................................................. 48

4.1、s_commandcond ................................................................................................................................................. 48 4.2、s_unsolResponses ................................................................................................................................................ 48 4.3、RequestInfo .......................................................................................................................................................... 49

写在前面

1、本文是基于Android原生代码展开的分析。而MTK只是在此框架上做了双卡的补充(差别不大)。 2、本文从宏观的角度去分析问题,因此忽略了一些非主线的函数。

3、同理,对于函数内部非主要的逻辑部分,也采取了省略。

4、受限于知识的积累和理解能力,文中描述如有分析不妥之处,希望能够得到大家更正。

从Main函数开始的故事

Android的智能机架构是应用处理器+基带芯片,也就是AP+Modem的模式,AP部分相当于CPU,Modem相当于网卡,而且每个厂商使用的Modem都有可能不一样。每种通讯协议如GSM/CDMA又有很大的不同,为了将所有的Modem抽象为统一的模式,因此Android搭建了RIL(Radio Interface Layer)层。在这个层的下面,每个厂商可以有自己不同的实现方式,但是经过RIL层协议的转换,就将所有的Modem抽象为统一的对象向上层负责。 RILC与上层的RILJ沟通方式是通过Socket传输数据与命令,而与底层Modem的信号传输是通过串口用AT命令来实现。

我们从RIL的入口开始分析。 @rild.c

int main(int argc, char **argv){

//连接库地址:/system/lib/libreference-ril.so

#define REFERENCE_RIL_PATH \ rilLibPath = REFERENCE_RIL_PATH; //切换UID为AID_RADIO

switchUser(); //打开链接库

dlHandle = dlopen(rilLibPath, RTLD_NOW); //开启EventLoop循环 RIL_startEventLoop();

//从链接库中(也就是reference-ril.c)寻找RIL_Init函数地址

rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, \ //调用reference-ril.c中的RIL_Init函数进行初始化INIT,同时得到reference-ril的回调函数 funcs = rilInit(&s_rilEnv, argc, rilArgv); //注册得到的reference的回调函数 RIL_register(funcs); }

从上面可以看出,入口函数主要完成了3个作用:

1、开启EventLoop循环,完成RIL与RILJ层数据交互(通过Socket)

2、打开动态库reference并构建ReaderLoop循环,完成RIL与Modem层数据交互(通过AT) 3、注册reference的回调函数

下面我们详细介绍具体流程。而在介绍之前,先把整个RIL层的数据流向用一张图片展示:

一、Event机制

1.1、Event框架

Event要做的就是循环检测EventLoop中添加的句柄池,如果在当前的句柄池中有任意一个句柄所代表的通道中有新的数据进来,就去处理当前的新数据。而在句柄池中最重要的句柄就是RILJ与RILC之间的Socket通道。

Event的实现主要在ril_event.cpp文件中。我们先来看一下一个标准的Event的构成: struct ril_event {

struct ril_event *next; struct ril_event *prev; int fd; int index; bool persist;

struct timeval timeout; ril_event_cb func; void *param; };

从上面的结构体可以看出,Event的管理是通过链表实现的,一些重要的成员变量的意义如下: fd:事件相关设备句柄。最重要的就是RILJ与RILC之间的Socket文件句柄 persist:说明当前的Event需要保持,不能从watch_table中删除 func:当前Event的处理函数

param:调用当前Event处理函数时的参数

接下来,我们在看具体的处理流程之前,先来看一下处理Event需要哪些函数: //Event的初始化,其实就是对3个主要链表的初始化 static void init_list(struct ril_event * list) //添加Event到链表

static void addToList(struct ril_event * ev, struct ril_event * list) //从链表删除Event

static void removeFromList(struct ril_event * ev) //从watch连表中删除某个Event

static void removeWatch(struct ril_event * ev, int index) //处理超时的Event static void processTimeouts()


RIL层源码分析w.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018年湖南省政府采购评审专家库培训测评-多选题部分答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: