`
isiqi
  • 浏览: 16485738 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android GSM驱动模块详细分析

阅读更多

第1页: Android GSM驱动模块(rild)详细分析

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函数,主要完成三个任务:
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函数。RIL_startEventLoop在ril.cpp中实现, 它的主要目的是通过pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL)建立一个dispatch线程,入口点在eventLoop. 而eventLoop中,会调ril_event.cpp中的ril_event_loop()函数,建立起消息(event)队列机制。

我们来仔细看看这一消息队列的机制,这些代码都在ril_event.cpp中。

void ril_event_init();
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);
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();
struct ril_event {
struct ril_event *next;
struct ril_event *prev;
int fd;
int index;
bool persist;
struct timeval timeout;
ril_event_cb func;
void *param;
};

每个ril_event结构,与一个fd句柄绑定(可以是文件,socket,管道等),并且带一个func指针去执行指定的操作。

具体流程是: ril_event_init完成后,通过ril_event_set来配置一新ril_event,并通过ril_event_add加入队列之中(实际通常用rilEventAddWakeup来添加),add会把队列里所有ril_event的fd,放入一个fd集合readFds中。这样ril_event_loop能通过一个多路复用I/O的机制(select)来等待这些fd,如果任何一个fd有数据写入,则进入分析流程processTimeouts(),processReadReadies(&rfds, n),firePending()。后文会详细分析这些流程。

另外我们可以看到, 在进入ril_event_loop之前, 已经挂入了一s_wakeupfd_event,通过pipe的机制实现的, 这个event的目的是可以在一些情况下,能内部唤醒ril_event_loop的多路复用阻塞,比如一些带timeout的命令timeout到期的时候。

至此第一个任务分析完毕,这样便建立起了基于event队列的消息循环,稍后便可以接受上层发来的的请求了(上层请求的event对象建立,在第三个任务中)。

接下来看第二个任务,这个任务的入口是RIL_Init, RIL_Init首先通过参数获取硬件接口的设备文件或模拟硬件接口的socket. 接下来便新开一个线程继续初始化, 即mainLoop。

mainLoop的主要任务是建立起与硬件的通信,然后通过read方法阻塞等待硬件的主动上报或响应。在注册一些基础回调(timeout,readerclose)后,mainLoop首先打开硬件设备文件,建立起与硬件的通信,s_device_path和s_port是前面获取的设备路径参数,将其打开(两者可以同时打开并拥有各自的reader,这里也很容易添加双卡双待等支持)。

接下来通过at_open函数建立起这一设备文件上的reader等待循环,这也是通过新建一个线程完成, ret = pthread_create(&s_tid_reader, &attr, readerLoop, &attr),入口点readerLoop。

AT命令都是以\r\n或\n\r的换行符来作为分隔符的,所以readerLoop是line驱动的,除非出错,超时等,否则会读到一行完整的响应或主动上报,才会返回。这个循环跑起来以后,我们基本的AT响应机制已经建立了起来。它的具体分析,包括at_open中挂接的ATUnsolHandler, 我们都放到后面分析response的连载文章里去。

有了响应的机制(当然,能与硬件通信也已经可以发请求了),通过RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0),跑到initializeCallback中,执行一些Modem的初始化命令,主要都是AT命令的方式。发AT命令的流程,我们放到后面分析request的连载文章里。这里可以看到,主要是一些参数配置,以及网络状态的检查等。至此第二个任务分析完毕,硬件已经可以访问了。

最后是第三个任务。第三个任务是由RIL_Init的返回值开始的,这是一个RIL_RadioFunctions结构的指针。

typedef struct {
int version; /* set to RIL_VERSION */
RIL_RequestFunc onRequest;
RIL_RadioStateRequest onStateRequest;
RIL_Supports supports;
RIL_Cancel onCancel;
RIL_GetVersion getVersion;
} RIL_RadioFunctions;

其中最重要的是onRequest域,上层来的请求都由这个函数进行映射后转换成对应的AT命令发给硬件。
rild通过RIL_register注册这一指针。

RIL_register中要完成的另外一个任务,就是打开前面提到的跟上层通信的socket接口(s_fdListen是主接口,s_fdDebug供调试时使用)。

然后将这两个socket接口使用任务一中实现的机制进行注册(仅列出s_fdListen)

ril_event_set (&s_listen_event, s_fdListen, false,
listenCallback, NULL);
rilEventAddWakeup (&s_listen_event);

这样将两个socket加到任务一中建立起来多路复用I/O的检查句柄集合中,一旦有上层来的(调试)请求,event机制便能响应处理了。到这里启动流程已经分析完毕。

clip_image002

分享到:
评论

相关推荐

    Android_GSM驱动模块(rild)详细分析(全)

    ### Android GSM驱动模块(rild)详细分析 #### 1. 基本架构及初始化 Android的RIL(Radio Interface Layer)驱动模块是Android系统中非常重要的组成部分之一,主要用于处理移动设备与网络之间的通信功能。它位于...

    Android的RIL驱动模块

    在 Android 系统中,RIL 驱动模块是 GSM 和 CDMA 两种模式的支持,它们分别对应不同的 Modem 设备和通信协议。 在 RIL 驱动模块中,rild 是主入口点,负责完成初始化和通信。libril.so 是 rild 的共享库,负责与...

    Android的RIL驱动模块启动流程

    本文将深入探讨Android RIL驱动模块的启动流程及其内部结构,重点分析RIL启动过程中的关键步骤与机制。 #### RIL模块概述 RIL模块位于Android硬件抽象层(HAL)中,主要用于实现应用程序与底层硬件之间的接口。在...

    深入详解AndroidGSM驱动模块.pdf

    在深入详解Android GSM驱动模块的过程中,我们聚焦于GSM驱动的核心机制——事件处理和请求的传递。事件处理机制是驱动程序中一个至关重要的部分,它确保了系统能够及时响应网络和用户界面的各种交互。 首先,事件是...

    Android 不同3g、4g模块兼容

    在Android系统中,3G和4G模块的兼容性是一个重要的技术问题,因为不同的模块可能需要特定的驱动程序和库支持。"Android 不同3G、4G模块兼容"这个主题主要关注如何确保Android设备能够顺利地与各种3G和4G通信模块协同...

    Android-framework详细分析[1]

    ### Android Framework 详细分析 #### 一、设计意图与研究方法论 在开始对Android框架进行深入探索之前,我们首先要明确为什么要研究Android及其框架层。Android不仅是一个移动操作系统,更是一个集成了各种技术和...

    Quectel_Linux&Android_CMUX_Driver_V2.0.1_Follow_ec20cmux_gsm0701

    《Quectel EC20 CMUX 驱动在Linux和Android系统中的应用详解》 在移动通信领域,Quectel公司以其高质量的...通过对CMUX技术的理解和驱动的详细解析,开发者能够更好地利用EC20模块的潜力,实现高效、稳定的通信功能。

    AndroidGSM驱动模块.pdf

    Android的GSM驱动模块是操作系统与手机硬件之间通信的关键组件,特别是对于处理无线电接口功能,如蜂窝网络连接。RIL(Radio Interface Layer)驱动在`hardware/ril`目录下分为三个部分:`rild`、`libril.so`和`...

    移远EC20的4G模块驱动程序源码

    总之,通过分析和使用这个压缩包中的源码,开发者可以学习到如何在Android和Linux平台上开发和优化4G模块驱动,从而为设备提供高效稳定的4G通信能力。这不仅涉及硬件层面的交互,还涵盖了操作系统级别的软件工程实践...

    华为3G模块驱动移植说明

    本文将详细介绍华为3G模块在Android平台上的驱动移植过程,包括准备工作、移植步骤以及注意事项等内容。 #### 二、准备工作 在开始驱动移植之前,需要进行一系列准备工作,确保移植过程顺利进行: 1. **硬件准备*...

    RK3288 android 5.1 EC20驱动

    本文将深入探讨"RK3288 android 5.1 EC20驱动"的相关知识点,这涉及到一个基于Rockchip RK3288处理器的Android 5.1系统,以及如何在其上集成EC20 4G模块的驱动程序。 首先,让我们了解核心组件: 1. **RK3288**: ...

    Android Telephony架构分析

    本文将详细介绍Android电信系统的架构,范围从应用层API一直到Linux操作系统中的无线模块驱动。值得注意的是,本文不会涉及底层的蜂窝基带硬件细节。 #### 二、架构概览 典型的移动电话软件平台(如LiMO、Qtopia等...

    Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)

    在Android生态系统中,"binaries"这个术语经常用来描述原始设备制造商(OEM)为特定设备编译的内核模块、驱动程序和其他二进制文件。这些文件对开发者和高级用户非常重要,因为他们可以用于自定义ROM的构建、设备的...

    gsm0710mux源码

    主程序负责初始化和管理其他模块,协议处理模块实现GSM07.10 MUX的具体算法,驱动接口模块则与硬件通信,调试模块用于输出日志,便于开发者分析问题。 2. **数据包处理**:在源码中,你会看到数据包的封装和解封装...

    LTE/TD-SCDMA/WCDMA/CDMA/GSM 模块产品

    下面将详细解析以上各个技术的关键知识点。 首先,LTE(Long Term Evolution,长期演进)技术是目前4G网络的核心技术之一,具有高数据传输速率和低延迟的优势。LTE FDD(频分双工)与LTE TDD(时分双工)是其两种...

    Android内核的简单分析+Android+内核

    - **常见驱动类型**:详细介绍几种常见的Android驱动类型,如网络驱动、输入设备驱动等,并讨论它们的功能和应用场景。 通过对这些核心知识点的深入分析,不仅可以帮助我们更好地理解Android内核的工作原理,而且...

    Android手机信号强度检测详细介绍

    在Android系统中,检测手机信号强度是通过与设备的无线电通信模块交互来实现的。Android定义了两种衡量信号强度的单位:dBm和asu。dBm是一个表示功率绝对值的单位,通常用来描述无线电信号的强度,而asu是Android...

    android__display框架分析

    ### Android Display 框架分析 #### 一、硬件架构分析 ##### 高通7系列硬件架构概述 根据所提供的信息,我们重点分析高通7系列的Display硬件架构,特别是MSM7200A平台。 - **A、MDP (Mobile Digital Processor)*...

Global site tag (gtag.js) - Google Analytics