RIL 流程

(M)SIM卡开机流程分析之RIL类分析 今天,来简单看一下SIM卡开机流程中的另一个重要的类,RIL.java 首先,进入RIL.java文件中 /** * RIL implementation of the CommandsInterface. * * {@hide} */ // Leo,需要注意这个地方,继承自BaseCommands,实现了CommandsInterface的接口 public final class 阅读详情

RIL 分为RILJ 和RILC 部分,而RIL 和modem 通信通过socket ,发送的是串口 AT command

[其实只要熟悉linux 编程,rild 部分确实很好理解]花了4天左右认认真真分析

ril

在初始化 reference-ril 库的时候,创建 客户端socket 连接到modem,而通过atchannel 的at_send_command_full_nolock发送AT command到modem,通过轮询 readline 读取返回信息

hardware/ril/reference-ril/reference-ril.c

const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv){

    //....
    fd = socket_local_client( s_device_path,ANDROID_SOCKET_NAMESPACE_FILESYSTEM,
                                            SOCK_STREAM );    
}

hardware/ril/reference-ril/atchannel.c


static const char *readline(){
//....
   count = read(s_fd, p_read,MAX_AT_RESPONSE - (p_read - s_ATBuffer));

}

代码段 小部件

但是RILJ和RILC 通信的,其实在开机启动的时候,在init.rc文件中,会配置socket 管道,RIL.java和rild.c会根据socketname 相互得到socket,并且,RIL.java 端会充当客户端,rild.c 端充当服务器端

service rild  /system/bin/rild
    class main
    socket rild0 stream 660 root radio

上面的rild进程 申明创建socket rild0 权限是660 owner是root 归属于radio ,并且在RIL.java中会创建rild0的socket

class RILReceiver implements Runnable {
    static final String[] SOCKET_NAME_RIL = {"rild0", "rild1", "rild2"};

    @Override
    public void run() {
        
        rilSocket = SOCKET_NAME_RIL[0];
        
        s = new LocalSocket();
        l = new LocalSocketAddress(rilSocket,
                LocalSocketAddress.Namespace.RESERVED);
        s.connect(l);
    
    }

}

 重点在RILC端,因为rild守护进程随开机启动,所以rild.c开机就启动,rild的socket 服务器端如下

hardware/ril/rild/rild.c

int main(int argc, char **argv) {

    if (strncmp(clientId, "0", MAX_CLIENT_ID_LENGTH)) {
        strlcat(rild, clientId, MAX_SOCKET_NAME_LENGTH);
        RIL_setRilSocketName(rild);  //socketname =rild0
    }

 
}

hardware/ril/libril/ril.cpp

