Reference-RIL 运行框架

Reference-RIL 主要负责:

1、将Solicited Request请求转化成AT命令交给Modem执行,并将AT命令执行的结果以Solicited Response消息的方式反馈给LibRIL;

2、同时负责接收Modem主动上报的消息,以UnSolicited Response消息的方式反馈给LibRIL处理逻辑可分为两部分,分别为:

      (1)  与LibRIL的交互完成RIL消息的处理

      (2)  与Modem通信模块的交互完成AT命令的执行


1、Reference-RIL运行机制,主要分析如下模块

      (1) Reference-RIL的初始化函数RIL_Init;

      (2) onRequest函数接收LibRIL的请求调用;

      (3) 接收Modem发出的UnSolicited Response消息的处理逻辑;


1.1、     RIL_Init函数初始化Reference-RIL

const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
{
    int ret;
    int fd = -1;
    int opt;
    pthread_attr_t attr;

    s_rilenv = env;

............

    pthread_attr_init (&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);

    return &s_callbacks;  //返回RIL_RadioFunctions
}

  1)     记录LibRIL提供的RIL_Env指针,通过它调用LibRIL提供的相应函数;

2)     启动mainLoop子进程,负责监听和接收Modem主动上报的UnSolicited消息;

        3)     返回Reference-RIL提供的指向RIL_RadioFunctions指针s_callbacks;


s_callbacks 是一个static静态变量

/*** Static Variables ***/
static const RIL_RadioFunctions s_callbacks = {
    RIL_VERSION,
    onRequest,
    currentState,
    onSupports,
    onCancel,
    getVersion
};

其在首次访问reference-ril.cpp时就完成初始化操作;


1.2、     onRequest接收LibRIL的请求调用

LibRIL接收到RILJ发起的RIL请求后,通过onRequest函数调用,向Reference-RIL发起对应的RIL请求;

/**
 * Call from RIL to us to make a RIL_REQUEST
 *
 * Must be completed with a call to RIL_onRequestComplete()
 *
 * RIL_onRequestComplete() may be called from any thread, before or after
* this function returns.
  *
 * Will always be called from the same thread, so returning here implies
 * that the radio is ready to process another command (whether or not
 * the previous command has completed).
 */
#if defined(ANDROID_MULTI_SIM)
static void
onRequest (int request, void *data, size_t datalen, RIL_Token t, RIL_SOCKET_ID socket_id)
#else
static void
onRequest (int request, void *data, size_t datalen, RIL_Token t)
#endif
{
    ATResponse *p_response;
    int err;
    RIL_RadioState radioState = sState;

    RLOGD("[RilProxy] onRequest: %s, datalen = %d, radioState:%d, socket_id: %d",
            requestToString(request), datalen, radioState, socket_id);

    /* Ignore all requests when RADIO_STATE_UNAVAILABLE.
     */
    if (radioState == RADIO_STATE_UNAVAILABLE &&
        request != RIL_REQUEST_GET_SIM_STATUS &&
        request != RIL_REQUEST_OEM_HOOK_RAW && //This is for ATCI
        request != RIL_REQUEST_OEM_HOOK_STRINGS &&
   
...............

request != RIL_REQUEST_SET_IMS_VOICE_ENABLE &&
        request != RIL_REQUEST_SET_IMS_VIDEO_ENABLE &&
        request != RIL_REQUEST_ALLOW_DATA &&
        request != RIL_REQUEST_SET_TRM) {
        RIL_onRequestComplete(t, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
        return;
    }

    // M: ril proxy
    RLOGD("[RilProxy] onRequest: request = %d, slotId = %d", request, socket_id);
    rfx_enqueue_request_message(request, data, datalen, t, socket_id);
    /// M
}
  

1)     将RIL请求转化为对应的AT命令,并向Modem发出AT命令;

        2)     调用LibRIL的RIL_onRequestComplete函数,完成RIL请求处理结果的返回;

MTK 通过rfx_enqueue_request_message 函数封装发起请求接口;

通过队列的方式实现消息顺序处理,处理接口函数RfxMainThread.cpp的onHandleMessage函数;

1) 将相关请求信息组成AT命令;

2) 调用at_send_command_sms 发送AT 命令到modem;

3) LibRIL的onRequestComplete完成RIL请求返回处理结果;

1.3、     UnSolicited消息处理逻辑

        mainLoop函数主要负责监听和处理Modem上报的UnSolicited消息;

static void *
mainLoop(void *param __unused)
{
    int fd;
    int ret;
    AT_DUMP("== ", "entering mainLoop()", -1 );

    rfx_init();

    ril_socket_init();
    RLOGI("Finish ril socket initialization");

    registerSignal();
    return 0;
}

       1)     与Modem建立基于串口的通信连接,同时获取连接的文件描述符fd;

       2)     调用at_open函数开启AT命令通道;

              a)     保存与Modem建立连接的文件描述符fd,以及接收到Modem发出的AT命令后的回调函数onUnsolicited;

              b)     启动readerLoop子进程,readerLoop函数会for循环监听并接受Modem发出的AT命令;

                      readerLoop 函数处理逻辑:

                                  读取Modem发出的AT命令;

                                  根据AT命令进行处理;

        3)     onUnsolicited函数

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

        4)     RIL_onUnsolicitedResponse函数

               a)     根据UnSolicited Response消息类型获取s_unsolResponses数组中对应的UnSolicitedResponseInfo结构体对象,其中包括此消息电源唤醒策略和Parcel数据处理函数;

               b)     应用UnsolResponseInfo中的电源管理唤醒策略,进行电源唤醒操作;

               c)     调用UnsolResponseInfo中的Parcel数据处理函数,完成Parcel数据的组织和设置;

               d)     调用sendResponse函数,通过socket连接发送Parcel给RILJ;


2、AT 命令

2.1、如何新增AT命令

1、确认modem中相关AT命令支持情况

2、根据AT执行方向,定义Solicited和UnSolicited消息类型,修改RILConstant.java和ril.h文件

3、完善processSolicited和processUnSolicited方法,增加对RIL消息处理逻辑

4、修改ril_command.h文件

5、修改Reference-RIL中的onRequest函数以及onUnsolicited函数


2.2、Android Telephony常用AT命令

1、ATD  电话号码 :拨号

2、ATA :接电话

3、AT + CEER :查询呼叫失败原因

4、AT + CGDCONT :设置数据连接

5、AT + CGACT :断开所以连接


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

       3.1、总结Solicited消息处理流程

       

       3.2、总结UnSolicited消息处理流程

          



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值