第12章 Reference-RIL运行框架

Reference-RIL完成两部分处理逻辑:

  • 与LibRIL交互完成RIL消息的处理。
  • 与Modem通信模块交互完成AT命令的执行。

Reference-RIL的运行机制

主要涉及以下几个方面:

  • Reference-RIL的初始化函数RIL_Init。
  • onRequest函数接收LibRIL的请求调用。
  • 接收Modem发出的UnSolicited Response消息的处理逻辑。

RIL_init函数初始化Reference-RIL

RIL_init函数完成的Reference-RIL初始化工作,包括三个操作:

  • 记录libRIL提供的RIL_Env指针,通过它可以调用LibRIL提供的相应函数。
  • 启动基于mainLoop函数的子线程,mainLoop线程主要负责监听和接收Modem主动上报的UnSolicited消息。
  • 返回Reference-RIL提供的指针RIL_RadioFunctions的结构体的针对s_call_backs。

s_callbacks是静态变量,在首次访问reference-ril.cpp时,就会完成其初始化操作。其中包含五个指向函数的指针。
通过函数指针,可以在LibRIL中调用Reference-RIL中定义的函数。

例如:在LibRIL中处理,RILJ中发来的命令形成的ril_event时,会调用s_callbacks.onRequest方法实现与Modem的交互。

onRequest接收LibRIL的请求调用

LibRIL接收到RILJ发来的请求后,
通过s_callbacks.onRequest调用Reference-RIL中的函数,
通过与Modem的交互,处理RIL请求。主要执行两项处理:

  • 将RIL请求转化成对应的AT命令,并向Modem发出AT命令。
  • 调用LibRIL的RIL_onRequestComplete函数,完成RIL请求处理结果的返回。

在Reference-RIL的onRequest函数中,会根据RIL请求类型调用requestGetCurrentCalls、requestDial、requestHangup等不同函数,完成相应的处理逻辑。
这些函数都完成两件事:

  • 向Modem发起执行AT命令的请求。
  • 调用RIL_onRequestComplete函数,完成RIL请求的返回。

onRequest函数调用的requestXXX函数共有12个,这些函数中的处理逻辑与大概都是以下的步骤:

  • 将请求转化为相关信息组合成的AT命令。
  • 调用at_send_command函数,通过AT命令通道向Modem发送AT命令。
  • 调用LibRIL提供的函数OnRequestComplete完成RIL请求返回处理结果的回调操作。

UnSolicited消息的处理逻辑

mainLoop函数

在RIL_Init函数中启动了以mainLoop函数为入口函数的子线程。
函数中完成两个关键动作:

  • 与Modem建立基于串口的通信连接,同时获取连接的文件的描述符fd;
  • 调用at_open函数开启AT命令通道。

at_open函数

at_open函数位于atchannel.c文件中,主要处理逻辑有两点:

  • 保存与Modem建立连接的文件描述符fd,接收到Modem发出的AT命令后调用onUnsolicited函数。
  • 启动以readerLoop函数为入口的子线程,readerLoop函数循环监听并接收Modem发出的AT命令。

readerLoop函数的处理逻辑可分为两大部分:

  • 读取Modem发出的AT命令
  • 根据AT命令进行处理。

AT命令的处理分为两个大的分支:

  • 短信相关的AT命令的处理
  • 普通AT命令的处理

onUnsolicited函数

调用LibRIL提供的RIL_onUnsolicitedResponse函数发出不同类型的UnSolicited Response消息通知。

RIL_onUnsolicitedResponse函数

关键点如下:

  • 根据Unsolicited Response消息类型获取s_unsolResponsed数组中对应的UnsolResponseInfo结构体对象,其中包括此消息电源唤醒策略和Parcel数据处理函数。
  • 应用UnsolResponseInfo中的电源管理唤醒策略,进行电源唤醒操作。
  • 调用UnsolResponseInfo中的Parcel数据处理函数,完成Parcel数据的组织和设置。
  • 调用sendRespons 大专栏  第12章 Reference-RIL运行框架e函数,通过Socket连接发送Parcel数据给RILJ。

AT命令

涉及到了如何扩展新 AT 命令,暂时忽略这部分。

Android RIL层运行框架和机制总结