static void startListen(RIL_SOCKET_ID socket_id, SocketListenParam* socket_listen_p) {

    switch(socket_id) {
        case RIL_SOCKET_1:
            strncpy(socket_name, RIL_getRilSocketName(), 9);
            break;

    fdListen = android_get_control_socket(socket_name);
    ret = listen(fdListen, 4);

}

在startListen 找到socket 使得RILJ和RILC 通信,但是如何读写数据?

的到了socket ,就可以接收RILJ发送的请求消息

hardware/ril/libril/ril.cpp

static void processCommandsCallback(int fd, short flags, void *param) {

     for (;;) {
        /* loop until EAGAIN/EINTR, end of stream, or other error */
        //获取消息 存入p_record buffer中
        ret = record_stream_get_next(p_rs, &p_record, &recordlen);
        
        if (ret == 0 && p_record == NULL) {
            /* end-of-stream */
            break;
        } else if (ret < 0) {
            break;
        } else if (ret == 0) { /* && p_record != NULL */
            //获取请求消息,处理请求消息
            processCommandBuffer(p_record, recordlen, p_info->socket_id);
        }
    }

}
int record_stream_get_next (RecordStream *p_rs, void ** p_outRecord,
                                    size_t *p_outRecordLen)
{

    countRead = read (p_rs->fd, p_rs->read_end, p_rs->buffer_end - p_rs->read_end);
    ret = getNextRecord (p_rs, p_outRecordLen);
    *p_outRecord = ret;
}

在processCommandBuffer 过程中将请求消息,转化为 AT指令通过dispatchFunction方法,最后通过   at_send_command_full_nolock发送给modem

 

最后就是读取modem 返回的消息,并且返回给RILJ端口

在轮询readerLoop,通过 readline获取返回数据,然后通过

s_unsolHandler (line1, line2)
processLine(line); 

处理读取的一行数据

modem 上报分为主动上报和主动上报,也就和URC 和非URC

static void processLine(const char *line)
{
    if (sp_response == NULL) {
        /* no command pending */
        handleUnsolicited(line);  //主动上报
    } else if (isFinalResponseSuccess(line)) {
        sp_response->success = 1;
        handleFinalResponse(line);  //非主动上报


}
/** add an intermediate response to sp_response*/
static void addIntermediate(const char *line)
{
    ATLine *p_new;

    p_new = (ATLine  *) malloc(sizeof(ATLine));

    p_new->line = strdup(line);

    /* note: this adds to the head of the list, so the list
       will be in reverse order of lines received. the order is flipped
       again before passing on to the command issuer */
    p_new->p_next = sp_response->p_intermediates;
    sp_response->p_intermediates = p_new;
}
/** assumes s_commandmutex is held */
static void handleFinalResponse(const char *line)
{
    sp_response->finalResponse = strdup(line);

    pthread_cond_signal(&s_commandcond);
}

当处理 handleFinalResponse 时候,说明modem 已经返回数据完毕,但是在读取中会走addIntermediate ,数据全部保存在sp_response中,当读取完成会通过handleFinalResponse 唤醒在阻塞在at_send_command_full_nolock 函数中,通过  pthread_cond_wait 等待handleFinalResponse 释放s_commandcond,最后将数据保存在pp_outResponse

 

如果返回数据成功,会通过 RIL_onRequestComplete返回,直接write写回 RILJ客户端

RIL_onRequestComplete(t, RIL_E_SUCCESS, &response, sizeof(int));
sendResponse(p, socket_id);
static int
blockingWrite(int fd, const void *buffer, size_t len) {

    while (writeOffset < len) {
        ssize_t written;
        do {
            written = write (fd, toWrite + writeOffset,
                                len - writeOffset);
        } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
    }

    return 0;
}

 

当然主动上报直接回调 onUnsolicited 通過 RIL_onUnsolicitedResponse 将数据写回RILJ

ret = sendResponse(p, soc_id);

 

 

 

RIL/QCRIL架构及基本流程 通过之前章节的讲述我们已经知道,libril属于Google原生的逻辑,MTK和高通公司都在使用这套原始逻辑,而libril的下层则是各个芯片厂商为了适配各自的芯片而自己开发的一套处理逻辑。QCRil则是高通公司为适配自己的modem芯片而开发的自己消息处理逻辑。里面主要是将请求消息、请求响应及主动上报消息封装成QMI消息进行传递。据高通的说法,使用qmi消息的机制可以传输效率更高,更稳定。 阅读详情

相关推荐

RIL 机制---开篇

1, 概念 本文基于android 6.0。RIL(Radio Interface Layer,无线通信接口层)主要相关的结构如下, 为了便于论述,将RIL分为三个部分, 1, Framework层中的相关Java程序。运行与phone进程,简称RILJ。   封装phone进程的消息,然后发送给RIL; 读取RIL中的消息然后解析并进行处理。 2,hardware

Jack的博客 6665

RIL简析

一、RIL的定义 RIL,全称为Radio Interface Layer;是Telephony和Modem之间的抽象层。用于实现上层Telephony和底层Modem之间的通信转换。其原因是Telephony和Modem实现通信功能的Command命令有所不同:Modem一般使用AT实现通信功能;同时,不同厂商之间的Modem实现方式也有所不同;为了更好地进行产业发展和技术升级维护,使用RIL...

fefei121008的博客 2587

Android Telephony RIL Request Message执行流程

Android Telephony包含了打电话,发短信,电话本,注网等,telephony framework各个module非常依赖于RILD和modem,framework的设置,设置的结果,网络的变化,打电话等都需要framework通过HIDL结果向底层请求,请求的结果通过message传回来。发送请求的时候,将message传入,等RILD返回结果后,再通过message将结果反馈出来,...

diangangqin的博客 636

深入分析RIL通信原理

RIL是Radio Interface Layer 的简称,中文叫无线电接口层。针对Android系统,硬件上多采用双cpu的架构,一个是基带处理器,主要处理数字信号、语音信号的编码解码以及GSM通信协议;另一个是应用处理器,运行操作系统。而基带和应用处理器如何通信,Google针对此问题设计了RIL这样的一套框架,方便其他基带芯片厂家快速开发。本文档主要讲RILJ和RILD框架代码,RILJ是指RIL JAVA层的代码,RILD是指RIL C层的代码。

teti3231052的博客 4772

将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现.docx

将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现.docx

AI Agent在保险行业落地:从智能客服到核保理赔的实践路径

AI Agent作为大模型技术的核心应用形态,正从通用对话走向垂直行业深度落地。其本质是让机器理解自然语言、处理非结构化文档,并在复杂业务流程中辅助人类完成信息抽取、内容生成与多轮交互。在保险这一强监管、高客单价的行业中,智能客服与销售助手率先验证了降本增效的价值,核保与理赔环节则进一步展示了AI在文档理解与风控辅助上的高价值潜力。从技术原理到商业闭环,垂直场景正在成为AI应用的主战场。本文以保险行业为样本,剖析AI Agent如何嵌入真实业务流程,梳理可复用的三阶段落地路径,为企业在医疗、金融等类似高文本

weixin_29039773的博客 364

Android RIL介绍

IMS全称是IP Multimedia Subsystem,中文意义为IP多媒体子系统。IMS是一种基于IP基础结构,能够融合数据、话音和移动等网络技术的系统。

佛祖保佑,永无巴戈。 3953

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

Android RIL 流程

文章目录1. RIL 建立消息队列(基于 Android O 原生)1.1 主要流程1.2 需注意的细节2. RIL 建立数据连接2.1 主要流程2.2 需注意的点 1. RIL 建立消息队列(基于 Android O 原生) 1.1 主要流程 主要流程可以归纳为以下: 开机时 rild 启动,调用 main 函数 在 main 函数中使用 dlopen 打开 so库(vendor实现库) 调用...

谈谈1974 1763

(Linux)DHCP 超级作用域和中继代理(超难受做了超久)

DHCP服务器在192.168.159.0 可以实现分配IP的功能,现在要跨网段分配IP 就需要用到DHCP中继代理。中继代理有两张网卡分别eth0:IP 192.168.159.2 ;eth1: IP:192.168.200.2 。现在要实现192.168.200.0网段的客户机可以获取DHCP服务器的IP。中继代理其实是相当于一个路由器的作用 DHCP服务器的IP地址 :192.168.159...

DJ_joker的博客 2224

算法导论之线性规划

线性规划,充斥着运筹学,在图的单源最短路径求解差分约束系统就是用到线性规划。怎么样问题可以建模为线性规划来解决呢?在给定的有限的资源和竞争约束情况下,取得最大化或最小化目标的问题。导论中给出政治竞选问题、航空航线调度问题、钻井采油问题。最大化或最小化目标是函数的因变量,自变量就是资源的约束因素,其函数就是由这些制约因素构成的等式或不等式。下面数学定义下线性规划。 在一般线性规划问题中,最优化一个

医疗影像检索 2万+

android ril.java_Android-RIL流程分析

本文以通话设置中的呼叫等待的设置为例,讲解RIL的流程。其实其余的也类似如此路径: package/apps/Phone/src/com/android/phone呼叫等待的onClick事件在CallFeaturesSettings.java里面当点击呼叫等待的CheckboxPreference时,调用以下函数:CallFeaturesSettings::onPreferenceTreeCli...

weixin_28818559的博客 324

技术文档的语言表达:简洁、准确与易懂的平衡艺术

技术文档的语言表达不仅要简洁、准确,还需要能够打破技术壁垒,使不同背景的读者都能理解。这是一项需要技巧和经验的工作,它要求技术作者既要具备扎实的专业知识,又要具备清晰的表达能力。通过不断打磨语言的简洁性、准确性和易懂性,我们能够创造出一份高质量的技术文档,让知识的传递不再受限于语言的障碍。

人心有反复,好在山水有重逢。 4677

Android的RIL驱动模块启动流程

Android的RIL驱动模 块, 在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分,另有一 radiooptions可供自动或手动调试使用。都依赖于include目录中ril.h头文件。目前cupcake分支上带的是gsm的支持,另有一 cdma分支,这里分析的是gsm驱动。   GSM模块,由于Modem的历史原因

坚持就是胜利 878

四旋翼飞行器建模(一)

四旋翼飞行器的姿态运动学和姿态动力学建模方法。

加斯顿工程师的博客 685

Lumerical 教程,包含作者个人理解及相关设计案例 (目前共计184篇,持续更新中)

4138。

u011699626的博客 1619

FW:Android的RIL驱动模块启动流程

http://hi.baidu.com/xxw8393/blog/item/5d5f863e009c1a3470cf6c8c.html Android的RIL驱动模块启动流程 2009-08-25 14:30 Android的RIL驱动模 块, 在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分,另有一 radioo

zxg519的专栏 881

关于 SAP UI5 应用 url 中的特殊符号 # 的作用介绍

符号在 SAP UI5 的 URL 中不仅仅是一个分隔符,更是动态路由、状态管理和深链接的关键所在。通过合理使用,开发者可以实现高效、流畅的用户体验,同时保持系统的可维护性和扩展性。通过 SAP UI5 提供的灵活路由机制,企业应用可以轻松实现复杂导航需求,同时为用户提供直观的交互体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 411

Framework层Ril控制流程分析

Framework层Ril控制流程分析 RIL Native层分析:http://www.cnblogs.com/bastard/archive/2012/11/05/2754891.html 一 RIL整体框架 看一下整个RIL部分框架图:        实际上Framework部分比较复杂的,包含了很多类;但其核心的两个类是GSMPhone/,RIL.Java.

Courage_Insight的专栏 538

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ril.java_RIL.java里request流程

Android GSM驱动模块(rild)详细分析(二)request流程熊猫哥哥 发表于IT168和Opendroid 转载请注明1. 多路复用I/O机制的运转上文说到request是接收,是通过ril_event_loop中的多路复用I/O,也对初始化做了分析.现在我们来仔细看看这个机制如何运转.ril_event_set负责配置一个event,主要有两种event:ril_event_add...

weixin_36308404的博客 356

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android的RIL驱动模块telephony启动流程

#include stdio.h> #include fcntl.h> #include errno.h> int main() {     int ret;     int fd = open("/dev/tty1", O_RDONLY);     fcntl(fd, F_SETFL, O_NONBLOCK);     ret = read(fd, NULL,

2802

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 电话流程ril,android电话系统和ril分析(2)————rild详细分析

1.rild.c结构: 2.各个函数分析:2.1>RIL_registerextern void RIL_register (const RIL_RadioFunctions *callbacks);该函数在ril.cpp里有实现,RIL_RadioFunctions 在ril.h里定义为:typedef struct {int version; /* set to RIL_VERSION ...

weixin_27038701的博客 397

Android6.0 pin锁卡流程 从Settings到Ril流程追踪

记录下android6.0的pin锁卡流程 settings里在IccLockSettings.java 类中的tryChangeIccLockState方法中调用Phone类 Phone类mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback) setIccLockEnabled是在IccCard类中的一个方法 Icc...

weixin_40369857的博客 579
上一篇: 深入理解RILD 知识点笔记
下一篇: 从live555 实战中了解MakeFile
杨尘心
博客等级 码龄10年 122粉丝 88原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值