Reference-RIL 运行框架

    xiaoxiao2022-06-22  18

    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消息处理流程

              

    转载请注明原文地址: https://ju.6miu.com/read-1122891.html

    最新回复(0)