Android GSM 驱动模块详细分析
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 解析等。(gprs 等
传输会用到的
MUX 协议等在这里并没有包含,也暂不作介绍。)
以下是详细分析,本文主要涉及基本架构和初始化的内容:
首先介绍一下
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 函数,主要完成三个任务: