文档详情

Android-RIL详细总结及流程图.ppt

发布:2018-12-25约2.87千字共31页下载文档
文本预览下载声明
Android Ril RIL执行流程 rild: main函数作为整个ril层的入口点,用dlopen打开libreference-ril.so库, RIL_startEventLoop();创建客户端事件监听线程。RIL_register()注册事件处理接口,并创建socket监听事件。 libril.so: 组成部分为ril.cpp,ril_event.cpp。主要完成同Framework层通信的工作,接受ril请求并传递给librefrence_ril.so, 同时把来自modem的response通过librefrence_ril.so的反馈回传给调用进程。 RIL_startEventLoop RIL_startEventLoop在ril.cpp中实现,它的主要目的是通过pthread_create(s_tid_dispatch, attr, eventLoop, NULL)建立一个dispatch线程,入口点在eventLoop. 在eventLoop中,会调ril_event.cpp中的ril_event_loop()函数,建立起消息队列机制。 具体步骤 进入RIL_startEventLoop后首先创建一个eventloop线程。建立起消息队列机制。 ril_event_init完成后,通过ril_event_set来设置一个新ril_event,并通过ril_event_add加入队列之中,add会把队列里所有ril_event的fd,放入一个fd集合readFds中。然后进入ril_event_loop()执行select(),这样 ril_event_loop能通过一个多路复用I/O的机制(select)来等待这些fd,如果任何一个fd有数据写入,则进入分析流程processTimeouts(),processReadReadies(rfds, n), firePending()。 RIL_register 1. RIL_register 注册一组函数指针 RIL_RadioFunctions 。 2. 打开接受上层命令的socket通道。 RILCore_Init RIL_Init被调用后首先通过参数获取硬件接口的设备文件。 接下来是创建mainLoop线程,并跳入到线程内执行。mainLoop会建立起与硬件的通信,然后等待硬件的主动上报或响应。 AT的response有两种,一是主动上报的,比如短信,来电等都不需要经过请求,有一unsolicited词语专门描述。另一种才是真正意义上的response,也就是命令的响应。 谢谢! * * Elvis hwangbelief@ RIL简介 RIL (Radio Interface Layer) RIL是Android 的无线接口层.负责提供电话服务.是上层应用和下层硬件modem之间的中间层。负责数据的可靠传输、AT命令的发送以及响应(response)的解析. Android的RIL驱动模块,在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分。 librefrence_ril.so: rild通过dlopen方式加载 librefrence_ril.so ,这是因为librefrence.so主要负责跟Modem硬件通信。这样做方便替换或修改以适配更多的Modem种类。它转换来自libril.so的请求为AT命令,同时监控Modem的反馈信息,并传递回libril.so。在初始化时,rild通过符号RIL_Init获取一组函数指针并以此与之建立联系。 在队列创建之前,利用pipe创建了一个无名管道,并且将管道的读端放入了select的队列中,将管道的写端放入了rilEventAddWakeup()中,rilEventAddWakeup()包含ril_event_add(ev);triggerEvLoop();两个函数, ril_event_add(ev)就是将事件加入到队列中,而triggerEvLoop()的作用就是将select函数唤醒,因为在这个函数中会向管道的写端写入数据,这样被select监听的管道读端就可读,那么select函数就会解阻。所以当有一个新的事件加入到队列中,那么就会用pipe的机制将新事件的文件描述符加入到select监听中。所以pipe的作用就是刷新select监听的内容。 当select监听到readFds中的某个文件描述符可读或者超时时,就会解除阻塞,执行 processTimeouts();
显示全部
相似文档