Android RIL介绍

        android电话管理从下到上可以分为四层:硬件驱动层、RIL daemon层、Telephony框架实现层、 PHONE应用层,下层为上层提供服务,每层之间采用不同的通讯方式交互。RIL daemon层实现为单独的一个开机启动的进程(rild命令),通过AT命令与硬件驱动层交互,Telephony JAVA框架实现层包括一个RIL抽象层,RIL抽象层中通过一个本地socketRIL daemon层(rild)交互,PHONE应用层通过BINDER机制与Telephony框架交互。

本文着重介绍RIL部分:

1、RIL daemon层

daemon层的代码在/hardware/ril/下。具体各个子目录及文件的含义如下:

---/hardware/ril/

|--include/

||--telephony/

|||--librilutils.h

|||--record_stream.h

|||--ril.h    接口和数据结构(类型),定义了 N多RIL_REQUEST_XXXX宏,代表客户进程向Android telephony发送的命令,包括SIM卡相关的功能,打电话,发短信,网络信号查询等等。

|||--ril_cdma_sms.h    cdma sms

|||--ril_nv_items.h

|--libril/    主要负责与客户进程进行交互,在接收客户进程命令后,调用相应函数进行处理,然后将命令响应结果传回客户进程。在收到来自网络端的事件后,也传给客户进程。

||--ril.cpp    1)RIL_register函数:打开监听端口,接收来自客户进程的命令请求(s_fdListen   =android_get_control_socket(SOCKET_NAME_RIL);),当与某客户进程连接建立时,调用listenCallback函数;创建一单独线程监视并处理所有事件源(通过ril_event_loop)。  2) listenCallback函数:当与客户进程连接建立时,此函数被调用。此函数接着调用  processCommandsCallback处理来自客户进程的命令请求。  3) processCommandsCallback函数:具体处理来自客户进程的命令请求。对每一个命令,ril_commands.h中都规定了对应的命令处理函数(dispatchXXX),processCommandsCallback会调用这个命令处理函数进行处理。  4) dispatch系列函数:此函数接收来自客户进程的命令己相应参数,并调用onRequest进行处理。  5) RIL_onUnsolicitedResponse函数:将来自网络端的事件封装(通过调用responseXXX)后传给客户进程。  6)RIL_onRequestComplete函数:将命令的最终响应结构封装(通过调用responseXXX)后传给客户进程。  7)response系列函数:对每一个命令,都规定了一个对应的response函数来处理命令的最终响应;对每一个网络端的事件,也规定了一个对应的response函数来处理此事件。response函数可被onUnsolicitedResponse或者onRequestComplete调用。

||--ril_commands.h    RIL命令列表

||--ril_event.cpp/.h    处理与事件源(端口,medom等)相关的功能,ril_event_loop监视所有注册的事件源,当某事件源有数据到来时,相应事件源的回调函数被触发(firePending-> ev->func())。

||--ril_ex.h

||--ril_unsol_commands.h    RIL主动上报消息列表

||--RilSapSocket.cpp

||--RilSapSocket.h

||--RilSocket.cpp

||--RilSocket.h

||--rilSocketQueue.h

|--librilutrils/

||--librilutils.c

||--record_stream.c

|--reference-ril/    主要负责与medom进行交互

||--at_tok.c

||--at_tok.h

||--atchannel.c    负责向modem读写数据。at_send_command_full_nolock函数:运行在主线程里面。将一个ATcommand命令写入modem后进入睡眠状态(使用pthread_cond_wait或类似函数),直到modem读线程将其唤醒。唤醒后此函数获得了ATcommand的最终响应并返回。 readerLoop函数运行在一个单独的读线程里面,负责从modem中读取数据。读到的数据可分为三种类型:网络端传入的事件;modem对当前ATcommand的部分响应;modem对当前AT command的全部响应。对第三种类型的数据(ATcommand的全部响应),读线程唤醒(pthread_cond_signal)睡眠状态的主线程。

||--atchannel.h

||--misc.c

||--misc.h

||--reference-ril.c    此文件核心是两个函数:onRequestonUnsolicited。onRequest 函数对每一个RIL_REQUEST_XXX请求,都转化成相应的ATcommand,发送给modem,然后睡眠等待。当收到此ATcommand的最终响应后,线程被唤醒,将响应传给客户进程(RIL_onRequestComplete-> sendResponse)。onUnsolicited函数处理modem从网络端收到的各种事件,如网络信号变化,拨入的电话,收到短信等。然后将时间传给客户进程(RIL_onUnsolicitedResponse -> sendResponse)。

||--ril.h

rild/

||--radiooptions.c    调试时配置medom参数

||--rild.c    守护进程

后续http://www.cnblogs.com/bastard/archive/2012/11/05/2755193.html

2、Java中RIL抽象层(未完)

RIL抽象层的代码在frameworks/opt/telephony/src/com/java/com/android/internal/telephony/RIL.java,它其实就是给java的一个调用接口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值