10大优享服务
62项会员特权

Android应用中的GSM模块 安卓gsm驱动模块分析

发布时间:2021-12-01 02:50:07     阅读次数:13996次     评论数:0次
    Android的RIL在这里被做成一个叫做rild的库,通过一个系统环境变量ro.radio.noril是否为空来决定要不要把RIL的代码编译进内核,这点跟CE的编译方式是一样的,如果设置了该变量,将会有个"SimulateCommand"的玩意编译进内核,它可以在没有实际GSM硬件的情况下模拟部分实际硬件的指令,然后让RIL驱动提供给上层Android应用,如果没有设置该系统环境变量就会采用RIL。
    Android的RIL驱动模块, 在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分,另有一radiooptions可供自动或手动调试使用。都依赖于include目录中ril.h头文件。目前cupcake分支上带的是gsm的支持,另有一cdma分支,这里分析的是gsm驱动。
Android应用中的GSM模块
  GSM模块,由于Modem的历史原因,AP一直是通过基于串口的AT命令与BB交互。包括到了目前的一些edge或3g模块,或像omap这类ap,bp集成的芯片,已经使用了USB或其他等高速总线通信,但大多仍然使用模拟串口机制来使用AT命令。这里的RIL(Radio Interface Layer)层,主要也就是基于AT命令的操作,如发命令,response解析等。
    以下是GSM Android应用开发详细分析,本文主要涉及基本架构和初始化的内容:
    首先介绍一下rild与libril.so以及librefrence_ril.so的关系:
    1. radiooptions:
    radiooptiongs通过获取启动参数, 利用socket与rild通信,可供调试时配置Modem参数。
    2. rild:
    仅实现一main函数作为整个ril层的入口点,负责完成初始化。
    3. libril.so:
    与rild结合相当紧密,是其共享库,编译时就已经建立了这一关系。组成部分为ril.cpp,ril_event.cpp。libril.so驻留在rild这一守护进程中,主要完成同上层通信的工作,接受ril请求并传递给librefrence_ril.so, 同时把来自librefrence_ril.so的反馈回传给调用进程。
    4. librefrence_ril.so:
    rild通过手动的dlopen方式加载,结合稍微松散,这也是因为librefrence.so主要负责跟Modem硬件通信的缘故。这样做更方便替换或修改以适配更多的Modem种类。它转换来自libril.so的请求为AT命令,同时监控Modem的反馈信息,并传递回libril.so。在初始化时, rild通过符号RIL_Init获取一组函数指针并以此与之建立联系。
    接下来分析初始化流程,主入口是rild.c中的main函数,主要完成三个任务:
    1. 通过RIL_Init获取一组函数指针RIL_RadioFunctions, 并通过RIL_register完成注册,并打开接受上层命令的socket通道。
    2. 开启libril.so中的event机制, 在RIL_startEventLoop中,是最核心的由多路I/O驱动的消息循环。
    3. 初始化librefrence_ril.so,也就是跟硬件或模拟硬件modem通信的部分(后面统一称硬件), 通过RIL_Init函数完成。
    GSM模块主要通过UART(串口)与处理器通信,所以在硬件上只需要将串口的两个引脚与处理器的串口连接,因为一般平台都提供有串口驱动,所以你只需要编写应用程序访问相应的串口设备,然后通过发送AT指令控制GSM模块即可,剩下的工作就是数据解析部分了。
    另外,你可以把单独的GSM模块通过串口直接与PC连接,在PC上可以通过串口调试助手等软件发送AT指令,这样你可以先熟悉GSM模块的使用,然后再编写相应的Android应用程序。
(一品威客 anyi)
本文地址:
来源:一品威客,转载须经版权人书面授权并注明来源

留言(0

↓展开留言

该攻略尚无留言记录