关于RILJ、LibRIL和Reference-RIL的总结:

  • RILJ以RIL.java为核心,负责接收Telephony Frameworks发起的Telephony相关查询或控制请求,转换成RIL请求发送给LibRIL进行处理,
    同时,负责接收LibRIL发出的Solicited Response和UnSolicited Response消息,并将消息分发给Telephony Frameworks。
  • LibRIL以ril.cpp, ril_event.cpp代码为核心,提供RILC整体运行环境。
    负责接收RILJ发起的RIL请求,将RIL请求转换成对Reference-RIL的onRequest函数的调用,并将RIL请求结果反馈给RILJ。
    同时,还负责接收Reference-RIL发起的Unsolicited相关消息的处理,最终将消息发送给RILJ。
  • Reference-RIL以reference-ril.cpp为中心,主要负责与Modem进行AT命令交互;接收LibRIL通过onRequest函数调用,发送来的RIL请求。
    根据请求类型,组合成相应的AT命令交给Modem执行。
    Modem状态有变化时,也会发出AT命令,Reference-RIL会接收并做处理,将主动上报的AT命令转换成Unsolicted消息,发送给LibRIL。

RILJ、LibRIL、Reference-RIL、Modem之间交互的通道:

  • RILJ <-> LibRIL : 名为rild的Socket连接
  • LibRIL <-> Reference-RIL : 直接函数调用
  • Reference-RIL <-> Modem : 串口

总结Solicited消息的处理流程

Solicited消息分为:Solicited Request和Solicited Response,成对出现。
相关要点有:

  • RILJ接收到Telephony Framworks发出的请求后,会创建RILRequest对象并保存到mRequestList列表中,
    然后通过Socket向LibRIL发起拨号、挂断电话、交换通话等Telephony控制或查询相关的RIL请求。
  • LibRIL通过监听Socket端口并接收RILJ发出的RIL请求,
    经过processCommandsCallback -> processCommandBuffer -> dispatchFunction函数调用,
    最后调用Reference-RIL提供的onRequest函数。
  • Reference-RIL中的onRequest函数根据RIL请求类型及相关参数,
    组装AT命令,通过AT命令通道向Modem发起AT命令;
    Modem解析并执行AT命令,在发起AT命令返回结果给Reference-RIL。
  • Reference-RIL接收Modem返回的AT命令;
    调用LibRIL提供的onRequestComplete函数,
    将Modem返回的AT命令执行结果返回给LibRIL。
  • LibRIL接收到Reference-RIL返回的AT命令执行结果后,通过Socket向RILJ反馈Solicited Response消息,即RIL请求的返回结果。
  • RILJ由processSolicited方法处理接收到Solicited Response消息,
    通过RIL请求编号,在mRequestsLlist列表中找到发出RIL请求时对应的RILRequest对象,
    通过它的Message对象发出Handler消息发起回调,Telephony Frameworks全会接收到发起RIL请求的处理结果。

总结Unsolicited消息的处理流程

Unsolicited消息,仅有Response,没有Request。
处理流程中的关键点有:

  • Android RIL在手机启动过程中,会启动和加载RIL的运行环境,Reference-RIL会启动子线程调用mainLoop函数监听与Modem间的AT命令通道。
  • Modem接收到任何网络通信状态的变化,都会通过AT命令通道发送AT命令给Reference-RIL。
  • Reference-RIL接收到Modem发送AT命令后,由onUnsolicited函数将AT命令转换成对应的UnSolicited response消息,
    并调用LibRIL提供的onUnsolicitedResponse方法,向LibRIL发送UnSolicitedResponse消息。
  • LibRIL在收到onUnsolicitedResponse函数调用后,通过Socket连接发送Unsolicited Response消息给RILJ。
  • RILJ通过RILReceiver监听与LibRIL建立的rild端口的Socket连接,readRilMessage方法读取消息长度。
    根据消息长度读取Socket数据,最后由processResponse方法根据RIL消息类型调用processUnsolicited方法,处理Unsolicited消息。

本章小结

  • Reference-RIL的运行机制。
  • Reference-RIL与LibRIL进行函数直接调用,完成Solicited和Unsolicited消息的处理。
  • Reference-RIL与Modem基于串口的通信完成AT命令的执行。

原文地址:https://www.cnblogs.com/lijianming180/p/12327478.html

时间: 2024-10-08 14:57:24

第12章 Reference-RIL运行框架的相关文章

JS读书笔记:《JavaScript框架设计》——第12章 异步处理

