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

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

 

 

Apache CouchDB注入新鲜血液,整合分布式技术 CSS Shapes:Web设计人员的新工具 Android 4.3正式发布:四大新功能一览 史玉柱的创业经验谈 3G门户和GO桌面:海外推广的生意经 系统级编程语言性能大PK D语言成首选 解读Facebook第二季度财报 移动业务风生水起 如何避免失败,像Google一样玩转大数据 首届游戏运营技术论坛隆重开幕,共论大数据时代的游戏运营之道 OpenStack Swift遇到了Erasure Code 微软Win7 IE11开发者预览版发布 开始改进开发工具讨好开发者 个性化推荐服务商百分点宣布B轮融资1000万美金 全球著名互联网企业背后的开源力量 基础设施对决Facebook vs. Google:差距绝不是一点点 Amazon Q2财报同比转亏,但AWS反其道而行:高歌猛进! 开拓海外市场的两年:海外上线小技巧 SDCC 2013首批讲师名单出炉 一线工程师唱主角 [开源推荐] 跨平台的.NET运行环境 Mono 3.2发布 Heroku发布API平台Beta版 采用OAuth2.0安全授权 大数据时代:移动数据能为我们带来什么? iOS开发经验谈:如何提高应用开发效率? 贝索斯:你否定亚马逊的现在 我决定亚马逊的未来 谷歌新产品Chromecast:一夜之间价格从35美元飙至100美元 移动周报:苹果5周年限免神作,BADLAND开发者访谈 开源平台Cloud Foundry获IBM和百度支持,步入高速发展的“黄金期” GDK仍未发布 谷歌鼓励Glass开发者可提前用Android SDK开发 Adobe发布PhoneGap 3.0 支持命令行工具 初级vs.高级开发者 哪个性价比更高? 一周观察:Cloud Foundry生态圈渐成型 数据分析中的10个注意点,让你更了解用户体验、行为及需求 压不垮就奋行!Dropbox Datastore API给初创NimbusBase带来的启示 Nokia MobileSet中如何让手机识别中文? 注册表坏了怎么办? 大哥们,能否告诉小弟,在 ms sql server2000中如何修改 sa 用户的口令 我的超星不能用了!!! 十万火急:PDF文件修改 大哥们,能否告诉小弟,在 ms sql server2000中如何修改 sa 用户的口令.. 作为初学者,每天的问题太多了?帮我看一下下面的小问题 我上午53,下午58.该不会下马吧????/我相知道什么时候才能知道是否已经Pass,什么时候下证? 有关DELPHI6中使用SKINENGINE??? C++ Builder中多国语言的问题 在哪下载到Exchange 2000 Server Resource Kit? 快捷方式损坏怎样修复? bluesky069(菜鸟一族)你帮助我把那个PBL放到蛛蛛的信箱好不好呢?让大家都可以下在的! 请问哪里有w32dsm.exe的教程??? 潘译<>印刷错误百出,令人不忍卒读... LISTBOX的问题?请高手帮忙!!高分向送! 帮我想想这个主键该怎么建SQL SERVER7 如何将控件,恢复init()到初始状态 急救:装有SCO UNIX的硬盘克隆后不能启动系统,怎么办? 如何在FTP的目录下再新建目录?我初学网络编程, 怎样设置ScrollView中的ScrollBar不可见? 有关comboBox问题??????急!急!!! 有那位朋友对ADO控件调用T-SQL的链接服务器或存储过程的命令有所了解,或知道怎样取链接服务器的相关信息 真诚的向大家请教一个问题!!先谢谢了 redhat linux7.2安装完成后,怎么没有工具栏 已知manager是employee的子类,那么这么写Employee epy=new Manager()为什么合法? 第五次提出这个问题:如何通过DELPHI调用SQL SERVER 过程向SQL SERVER 存入图象。 为什么我在新闻聚焦中发表不了评论? 在VB里怎样用ADO存贮Access的Memo型字段? 誰有在PB下用powersock做的聊天程序? SQL的好书是什么呀?难道就没有人有体会? vb怎样格式化硬盘?? 做个《曹操传》之类的游戏需要多少投资? 关于sfc(系统文件扫描)的问题 高分求解,大虾请进 买了java程序员大本营的请进!!!! 请大家陈说学msce的前途 如何使用ProgressBar casting在java中是什么意思啊? querymode 查询器不稳定吧? 各位兄弟姐妹,在长沙拿3K是个什么水平,和沿海比怎么样,还需不需要跳槽? 想知道用程序免费发手机短信吗? 请问各位软友哪里有介绍C++Builder控件属性,方法和事件的资料。 高分相赠!!!求解我爱背单词2001共享版注册码!!! 我的XP不能上网了,添加163连接最后总说无法更新通讯簿,不能成功 如何添加纪录? 想学如何用程序发手机短信吗? 请问过滤条件filter怎么用?? 使用微软SQL Server的Select时,怎么写才能检索从N条-M条的记录(也就是说直接检索,而不是全部检索后取其中的一部分.) 如何通过程序得到系统的所有热键。谢您了。 关于CSICO防火墙515-R的问题?急 已知函数y=1/2sin(2x+π/6)+5/4 1.当函数y取最大值是求自变量x的集合,指出函数y=2sin(x/2+π/3)的图像是由y=sinx(x属于R)的图像经过重要的变化而得到的. 反函数的公式与运用方法? 五点作图法 几何作图法 函数y=|sinx|的最小正周期是多少 移动测速电子狗工作原理 固定测速预警原理了解了 那么移动测速原理是什么呢 哪位高手解答下 谢谢 3相4线120平方电缆1米多重? 函数y=sinx+2sin^3 x+3sin^5 x的最小正周期 塑料转子流量计的工作原理是什么? 120平方300米铜电缆180千瓦能用么 函数f(x)=sinx/2sin(π/2-x/2)的最小正周期是? 铜的电阻率是几? 120平方380电缆20米距离可多少千瓦中央空调用 函数y=|sinx/2|的最小正周期是 LZB玻璃转子流量计的工作原理是什么啊? 煤焦化产生的黄烟是什么物质 铜在0℃时电阻率是多少 反函数到底有几种表达式? 五点法作图一定要先列表吗? 银,铜,金的电阻率比较?银,铜,金的电阻率比较 gold (20 °C) 22.14 nΩ·m silver (20 °C) 15.87 nΩ·m copper (20 °C) 16.78 nΩ·m 说明在20度的温度下,银的导电性好于铜,好于金. 互为反函数的运算法则有什么关系 2.5平方电线可以承受多少安培电流?同样,多少瓦的功率? 函数y=cos(2x-3π/4)-2根号2sin^2x的最小正周期为 汽车的空气流量计坏了,发动机会出现什么问题?具体最好,谢谢 1平方的电线可以走几个安培的电流?同样1KW 大致走几个安培的电流? 求函数y=根号2sin(2x+4分之派)的周期和单调递增区间 汽车空气流量计有故障为什么会加不起油? 270平方电缆可以承受1000安培的直流电流吗 y=根号2sin(2x+π/4)+2 求函数的周期和单调递增区间,函数的图像经过怎样变换得到的? 汽车空气流量计有哪几种空气流量计主要有____._______.______.______四种~ 高炉喷煤热滞后现象是怎么回事? 铜的电阻率?一本书上写是0.0175温度20度,一本书写1.75*10的8次方,为啥? 汽车空气流量计空气流量计是做什么用的,国内有什么公司做这个东西做的比较好的. 单片机delay函数延迟时间计算,delay(80);为什么是600us左右?函数定义void delay(unsigned int t){while(t--);}主函数中delay(80);为什么是600us左右? 过水断面的概念? 汽车空气流量计作用? 120平方毫米铜电缆承受多少安电流 压缩空气流量计与水流量计怎样选择?我想选用一款空气流量计与一款液体流量计,气体流量计的工作压力5MPa,流量范围0.3-30m3/h,精度为1.0.水流量计的选用测量范围0.1-1m3/h,精度1.0.都有传感器连 已知功率,电压怎么计算需要多少平方的电线的公式 高炉上料为什么是不连续的 放了一批矿或者焦炭总要隔断时间才上? 函数y=[1-sinx-2sin^2(4分之派-2分之x)]/4sin2分之x的最小正周期是 反函数求法Y=1/X+1的反函数要有过程 怎么根据功率查电线规格 函数f(x)=sinx/(sinx+2sin(x/2))为什么周期是4pi,偶函数?是因为上下都是奇函数,所以整个是偶函数吗?周期怎么算 120KW“电加热”要用多大的电缆线工程用电 ..最好有画图说明,某海岛上一个观察哨A在上午11时测得一轮船在海岛北偏东60度的C处,12时20分测得轮船在海岛北偏西60度的B处,十二时四十分轮船到达海岛正西方五千米的E港口,如果轮船始终 铟和锡的电阻率各是多少?谢谢qq9160的热心,不过我问的是 铟 的电阻率不是 铜 的,另外你的单位不对. 差压变送器测流量的问题?差压变送器通过测节流装置2端的压力差可以计算出管道流量.但是管道的压力貌似分为动压和静压2种,差压变送器测的是动压差还是总压力差呢.我知道管道充满液体 串联电加热电缆主要在什么情况下使用? 锡磷氰铜电阻率是多少? 用差压变送器测流量今天看到差压变送器说明书上说,可以用差压变送器来测量流量.请高手讲解一番.水平管道和垂直管道有什么区别. 120KW用多大电缆 我有三个箱子 每个箱子大概是40KW 三个是120KW 每个箱子分用多大电缆!我都用220V电压不用380的··3个箱子都用220V的电压设备都是220V的.我现在跑了一根电缆4X70的铜芯电缆!不知 用“五点作图”法作函数y=-2sin2x+1的一个周期图像,并求出x取何值时y的最大,最小值 已知函数y=2sin(π/6-2x),则函数的周期为___,单调区间为__ 总功率120KW,进线需要多少平方MM的电缆,又需要多少A的空气开关? 用五点法画出函数y=2sin﹙x-π/3﹚+3的图像,并指出它的周期、频率、相位、初相、最值及单调区间. 书上说:函数F(X)的反函数的对应法则是F的负1次方,什么原因?推导出来的?老师也是这么说的,可是为什么要表示成这样啊,为什么不是F的*或者是F的#一类的,而要用-1引起歧义呢?第二个回 煤干馏→(箭头上下分别为Cao,电炉)可以得到乙炔吗煤干馏之后经过什么样的反应可以得到乙炔?条件有氧化钙和电炉 已知函数y=1/2sin(2x+π/6)+1 求函数的振幅 周期 频率 相位 初相已知函数y=1/2乘以sin(2x+π/6)+1 1.求函数的振幅,周期,频率,相位 ,初相2.求函数的递增区间,对称轴和对称中心3.画出函数y=f(x)在区间[ 求反函数.顺便写哈公式. 煤干馏→(箭头上下分别为Cao,电炉)可以得到乙炔吗煤干馏之后经过什么样的反应可以得到乙炔?条件有氧化钙和电炉08上海高考化学第28题
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn