- 浏览: 31987 次
- 性别:
- 来自: 北京
最新评论
原文地址:http://blog.csdn.net/maxleng/article/details/5576637
Android电话系统之-rild
Rild是Init进程启动的一个本地服务,这个本地服务并没有使用Binder之类的通讯手段,而是采用了socket通讯这种方式。RIL(Radio Interface Layer)
Android 给出了一个ril实现框架。由于Android开发者使用的Modem是不一样的,各种指令格式,初始化序列都可能不一样,GSM和CDMA就差别更大 了,所以为了消除这些差别,Android设计者将ril做了一个抽象,使用一个虚拟电话的概念。这个虚拟电话对象就是 GSMPhone(CDMAPhone),Phon对象所提供的功能协议,以及要求下层的支撑环境都有一个统一的描述,这个底层描述的实现就是靠RIL来 完成适配。
Andoid将RIL层分为两个代码空间:RILD管理 框架,AT相关的xxxril.so动态链接库。将RIL独立成一个动态链接库的好处就是Android系统适应不同的Modem,不同的Mode可以有 一个独立的Ril与之对应。从这个层面上看,Rild更多是一个管理框架。
而ril是具体的AT指令合成者和应答解析者。从最基本的功能来讲,ril建立了一个侦听Socket,等待客户端的连接,然后从该连接上读取RIL- Java成传递来的命令并转化成AT指令发送到Modem。并等待Modem的回应,然后将结果通过套接口传回到Ril-Java层。下图是Ril-D的 基本框架:
下面的数据流传递描述图表描述了RIL-JAVA层发出一个电话指令的5 步曲。
在 AT通讯的过程中有两类响应:一种是请求后给出应答,一种是通知类,即为不请自来的,例如短信通知达到,我们称该类通知为URC。在Rild中URC和一 般的Response是分开处理的,概念上URC由handleUnsolicited@Atchannel.c处理,而Response由 handleFinalResponse来处理。
1 Event Loop
Rild 管理的真正精髓在ril.cpp,ril_event.cpp中,在研究的过程中,可以看到设计者在抽象上所下的功夫,设计得很优美。Event Loop的基本工作就是等待在事件端口(串口,Socket),一旦有数据到达就根据登记的Event回调函数进行处理。现在来看Ril设计者是如何建立 一套管理框架来完成这些工作的?
1.1 Event对象
Event对象构成:(fd,index,persist,func,param)
fd | 事件相关设备句柄。例如对于串口数据事件,fd就是相关串口的设备句柄 |
index | |
persist | 如果是保持的,则不从watch_list中删除。 |
func | 回调事件处理函数 |
param | 回调时参数 |
为了统一管理事件,Android使用了三个队列:watch_list,timer_list,pending_list,并使用了一个设备句柄池readFDS。
readFDS:是Linux的fd_set,readFDS保存了Rild中所有的设备文件句柄,以便利用select函数统一的完成事件的侦听。
watch_list:监测时间队列。需要检测的事件都放入到该队列中。
timer_list:timer队列
pending_list:待处理事件队列,事件已经触发,需要所回调处理的事件。
事件队列队列的操作:ril_event_add,ril_event_del, ril_timer_add
在添加操作中,有两个动作:
(1) 加入到watch_list
(2) 将句柄加入到readFDS事件句柄池。
1.2 ril_event_loop()
我们知道对于Linux设备来讲,我们可以使用select函数等待在FDS上,只要FDS中记录的设备有数据到来,select就会设置相应的标志位并 返回。readFDS记录了所有的事件相关设备句柄。readFDS中句柄是在在AddEvent加入的。所有的事件侦听都是建立在linux的 select readFDS基础上。
ril_event_loop 利用select等待在readFDS(fd_set)上,当select设备有数据时,ril_event_loop会从select返回,在 watch_list中相应的Event放置到pend_list,如果Event是持久性的则不从watch_list中删除。然后 ril_event_loop遍历pengding_list处理Event事件,发起事件回调函数。
1.3 几个重要的Event
上面分析了ril-d的框架,在该框架上跑的事件有什么
(1)s_listen_event- (s_fdListen,listenCallback)
listenCallback处理函数,
接收客户端连接:s_fdCommand=accepte(..)
添加s_commands_event()
重新建立s_listen_event,等待下一次连接
(2) s_command_event(s_fdCommand,ProcessCommandsCallback)
从fdCommand Socket连接中读取StreamRecord
使用ProcessCommandBufer处理数据
s_listen_event在大的功能上处理客户端连接(Ril-JAVA层发起的connect),并建立s_commands_event去处理Socket连接发来的Ril命令。ProcessCommandBufer实际上包含了Ril指令的下行过程。
1.4 下行命令翻译及其组织@ProcessCommandBuffer
RIL_JAVA传递的命令格式:Parcel , 由命令号,令牌,内容组成。RIL_JAVA到达RIL_C时转为构建本地RequestInfo,并将被翻译成具体的AT指令。由于每条AT命令的参数 是不同的,所以对不同的AT指令,有不同的转换函数,在此Android设计在这里做了一个抽象,做了一个分发框架,通过命令号,利用sCommand数 组,获得该命令的处理函数。
sComand[]={
<...>
}
sComand 存在于Ril_command.h中。
&sComand[]=
<
{RIL_REQUEST_GET_IMEI, dispatchVoid, responseString},
{RIL_REQUEST_DIAL, dispatchDial, responseVoid},
{….}
>
dispatchXxx函数一般都放在在Reference-ril.c中,Reference-ril.c这个就是我们需要根据不同的Modem来修改的文件。
1.5 send_at_command框架
send_at_command是同步的,命令发送后,send_at_command将等待在s_commandcond,直到有sp_response->finalResponse。
2 read loop@Atchannel.c
Read loop是解决的问题是:解析从Modem发过来的回应。如果遇到URC则通过handleUnsolicited上报的RIL_JAVA。如果是命令的应答,则通过handleFinalResponse通知send_at_command有应答结果。
对于URC,Rild同样使用一个抽象数组@Ril.CPP.
static UnsolResponseInfo s_unsolResponses[] = {
#include "ril_unsol_commands.h"
};
并利用RIL_onUnsolicitedResponse将URC向上层发送。
3 Ril-d的整体数据流及其控制流示意图
发表评论
-
Android核心分析(21)----Android应用框架之AndroidApplication
2012-02-13 14:34 719原文地址:http://blog.csdn ... -
Android核心分析(20)----Android应用程序框架之无边界设计意图
2012-02-13 14:31 847原文地址:http://blog.csdn ... -
Android核心分析(19)----电话系统之GSMCallTacker
2012-02-13 14:25 764原文地址:http://blog.csdn ... -
Android核心分析(18)-----Android电话系统之RIL-Java
2012-02-13 14:10 1091原文地址:http://blog.csdn.net/maxle ... -
Android核心分析(16)-----Android电话系统-概述篇
2012-01-31 14:39 846原文地址:http://blog.csdn.net/m ... -
Android核心分析(15)--------Android输入系统之输入路径详解
2012-01-31 14:22 797原文地址:http://blog.csdn.net/maxle ... -
Android核心分析(14)------ Android GWES之输入系统
2012-01-31 10:47 905原文地址:http://blog.csdn ... -
Android 核心分析(13) -----Android GWES之Android窗口管理
2012-01-31 10:44 749原文地址:http://blog.csdn ... -
Android 核心分析(12) -----Android GEWS窗口管理之基本架构原理
2012-01-31 10:27 986原文地址:http://blog.csdn.net/maxle ... -
Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理
2012-01-11 11:00 1321原文地址:http://blog.csdn.net/Droid ... -
Android核心分析 之十一-------Android GWES之消息系统
2012-01-10 14:09 629原文地址:http://blog.csdn.net/maxle ... -
Android核心分析 之十-------Android GWES之基本原理篇
2011-12-30 15:08 708原文地址:http://blog.csdn ... -
Android核心分析 之九-------Zygote Service
2011-12-30 15:02 705原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之八------Android 启动过程详解
2011-12-30 14:56 601原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之七------Service深入分析
2011-12-30 14:48 1083原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之六 -----IPC框架分析 Binder,Service,Service manager
2011-12-30 14:41 893原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之五 -----基本空间划分
2011-12-29 11:13 629原文地址:http://blog.csdn.net/maxle ... -
Android核心分析之四 ---手机的软件形态
2011-12-29 11:09 612原文地址:http://blog.csdn.net/maxle ... -
Android是什么 之三-------手机之硬件形态
2011-12-29 11:07 587原文地址:http://blog.csdn.net/maxle ... -
Android核心分析 之二 -------方法论探讨之概念空间篇
2011-12-29 11:03 540原文地址:http://blog.csdn.net/maxle ...
相关推荐
Android核心分析(17) ------电话系统之rilD
Android核心分析(17)----电话系统之rilD Android核心分析(18)----Android电话系统之RIL-Java Android核心分析(19)----电话系统之GSMCallTacker Android核心分析(20)----Android应用程序框架之无边界设计意图...
Android核心分析(17)----电话系统之rilD Android核心分析(18)----Android电话系统之RIL-Java Android核心分析(19)----电话系统之GSMCallTacker Android核心分析(20)----Android应用程序框架之无边界设计意图...
[经典文档]Android核心分析 核心分析之一 ----- 分析方法论探讨之设计意图 核心分析之二 ----- 方法论探讨之概念空间篇 核心分析之三 ----- 手机之硬件形态 核心分析之四 ----- 手机之软件形态 核心分析之五 ----- ...
Android 核心分析(17) ------电话系统之 rilD............................................................ 69 Android 核心分析(18)-----Android 电话系统之 RIL-Java........................................ ...
Android核心分析(17)------电话系统之rilD............................................................69 Android核心分析(18)-----Android电话系统之RIL-Java........................................76 ...
Android 核心分析( 17 ) ------ 电话系统之 rilD ............................................................ 69 Android 核心分析( 18 ) -----Android 电话系统之 RIL-Java .................................
[转]Android核心分析 技术专题之十七--电话系统之rilD
Android 核心分析(17) ------电话系统之rilD............................................................ 69 Android 核心分析(18)-----Android 电话系统之RIL-Java...........................................