一.何为异步   执行任务的过程可以被分为发起和执行两个部分. 同步执行模式:任务发起后必须等待直到任务执行完成并返回结果后,才会执行下一个任务. 异步执行模式:任务发起后不等待任务执行完成,而是马上执行下一个任务,当任务执行完成时则会收到通知. 面对IO操作频繁的场景,异步执行模式可在同等的硬件资源条件下提供更大的并发处理能力,也就是更大的吞吐量. 但由于异步执行模式打破人们固有的思维方式,并且任务的发起和任务的执行是分离的,从而提高编程的复杂度. 多线程.多进程均可实现异步模式. 二.从回调

《白帽子讲WEB安全》学习笔记之第12章 WEB框架安全

第12章 WEB框架安全 12.1 MVC框架安全 在Spring框架中可以使用spring security来增加系统的安全性. 12.2 模板引擎与XSS防御 12.3 WEB框架与CSRF防御 在MVC中防御CSRF: q  在Session中绑定token.如果不能保存到数据库中的Session,则使用Cookie. q  在form表单中自动填写token字段 q  在Ajax请求中封装token. q  在服务器端对比POST提交的token与Session绑定的Tiken是否一致.

实体框架6.0(Recipes)翻译系列 1 -----第一章 开始使用实体框架1

微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF版本更新太快,没人愿意去花时间翻译国外关于EF的书籍.使用Entity Framework开发已经有3年多了,但用得很肤浅,最近想深入学习,只好找来英文书<Entity Framework 6 Recipes>慢慢啃.首先需要说明的是,我英文不好,只是为了学习EF.把学习的过程写成博客,一是督促自

《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述 (转)

微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF版本更新太快,没人愿意去花时间翻译国外关于EF的书籍.使用Entity Framework开发已经有3年多了,但用得很肤浅,最近想深入学习,只好找来英文书<Entity Framework 6 Recipes>第二版,慢慢啃.首先需要说明的是,我英文不好,只是为了学习EF.把学习的过程写成博客,一

《Cortex?-A系列编程者指南(V3.0)》第12章&lt;异常处理&gt;笔记

在本章,我们看看ARM处理器如何响应异常.异常是任何需要挂起正常执行转而运行与每个异常类型相关联软件(称为异常处理程序)的条件. 12.1 异常的类型 如我们在第四章看到,A系列和R系列架构支持七种处理器模式,六种特权模式(称为快速中断模式.外部中断模式.管理模式.中止模式.未定义模式和系统模式),一种非特权模式(用户模式).如果虚拟化扩展和安全扩展被实现,Hyp和Monitor模式可以被添加到列表.当前模式在软件控制下或处理一个异常时修改. 然而,非特权的用户模式只能通过产生一个异常来切换到另

第 12 章 命令模式【Command Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真是是世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参见工作,你肯定会待在项目组,那今天我们就以项目组为例子来讲述命令模式. 我是我们部门的项目经理,就是一个项目的头,在中国做项目,项目经理就是什么都要懂,什么都要管,做好

Apache Spark源码走读之12 -- Hive on Spark运行环境搭建

欢迎转载,转载请注明出处,徽沪一郎. 楔子 Hive是基于Hadoop的开源数据仓库工具,提供了类似于SQL的HiveQL语言,使得上层的数据分析人员不用知道太多MapReduce的知识就能对存储于Hdfs中的海量数据进行分析.由于这一特性而收到广泛的欢迎. Hive的整体框架中有一个重要的模块是执行模块,这一部分是用Hadoop中MapReduce计算框架来实现,因而在处理速度上不是非常令人满意.由于Spark出色的处理速度,有人已经成功将HiveQL的执行利用Spark来运行,这就是已经非常

【Android】12.0 第12章 Intent及其过滤器&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 这一章我们主要学习Intent的基本用法,并通过例子演示如下功能: 如何启动另一个界面: 如何获取另一个界面的返回值: 如何利用Intent读取图库中的图片: 如何利用Intent读取和更新通讯录: 如何利用Intent实现记事本功能. 二.本章示例主界面 1.运行截图 2.MainActivity.cs文件中对应的代码 chItems.Add(new Chapter() { ChapterName = "第1

第12章 堆

来自维基百科 堆 堆(英语:heap) 亦被称为:优先队列(英语:priority queue),是计算机科学中一类特殊的数据结构的统称. 堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 逻辑定义 n个元素序列{k1,k2...ki...kn},当且仅当满足下列关系时称之为堆: (ki <= k2i,ki