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

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

 

 

为什么安装后的数据库应用总是路径不对或找不到? 返回 -VB资料 无论如何,就是只能输入数字-VB资料 VB用 DAO 或 ADO 正确访问 Access 2000 VB用CELL组件显示Access数据库的图片对象 VB用DAO打开Excel文件 VB用DATA控件绑定报表控件打印报表 VB用EXCEL来打印报表并生成折线图 VB用EXCEL组件简化VB编程的一种方法 VB用MDB文件做密码库 VB用ODBC API访问ODBC数据库 用VB 实现类电子表格的数据录入 用VB5直接控制Excel 97 用VBA编制Access的查询程序 用VB和RDO访问SQL Server 用VB开发多通道仪表数据采集程序 用VB实现关闭所有数据库对象 用VB实现类电子表格的数据录入 VB用代码创建数据库,表,字段 VB用类来编写数据库程序 优化OLE的调用频率-VB资料 语言选择引起的查询错误 -VB资料 远程数据库的访问-VB资料 运用ADO进行数据库表数据互导 -VB资料 在 VB5.0中编辑数据库和电子表格 在Access 2000中用ADO-VB资料 在Access数据库中实现密码管理的另一种方式 -VB资料 在VB6.0中使ACCESS数据库在网络使用中保持同步 在VB中更改SQL Server数据库结构 在VB中兼容非ACCESS数据库的技巧 在VB中引用dbf及索引文件 在VB中运行Microsoft Access报表的好方法 问csdn一个问题 怎么利用代码访问双击sqlconnection之后弹出来的对话框里面的参数? 源码出售 用什么命令运行外部程序? 加急!!寻找swing界面高手 vfp问题? 无法启动OracleOraHome81ManagementServer 关于一个vc编写的com组件与asp调用的巨普遍的问题 如何得到 QQ 的安装路径 最新Google登陆方 fireworks高手请看(100分) 请问那位高手在sco上编译成功了gcc,用的是那个版本,指导一下在下,谢先 调用存储过程出错,如何解决,在线等,谢谢! 怎么使用(MultiPage,TabStrip)这2个控件来实现界面分多页的操作功能。 给我这样的代码,我给你100分(在线等,急用,我快疯了!) 我的JSP的WEB服务器oracle公司的ias,数据库是oracle,中文显示乱码,请教转换??? 立即加分!!帮忙up也送分!调用COM程序时,出现“在单一线程模式下,试图在一个以上线程进行呼叫”错误,如何是好? b/s模式下如何读取sql,oricle等关系型数据库中的数据? 急!!很菜的问题!NT4下的设备管理器在哪? oracle 在linux上的性能问题? 关于manifest.tmp文件(大侠帮忙!) 请帮我的忙,好吗!!! 系统怎么不是很稳定? 请问一下各位,哪里有可下的lotus 认证教材和试题,多谢多谢!! 寻求控件编写技术下载网址。 谜语:请问CLP和CLS是什么汉语的简写? up有分!★关于《网络编程〉中的问题★:如何设计udp/ip的完成端口模式,udp协议不需要accept.... 关于重定项问题? are there any software in linux, just as netant,office etc in windows? ASP的中文問題 请问:测试工程师的工作是什么?主要测试软件的哪些项目? (100分征集)如何做使得访问JSP服务器时不用加端口号(当然不能用80)?? 菜鸟求助:关于句柄的问题。请高手多多指教 请问什么是存储过程(在SQL 2000SERVER中)? 1000分的大问题!***************怎么突破内存禁区读写的权限 java学什么?怎么学? java学什么?怎么学? 高分急救:Oracle安装完成后,服务可以启动,数据库不与服务一起启动,要手动启动 如何让启动时不自动进入x windows? 下载问题 如何得到CPU的序列号(编程) 向ActiveX控件是否可以传递数组参数 can i read or copy files in windows OS to linux? 什么错误? 将SYBASE数据库移植到SQL SERVER 过程中遇到的问题。急!help session问题 为什么我的web不能进断点? SO_REUSEADDR的疑问 关于web数据库的问题 怎么解??? 再送100分,求jtable例子! 设计用于带式运输机的一级圆柱齿轮减速器 (附:运输机工作拉力1300N,运输带工作速度1.55m/s,卷筒直径255m 油的熔点是? 时间和位移,一个人从北京去重庆,可以乘火车,也可以乘飞机,还可以先乘火车到武汉,然后乘轮船沿长江到重庆,这几种情况下:①他的运动轨迹不一样;②他走过的路程相同;③他的位置变动 带式运输机传动系统中的二级圆柱齿轮减速器 运输带拉力7000N 运输带速度0.5m/s 滚筒直径380mm 帮我算算带式运输机传动系统中的二级圆柱齿轮减速器 运输带拉力7000N 运输带速度0.5m/s 滚筒直径 如果在重氮化操作中加入了过多的亚硝酸钠,应作如何处理? 一物体做匀变速直线运动,运动方程为X=5t-2t²(m).求该物体运动的初速度是多少?2s内的位移大小是?(要公式、具体过程 ) DCP FIRE EXTINGUISHER是什么类型的灭火器 氮化后的东西为什么老是颜色不好大神们帮帮忙氮化后的东西为什么老是颜色不好,有的发黑,有的发黄 开暖气锁闭阀就是这样的怎么打开打开了怎么安上就是那种压帽式的暖气锁闭阀里面有3个圆珠 这个加速度怎么求?有积分哦. 氮化镁和硝酸反应生成什么? 生物因素是指影响一个生物生活的_____或______的生物,生物与生物之间的关系是复杂的,一个生物的生存即受到____生物的影响,也会受到——生物的影响.同种生物之间或不同种生物之间的影响可 灭火器3a89b什么意思 吹膜机挤出部上的加热部分,不锈钢加热圈,云母加热圈,有什么区别吗?各自的优势在哪?耐用性,以及互换性普遍性.如果坏了的话,哪种更好买到. 一烘箱显示温度比设定值高,实际温度正常,是什么原因?例如设定50度,升温到50度后,停止加热,可是显示值会一直升到70度才停?原来一直正常的,过冲没有这么大,几度而已,且很稳定.最近出现指 灭火器2A55B是什么意思 陶瓷纤维云母带做什么用 小浪底冲沙有何意义?正面和反面的都说说吧顺便介绍一下它吧 一个篮球或是气球内外部压力一不一样? 高一物理位移中第五秒和第五秒内有什么区别? 水库有冲沙的功能怎么解释 把气球放在钉板上,再把木板放在气球上,向木板上施加压力,气球变形但却不会被钉板上的钉刺破, 物体运动的方向和位移的方向有什么区别 地震的产生和人类的大工程建设有无关联?地震产生的原因是什么?和 人类活动有无关系呢?比如人类建设大水电站,建地铁,建海底隧道 等等.来点科学解释,适当转载也可以.有4个人的回答都特 钉子越尖越容易钉入木板说明压力的作用与什么有关 下列几个反应的化学方程式:①2H2S+SO2=3S+2H2O②2KI+Cl2=2KCl+I2那么类似的题目应该怎么判断呢? 地震与人类工程的关系 烤蓝打包带哪里有卖的? 铸铝门主要分哪几样 锯1.5mm厚,最大宽度为500mm的钢板,用什么样的锯床 DCP与丙烯酸树脂反应吗? 铸铝门只要是什么 电源为双12V交流的功放板,怎样改为12V电瓶供电 怎么根据房间的大小选灯具啊? 铜矿品位要求 有谁想在江西 浙江地区做不锈钢门,高档别墅大门,铸铝防爆门呢 为什么在不同房间高度时需要选用不同灯具 3个品位的铜矿有开采价值吗 can you help me with question?为什么I2溶于CCl4为紫色溶液,溶于乙醚为红棕色? 一级圆柱齿轮减速器设计说明书 原始数据:滚筒直径:420mm 输送带速度:1.6m/s 输送带工作拉力:2200N 铜矿的品位怎么? 1,3丁二烯与溴会有加成反应吗? 单级斜齿圆柱齿轮减速器输送带工作拉力F=1500N,输送带速度V=1.5m 卷筒直径D=280mm 铜矿的品味是指 氮化发黑(发蓝)后 怎么去除黑色求救:我有个QT450的工件,本来技术要求氮化后不需要发黑(发蓝)的,但是忘了,氮化后进行发黑热处理了,我怎么去除上面的黑色,恢复氮化后的本色呀? PP料里哪个参数觉定他对色母的分散影响 低品位氧化铜矿生产硫酸铜的方法 220v的加热管接220v与380v星接哪个热的快 PP制品是什么颜色,不加色母的情况下我说的是PP制作成成品后是什么颜色? 橡皮泥放久了上面长的什么? 氮化产品发黑 我有一个客户是刀盘,表面经过气体渗氮,然后送到我们厂发黑,但经过发黑,表面效果不好,渗氮再发黑后,表面着色不均,并且发黑表面灰多,很难洗掉,有谁知道怎么样发蓝表面效果 设计用于带式运输机的一级直齿圆柱齿轮减速器输送带工作拉力1100,传送带速度1.5m/s,卷筒直径250mm设计用于带式运输机的一级直齿圆柱齿轮减速器 输送带工作拉力1100,传送带速度1.5m/s,卷筒直 .已知有反应:2FeCl3+2KI=2FeCl2+I2+2KCl H2S+I2=2HI+S↓ 2FeCl2+Cl2=2FeCl3 下列四种微粒.已知有反应:2FeCl3+2KI=2FeCl2+I2+2KClH2S+I2=2HI+S↓ 2FeCl2+Cl2=2FeCl3下列四种微粒:Fe3+、CI2、S、I2、其氧化性由强到弱的正确 用380V的电,怎么接220V的加热管? 急需设计带式运输机用单级斜齿圆柱齿轮减速器.已知运输带拉力F=1600N运输带速度V=1.0m/s卷筒直径D=300mm Cl2+2KI=2KCl+I2/Cl2+SO2+2H2O=H2SO4+2HCl沉淀?气体? 高速钢刀具做qpq盐浴氮化发黑表亮吗 带式输送机二级圆柱齿轮减速器设计工作拉力F=2200N,卷筒直径D=300mm,运输带速度V=1.2m/s求一份完整的设计说明书!急 为什么在反应 CL2+2kI==2kcl+I2 中碘不打沉淀符号? stavax可否氮化STAVAX可不可以进行氮化处理,变形量有多大
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