说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android GSM驱动模块详细分析

HTML文档下载 WORD文档下载 PDF文档下载
本文详细介绍了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函数,主要完成三个任务:
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中。

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机制便能响应处理了。到这里启动流程已经分析完毕。

 

 

OpenStack将提供对Docker的支持 Facebook Q1财报:营收25.02亿美元、59%来自于移动 黑客们盯上了卫星,IOActive的惊人发现 开发汽车应用之前,你必须了解的7件事 埃森哲:智能电视潮流,势不可挡 直接拿来用!Facebook移动开源项目大合集 高大上Hadoop技术培训:Hadoop在企业中的应用实战 【走近讲师】新浪丛磊:通过MAE构建企业内部私有PaaS平台 API增长新趋势 消息应用类独占鳌头 软件项目为何会失败? 严澜:搭建高可用的MongoDB集群(二) 微软、思科、Google、Facebook等联合推出CII 狙击“Heartbleed” 这是个神奇的国度:细数五大印度裔IT牛人CEO Atmel CMO Sander Arts眼中的创客运动 Unity“三巨头”:全心全意为开发者服务 全球移动广告现状报告:哪种平台、应用最赚钱? 《近匠》Smart Wallit,钱包找不到了?给它“打个电话”吧 Mozilla新CTO:JavaScript、 Firefox OS专家Andreas Gal 李彦宏发布百度大数据引擎,及与谷歌、亚马逊等类似项目对比 大数据领域,实时打击欺诈犯罪的4个战场 一周消息树:谷歌Project Ara,将开启下一个智能手机时代 数据恢复服务商的6个最佳实践 【走近讲师】谭晓生:魔高一尺道高一丈,360基于大数据的网络攻击检测 一周热点:摩尔定律让位于贝索斯定律 阿里巴巴集团CTO王坚确认出席第六届中国云计算大会 【走近讲师】青云甘泉:混合云的构建及其对企业的帮助 RadiumOne创始人兼CEO因家暴被公司解雇 3D打印狂潮:可检测皮肤疾病的低价手机显微镜 浅谈导航设计,开发者必备的十大实用技巧 【云先锋 41】上海越诚:基于云服务的建站类iService软件超市 董西成:Hadoop将在高速发展和完善中扩大优势! 怎么批量插入数据 大家都来看看吧,顺便散点分 我的FLASH在没有装FLASH的IE怎么不可以自动下载FLASH? linux 断电后,启动失败,该如何处理!? 初级菜鸟问题,求助 终于解封了,多谢没头脑,偶以后再也不倒粪和刷屏了! 各位大侠,救命!亟待解决! 如何使一个数据库用户的所有对象只读,不可写? 有没有DOS很熟的仁兄?纯DOS下和WIN NT4.0联网 怎样动态生成一个adoquery,并能进行数据库查询,小妹急用,100分奉上 怎么转换这个SQL Server的存储过程为oracle的 多语言数据库的应用程序,象DBGRID字段里的这些标题我应放在哪里好? 最简单的语句,最奇怪的问题。&&&&&&& 在线等待!!! D3D的简单问题 如何控制LineTo划线的颜色和宽度? 高分求《面向对象分析与设计》杨正甫编这本书下载地址。。。 学习DELPHI用铁道出版的乔林《参透Delphi/Kylix》 如何? 请问是否有比较简便的方法可以知道,程序中哪些变量定义完后根本不用? 按钮提交并链接不同页面的问题。 简单的问题 请教VC++高手:在MFC中,如何把剪贴板中的位图按原比例打印出来? 分不够再加! 怎么样在vb中读取bmp的位图信息,将图中所有黑颜色的象素 谁在20分钟内答出以下问题能拿高薪 如何修改注册表的键的默认键值? WINXP开始运行宽带播号程序缓慢,什么原因? newwish2 给我一个例子,邮箱:make_a_wish@163.com!!!着急呢!! evc4.0中文显示的问题! struts--html:select 为何出不来? 讨论:关于WinXP下开发的COM+的分发问题!! 菜鸟的小问题!! 一个关于东芝笔记本的故障 请问JBuilder错误提示:cannot access directory javax\mail at line 7, column 1 CSDN的速度越来越慢了,来这里的高人也越来越少了! 有没有DOS很熟的仁兄?纯DOS下和WIN NT4.0联网 小小问题!!! 困扰我多时了。。。 sybase 在程序中连接的问题。急,我咨询Sybas公司也不行。 按钮茶馆开张啦,有闲的进来聊天吧~ 小問題 PhoebusApollo(sunny) 你说要开贴,又没分,我有,给你100分,进来领吧!呵呵,不用谢!:) 关于DBGridEh排序的问题,急急急!!! ora-12224错误,tns no listener错误 !在线等待 ,急~! 求助jb9的破解 报表问题,急呀,救命呀~~~55555~~~~ 500分求解决一个问题 在线等待 解决立即给分 2003下为什么我的声卡不能用? 在程式AAA.PRG中如何修改表的字段的類型,比如字段C類型改為N類型??很急!!! 为什么有时候成员函数或变量显示不出来 救命!我在程序中使用webbrowse控件………… 在线等待。 也许是一个很简单的问题! 连接mysql出错 寻关于工控的中英文对照资料 说人一定会犯错误的格言 4秒末的瞬时速度与第4秒内的平均速度是一回事吗?大小相等吗? 秋月月月月台上赏月 夏天天天天井中聊天 这副对联综合运用了( )和( )格式,读来非常有趣. 告诉我成语是什么 精确数位与有效数字问题1、请帮忙回答下面几题的精确数位和有效数字:(1)5千万(2)5000万(3)5*10^3万(4)5.000*10^3万(5)5*10^3(6)5*10^-3万2、有效数字的定义:从左边第一个不是零的数字直到有效数 秋月月月月台上赏月 夏天天天天井中聊天 .怎么读?请用||画出停顿 关于犯错误的名言半个小时后我要!100分,快啊. 缩句可爱的小演员差点在台上跌倒 缩句是啥呀?急 仿写;秋月月月月台上赏月 夏天天天天井中观天 用边长为30厘米的正方形铁片从四角各截去一个边长相等的小正方行,折成一个无盖的长方体,最大容积为多少? 一般地怎样确定两个近似数的和所精确的数位答好了,答不好,没分 秋月月月月台上赏月 找关于犯错误名言、事例.关于犯错误(撒谎)名言、犯错(撒谎)的事例.名言和事例最好是同一个人的!越多越好,事例字数不要太多! 精确数位与有效数字30/19精确三位有效数字 如图,设a.b.c.d∈R,求证,对于任意p.q∈R,有: 汉武帝时期为什么能够对匈奴用兵,彻底解决了匈奴对西汉的威胁? 在哲学上来讲,什么事因果联系啊? 关于解析几何方法理论上是否所有平面几何问题都可以用解析几何建系方法解决?举个例子,比如梅内劳斯定理和塞瓦定理,托勒密定理等 已知:如图,菱形ABCD中,角BAD=120度,动点P在直线BC上运动,作角APM=60度且直线PM与直线CD相交于...谢谢大家了 这世界上到底有没有哲学的存在,是不是哲学这东西就像人们遇到不能解释的事情一样,只能用很虚幻的东西解 培优班补习班用英语怎么说 六至十题初中英语填空题谢谢大神进 如图,菱形ABCD对象线相交于O,∠ABC=120°,P为对角线AC上的一点,∠MPN的两边PM、PN与菱形边AD、CD分别相交于M、N,且∠MPN=60°(1)当点P与点O重合时,求证:AM+CN=跟号3 AO(2)点P在线段OA上(不与点A 哲学上为什么说世界上没有绝对静止的事物?老师上课讲的没听明白 请问谁知道这是什么糖呀?亲戚家拿来的糖 挺好吃 有人知道是什么牌子的吗 我想她们会和我一样喜欢你的.翻译成英文 描写人物,动作,神态,语言的句子 谁知道这个是什么糖啊?给个名字,牌子什么的啊!具体哪个牌子的知道吗? 英语翻译下周TALK SHOW,我想念给全班人听一次次翻看你发来的短信,我确定我在乎一次次打开你的空间,我确定我在乎一次次因你更新日志,我确定我在乎因为你一句不经意的话,心情跌宕起伏,我 任何两个数位之间的进率都是10?是对是错? 初中英语综合填空题!Jiaozi is the Chinese name of dumplings.We have all kinds of dumplings 1 meat of vegetables.Jiaozi is very 2 with us,especially during the Spring Festival.People usually eat jiaozi on New Year's Eve or the next morning.3 d 求概率密度 谢谢😊第六题 在三角形abc中 a=c+90度,sinA+sinC=根号2sinB求角C 老人与海的道理,结合现实 ssat 测试题谁有ssat模拟题, 精湛是什么意思 函数f(x)=(m2 -2m-2)x∧m2+m-3是幂函数,且当x∈(0,+∞)时,f(x)=是增函数,求f(x)=的解析式 ssat练习题 幂函数,a为根式时图像规律 WORD中破折号太短如何才能用一个占据两个空格的破折号,占两个空格的中间有分隔号,不想要,画直线吧,我的这个稿中许多,有点麻烦. 求积分,第二题和第三题,学到分部积分时老师留的作业, 精湛的意思急 已知直线l1∥l2,直线l3和直线l1、l2交于点C和D,在C、D之间有一点P,如果P点在C、D之间运动时,问∠PAC, 为什么求概率密度就是求所在区域的积分面积? "精湛"的意思. 给下列破折号选择恰当的解释填空1.必须大扫除一次,还要把鸡、鱼、青菜、年糕什么的都预备充足——店铺多数正月初一到初五关门,到正月初六才开张.( ) 2.他是一位好人------一位实实在 考ssat可以背哪些书?手头上都是和tofel有关的(词以类记之类的),ssat对于单词量要求比tofel高还是低? “精湛”是什么意思还有“古朴” 3秒前指?最后3秒指?3秒末指? 推荐几本考ssat的练习还有考ssat要注意些什么,麻烦说详细点、 精美的意思是什么 如图,直线AC∥BD,直线L1、L2分别交AC、BD于A、C、B、D,点P在直线L2上(异于C、D).设∠PBD=α、∠PBD=β∠APB=γ1.当点P在线段CD上时,请先补全图形,然后猜想α、β、γ之间的数量关系,并证明你的猜想!2. 我国近10年GDP详情要求从2000年开始,详细列举各GPD结构组成,详细程度如:2004年文化产业收入占GDP的2.15%.高估了.嫌分少我再加 java判断一个数位数及是否是回文数 一商店将76件商品出售给33位顾客,每位顾客最少买1件,最多买3件.买一件不打折,买2件9折优惠,买3件8折优惠,结果相当于全部商品按照八五折优惠.问买3件和买2件的顾客有多人?可设原价为a元 不 以山为话题写作文要散文的哈! java判断一个数位数及是否是回文数.doc 如图,直线AC∥BD,直线L1、L2分别交AC、BD于A、C、B、D,点P在直线L2上(异于C、D).设∠PAC=α、∠PBD=β,∠APB=γ.1.当点P在线段CD上时,请先补全图形,然后猜想α、β、γ之间的数量关系,并证明你的猜 关于哲学与命运,因果的关系我现在有一个认识不知道究竟属不属于哲学范畴请老师前辈们指点就是关于命运,因果报应是属于哲学的还是宗教的.我一直相信所谓的因果报应,在我哲学观中 人 在三角形ABC中,角A,B,C的对边a,b,c,cos二分之C的平方=二分之根号三sinC.求角C的大小 商家应对中央禁令推便宜年历 省出回扣日本官员爆料:自卫队军演目标是攻击中一客机在蒙特利尔机场失火被迫疏散 致不想脱外套 美国3岁女童被托儿所长活日本一17岁少年将伙伴推下河 称没有在柬埔寨感受“今日中国”2014放假安排最早12月定 “只调两岸产业合作谋新局“有保有放”俄大胆盗贼偷警察大楼 部分武器及文件日媒:安倍上任后已打13次高尔夫 展德国拒绝为斯诺登提供庇护 避免影响德朴槿惠恐无意与安倍会晤 日方宣称极度美参众两院大佬不宽恕斯诺登 将派“安印尼巴厘岛男子咖啡地中发现2000多美国新泽西一商场发生枪击事件 暂无人英内阁会议为防监听禁用iPad 高官美新泽西州商场发生枪击 在场民众描述美国西部山区蕴含创业潜力 或成下一个美威州两飞机3000米高空相撞 11德国拒绝为斯诺登提供庇护 避免影响德美建议叙问题会议11月举行 不确信反全脸豪掷60万 王梓整容行踪曝光只要犹豫一会 好岗位就会被抢走小学新生报名首日 家长“拿号”报名达古冰山自行车赛7月开幕王清远就任成都大学校长未来数十年 成都房地产进展更深入央行两个月内再度“定向降准”银行抢存款:大客户吃喝拉撒全包“花样爷爷”秦汉为躲摄像机和衣而睡第11代卡罗拉天津下线本月19日上市超过30款新车首发辐射西部成关键词换“心”前行 新BMW X1上市长安福特新蒙迪欧高尔夫公开赛启幕排名低林丹无缘世锦赛科技出力 时尚加码石鹰投资助力80后创业者做强“体检淘汰近半 架桥绘图都要学”天热 宠物易怒 老人小孩尽量躲远点把更多的资源配置到中小城市“好声音”联手“快男超女”一曲7唱世界杯临近 巴西总统梭边边
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