MTK 6737平台RILD的实现

本文详细介绍了MTK 6737平台中RILD(Radio Interface Layer Daemon)的工作原理和启动流程。RILD作为RILJ层与modem通信的桥梁,由rild.c、libril库和reference-ril库三部分组成。启动过程从init.rc开始,通过import指令引入特定硬件的rc文件,最终在init.modem.rc中找到RILD的启动入口。RILD的初始化过程中,关键在于eventLoop和RIL_register函数,前者处理事件,后者负责将第三方库的实现与本地函数指针绑定。文章还提到了RIL消息与处理函数入口的映射,并提供了相关JNI调用本地代码的参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

      关于RILD的功能,就不多说了,对上服务于Phone进程,也可以认为是RILJ层,向下同modem层进行通信,对MTK平台来说就是使用AT命令了。

二、RILD的架构

RILD主要由三部分组成,一个是rild.c,第二个是libril这个库(对于MTK来说就是librilmtk),第三个是厂商关于实现同modem进行通信的reference-ril库,对于MTK来说就是mtk-ril。出于保护第三方厂商利益的考虑,这个库是在rild运行的时候动态加载进去的,由于运行在同一个进程中,所以rild同reference-ril之间的通信是函数调用,所以两者之间定义了用于通信的包含函数指针的结构体。

typedef struct {
    int version;        /* set to RIL_VERSION */
    RIL_RequestFunc onRequest;
    RIL_RadioStateRequest onStateRequest;
    RIL_Supports supports;
    RIL_Cancel onCancel;
    RIL_GetVersion getVersion;
    RIL_ReportUsbDisconn reportUsbDisconn;
    RIL_ReportSocketConn reportRILDConn;
} RIL_RadioFunctions;
static struct RIL_Env s_rilEnv = {
    RIL_onRequestComplete,
    RIL_onUnsolicitedResponse,
    RIL_requestTimedCallback
    // For multi channel support
    ,RIL_requestProxyTimedCallback
    ,RIL_queryMyChannelId
    ,RIL_queryMyProxyIdByThread
};

首先介绍下如何RILJ层下来的请求消息是如何调用到第三方库的,流程如下,对于回调很明显第三方库提供具体实现,而libril提供函数指针,这有点类似于面向对象的多态。

rild.c

RIL_register(funcs);//funnc 指向具体的实现,通过注册使得libril中的指针指向实现

ril.cpp

RIL_register (const RIL_RadioFunctions *callbacks) {
 
...

    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));//将callbacks赋值给全局变量s_callbacks
#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))
#define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest(a)
static void
dispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
    union RIL_SIM_IO {
        RIL_SIM_IO_v6 v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值