没有合适的资源?快使用搜索试试~ 我知道了~
首页Android源码Telephony 框架设计解析
一、RIL 3 二、Telephony中多卡及多运营商设计区分 6 1.telephony中的多卡 7 1)AP区分多卡 7 2)modem区分多卡 12 2.telephony中的多运营商设计 14 三、Telephony中AIDL模式设计 15 四、Telephony中观察者模式设计 16 五、TelephonyRegistry监听模式设计 20 1.概述 20 2.以状态栏信号更新为例分析注册和更新过程【YETIM-1107】 20 1).注册过程 21 2).RIL上报监听回调更新过程 23 六、ServiceStateTracker/DcTracker/CallTracke 27 七、Telephony分析案例之检测不到SIM卡 27 八、手机驻网过程modem log 29
资源详情
资源评论
资源推荐
Telephony 框架设计解析
-----version:1.2
-----author:***
目录
一、 RIL .................................................................................................... 3
二、Telephony 中多卡及多运营商设计区分 ........................................... 6
1.telephony 中的多卡 .......................................................................... 7
1)AP 区分多卡 ................................................................................ 7
2)modem 区分多卡 ......................................................................12
2.telephony 中的多运营商设计 ........................................................14
三、Telephony 中 AIDL 模式设计 ............................................................15
四、Telephony 中观察者模式设计 .........................................................16
五、TelephonyRegistry 监听模式设计 ....................................................20
1.概述 ..................................................................................................20
2.以状态栏信号更新为例分析注册和更新过程【YETIM-1107】 ..20
1).注册过程 ..................................................................................21
2).RIL 上报监听回调更新过程 ....................................................23
六、ServiceStateTracker/DcTracker/CallTracke ........................................27
七、Telephony 分析案例之检测不到 SIM 卡 .........................................27
八、手机驻网过程 modem log ...............................................................29
本篇文档将从如下六个方面讲述 telephony 框架设计:RIL、多卡及多运营商
设计区分、不同运营商的 extends 继承实现、IDEL 的设计、观察者模式设计、
TelephonyRegistry 监听模式设计、ServiceStateTracker/DcTracker/CallTracker。
附上 Android Telephony 框架图
PS:
Android Telephony 采用了分层结构,共跨越了 4 层:
1.Telephony 应用,包括了 Phone、MMS 和 STK 等应用程序
2.Telephony 框架,提供 TelephonyManager,包含数据连接、通话、信息和 SIM
相关的 API
3.无线通信接口层(RIL),主要位于 User Libraries 层中的 HAL 层,提供 AP
(Application Processor)和 BP( Baseband Processor)之间的通信功能
4.Modem,位于 BP,主要负责实际的无线通信能力处理
一、 RIL
RIL 有 RILJ 和 RILC,RILJ 是我们所熟悉的 java 侧 RIL.java 代码,RILC 是
hardware/ril 目录下 C 代码,此处我们简单介绍下 RILC 模块的初始化和运行机理。
Android 的 RIL 驱动模块, 在 hardware/ril 目录下,一共分 rild,libril.so 以及
librefrence_ril.so 三个部分,另有一 radiooptions 可供自动或手动调试使用。都依
赖于 include 目录中 ril.h 头文件。目前 cupcake 分支上带的是 gsm 的支持,另有
一 cdma 分支,这里分析的是 gsm 驱动。
GSM 模块,由于 Modem 的历史原因,AP 一直是通过基于串口的 AT 命令与 BB
交互。包括到了目前的一些 edge 或 3g 模块,或像 omap 这类 ap,bp 集成的芯片,
已经使用了 USB 或其他等高速总线通信,但大多仍然使用模拟串口机制来使用
AT 命令。这里的 RIL(Radio Interface Layer)层,主要也就是基于 AT 命令的操作,
如发命令,response 解析等。
首先介绍一下 rild 与 libril.so 以及 librefrence_ril.so 的关系:
1. rild:
仅实现一 main 函数作为整个 ril 层的入口点,负责完成初始化。
2. libril.so:
与 rild 结合相当紧密,是其共享库,编译时就已经建立了这一关系。组成部
分为 ril.cpp,ril_event.cpp。libril.so 驻留在 rild 这一守护进程中,主要完成同上层
通信的工作,接受 ril 请求并传递给 librefrence_ril.so, 同时把来自 librefrence_ril.so
的反馈回传给调用进程。
3. librefrence_ril.so:
rild 通过手动的 dlopen 方式加载,结合稍微松散,这也是因为 librefrence.so
主要负责跟 Modem 硬件通信的缘故。这样做更方便替换或修改以适配更多的
Modem 种类。它转换来自 libril.so 的请求为 AT 命令,同时监控 Modem 的反馈信
息,并传递回 libril.so。在初始化时, rild 通过符号 RIL_Init 获取一组函数指针并
以此与之建立联系。
4. radiooptions:
radiooptiongs 通过获取启动参数, 利用 socket 与 rild 通信,可供调试时配
置 Modem 参数。
接下来分析初始化流程:
主入口是 rild.c 中的 main 函数,主要完成三个任务:
1. 开启 libril.so 中的 event 机制, 在 RIL_startEventLoop 中,是最核心的由
多路 I/O 驱动的消息循环。
2. 初始化 librefrence_ril.so,也就是跟硬件或模拟硬件 modem 通信的部分(后
面统一称硬件), 通过 RIL_Init 函数完成。
3. 通过 RIL_Init 获取一组函数指针 RIL_RadioFunctions, 并通过 RIL_register
完成注册,并打开接受上层命令的 socket 通道。
第一个任务流程图:
图一(RIL_startEventLoop 消息循环初始化)
rild.c中的main()
RIL_startEventLoop()
在 ril.cpp中
开启libril.so中的event机制
是最核心的由多路I/O驱动的消息循环
pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL)
建立一个dispatch线程,入口点在
eventLoop()在ril.cpp中
ril_event_loop(),ril_event.cpp中
建立起消息(event)队列机制
ril_event.cpp中包含的方法
void ril_event_init();
void ril_event_set(struct ril_event * ev, int fd...);
void ril_event_add(struct ril_event * ev);
void ril_timer_add(struct ril_event * ev, struct timeval * tv);
void ril_event_del(struct ril_event * ev);
void ril_event_loop();
ril_event_init()
在 ril_event.cpp中
配置一新ril_event
rilEventAddWakeup()
ril_event_loop能通过一个多路
复用I/O的机制(select)来等待这些fd
如果任何一个fd有数据写入,则进入分析流程
processTimeouts(), processReadReadies(&rfds, n),
firePending()。 后面会详细分析这些流程
ril_event_add()
在 ril_event.cpp中
将新ril_event加入队列之中
add会把队列里所有ril_event的 fd,
放入一个fd集合readFds中
至此第一个初始化任务分析完毕,
这样便建立起了基于event队列的消息循环,
稍后便可以接受上层发来的的请求了
(上层请求的event对象建立,在第三个任务中)。
第二个任务流程图:
图二(RIL_Init 硬件 modem 通信部分初始化)
main(),ril.c中
为 ril层的入口点
RIL_Init( ..)在reference_ril.c中
首先通过参数获取硬件接口的设备文件
或模拟硬件接口的socket. 接下来便新
开一个线程继续初始化
at_open( ..)在atchannel.c中
建立起这一设备文件上的reader等待循环,
这也是通过新建一个线程完成
ret = pthread_create(&s_tid_reader,
&attr, readerLoop, &attr),
即 mainLoop( ..)在reference_ril.c中
主要任务是建立起与硬件的通信,然后通过
read方法阻塞等待硬件的主动上报或响应
RIL_requestTimedCallback(initializeCallback,
NULL, &TIMEVAL_0),跑到initializeCallback中,执行
一些Modem的初始化命令,主要都是AT命令的方式。
readerLoop( ..)在atchannel.c中
注册一些基础回调(timeout,readerclose)
后,mainLoop首先打开硬件设备文件,建立起
与硬件的通信,s_device_path和 s_port是前
面获取的设备路径参数,将其打开
processLine( ..)
handleFinalResponse( ..)
剩余29页未读,继续阅读
qiang10086qiang
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2023年中国辣条食品行业创新及消费需求洞察报告.pptx
- 2023年半导体行业20强品牌.pptx
- 2023年全球电力行业评论.pptx
- 2023年全球网络安全现状-劳动力资源和网络运营的全球发展新态势.pptx
- 毕业设计-基于单片机的液体密度检测系统设计.doc
- 家用清扫机器人设计.doc
- 基于VB+数据库SQL的教师信息管理系统设计与实现 计算机专业设计范文模板参考资料.pdf
- 官塘驿林场林防火(资源监管)“空天地人”四位一体监测系统方案.doc
- 基于专利语义表征的技术预见方法及其应用.docx
- 浅谈电子商务的现状及发展趋势学习总结.doc
- 基于单片机的智能仓库温湿度控制系统 (2).pdf
- 基于SSM框架知识产权管理系统 (2).pdf
- 9年终工作总结新年计划PPT模板.pptx
- Hytera海能达CH04L01 说明书.pdf
- 数据中心运维操作标准及流程.pdf
- 报告模板 -成本分析与报告培训之三.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0