为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

QCRIL_RIL_架构分析

2020-01-13 4页 pdf 1MB 57阅读

用户头像 个人认证

lanlanzz

擅长证券投资,金融科技类研究

举报
QCRIL_RIL_架构分析1文档名称:RIL/QCRIL架构介绍文档描述:介绍�AndroidRIL、qcril架构及主要功能实现,以及�RAT/VOICE/DATA相关业务在�RIL侧的处理流程2目录1引言..........................................................................................................................................31.1目的..................................
QCRIL_RIL_架构分析
1文档名称:RIL/QCRIL介绍文档描述:介绍�AndroidRIL、qcril架构及主要功能实现,以及�RAT/VOICE/DATA相关业务在�RIL侧的处理2目录1引言..........................................................................................................................................31.1目的...............................................................................................................................31.2定义...............................................................................................................................31.3相关及文档...........................................................................................................32RIL架构..................................................................................................................................43AndroidRIL简介.....................................................................................................................53.1AndroidRIL目录结构................................................................................................53.2Rild启动流程...............................................................................................................53.2.1加载ril动态库文件.........................................................................................53.2.2启动event队列监听........................................................................................63.2.3执行动态库中ril_init.......................................................................................83.2.4Ril_register处理...............................................................................................93.3rildevent的处理..........................................................................................................93.3.1rildmsg的解析................................................................................................93.3.2消息发送到QCRIL........................................................................................114Qcril简介..............................................................................................................................124.1eventthread实现.......................................................................................................134.2qmiclient初始化.......................................................................................................154.3Oemsocketserver实现(保留,未修改)..............................................................164.4qcril主要函数............................................................................................................174.5RIL基本处理流程....................................................................................................184.5.1AP下发的request的基本处理流程.............................................................18QCRIL时序图.pdf.........................................................................................................184.5.2Modem主动上报消息基本处理流程...........................................................185RIL侧部分业务.....................................................................................................................195.1RAT业务....................................................................................................................195.1.1代码结构.........................................................................................................195.1.2开机搜网流程.................................................................................................195.1.3Voice相关处理流程......................................................................................195.1.4补充业务.........................................................................................................205.2DATA相关处理流程(保留,未修改)..................................................................205.2.1代码存储位置.................................................................................................20DATA相关代码存储目录:/vendor/qcom/proprietary/qcril/common/data。这里仅是部分代码,还有大部分在/vendor/qcom/proprietary/data/。.......................................205.2.2发送DataCall请求流程(ril,qcril侧).....................................................215.2.3DataCall设置成功响应流程..........................................................................235.3UIM相关业务(保留,未修改)............................................................................255.3.1代码结构.........................................................................................................255.3.2UIM相关的处理流程....................................................................................265.3.3STK相关的处理............................................................................................295.4附录1:qcrilinit流程图...........................................................................................3131引言在Android平台中,RIL层位于Framework层与modem之间,分成两个部分:一部分是rild,它创建socket服务与framework层进行通信;一部分是VendorRIL,在高通平台中称为qcril。本文档是对rild及qcril的学习总结文档,为其它同学学习ril相关知识提供参考。1.1目的了解android系统中RIL层的结构了解RIL层的功能了解RIL层的工作机制1.2定义如非特别指定,下面术语将特指定义内容:AMSS:AdvancedMobileSubscriberSoftwareril:RadioInterfaceLayerqcril:qualcommradiointerfacelayer高通提供的ril层接口QMI:QualcommModemInterface高通提供的与modem交互的接口RAT:radioaccesstechnologyUIM:UserIdentificationModuleSTK:SIMToolkitinterface1.3相关协议及文档80-NB237-1:QCRILAndroid™Overview80-NB238-1:QCRILDataOverview80-NC920-1:QMIRILOverview42RIL架构1)RIL.java:Framework侧和RIL层交互的接口,RILJ通过hidl方式发送request到ril层并接收处理来自RIL层的消息。Framework层还可以通过oem_socket与ril层交互,在高通平台中APK可以通过oemsocket直接与ril通信,不需要经过Framework,具体可参考IMS事件的处理,包括imssender等类(ims是通过imssocket)。2)Rild.so:主要完成与AP侧的msg交互,Framework层通过rild下发request。3)Ril.so:主要完成rild收到的request的dispatch处理和底层返回的request处理结果和modem主动上报的消息的response处理。4)Qcril.so:高通实现的ril处理机制,具体完成request、response和modem主动上报的indication的处理。5)Qmi.so:ril与AMSS消息交互的接口,ril有request需要下发到AMSS,通过qmi发送;AMSS返回response、unsolicitedindication通过qmi上报到ril。53AndroidRIL简介本章主要介绍Androidril的目录结构、rild的启动流程,以及rild中event处理机制的实现。3.1AndroidRIL目录结构|--hardware||--ril|||--include(头文件主要包含RIL各种结构体、RIL_EVENTID)|||--libril(主要为rild提供了event处理功能)|||--reference-ril(android自带的ril参考,qcril参考这个实现)|||--rild(rild后台服务程序)3.2Rild启动流程rild是在开机时由init.rc来启动的,Rild.c的main函数作为启动入口,主要函数功能如下图所示:3.2.1加载ril动态库文件使用property_get()函数获取需要加载的ril动态库文件路径,高通平台6系统rild.libpath属性配置如下:rild.libpath=/vendor/lib/libril-qc-qmi-1.so获取动态库文件路径后,如下加载该库文件:dlHandle=dlopen(rilLibPath,RTLD_NOW)高通平台属性文件放在如下目录:/device/**(产品名称)/system.prop3.2.2启动event队列监听Ril动态库文件加载成功之后,调用RIL_startEventLoop()启动event队列监听功能,该函数会启动一个线程,在线程中使用select函数实现对多个文件描述符的集合的监听;select函数是阻塞函数,当有某个eventfd有数据变化时,会触发select非阻塞,继而触发event的处理,具体实现如下:1)首先创建了一个dispatch线程,线程的入口是在eventloohread_create(&s_tid_dispatch,&attr,eventLoop,NULL);2)eventloop的实现先调用ril_event_init()初始化readFds、timer_list、pending_list、watch_table;创建一个pipe管道,获得管道的读写端文件描述符,并设置读端为非阻塞方式;7ret=pipe(filedes);s_fdWakeupRead=filedes[0];s_fdWakeupWrite=filedes[1];fcntl(s_fdWakeupRead,F_SETFL,O_NONBLOCK);然后初始化s_wakeupfd_event,并将该事件与fdWakeupRead绑定,同时设置回调函数processWakeupCallback。ril_event_set(&s_wakeupfd_event,s_fdWakeupRead,true,processWakeupCallback,NULL);将该s_wakeupfd_event加入eventloop监听队列;rilEventAddWakeup(&s_wakeupfd_event);管道的功能:将读端文件描述符s_fdWakeupRead加入select监听,每当有新rilevent被加入watchtable时,会通过向管道的写端写入空数据,触发阻塞在select的eventloop线程非阻塞,该线程继续执行对应的event的回调函数去处理。3)启动eventloop线程ril_event_loop();线程中实现event消息队列监听,select阻塞监听eventfd集合;select(nfds,&rfds,NULL,NULL,ptv);当select中监听的某个fd数据发生变化时,select非阻塞,接下来进行event的处理;8rocessTimeouts();//将超时的event移入pendinglist中等待处理processReadReadies(&rfds,n);//将加入watchtable的事件移入pendinglist等待处理firePending();//处理pendinglist中的事件再看pendinglist中的事件的处理:ev->func(ev->fd,0,ev->param);//调用event对应的回调函数去处理以上为evnetloop的基本实现,后面event处理部分详细讲解具体运作方法。3.2.3执行动态库中ril_initEventloop启动后,使用dlsym函数获取加载的ril动态库中的Ril_init()函数入口地址;rilInit=(constRIL_RadioFunctions*(*)(conststructRIL_Env*,int,char**))dlsym(dlHandle,"RIL_Init");之后执行加载的动态库中的Ril_init()函数,该函数返回一个RIL_RadioFunctions结构体指针,如下所示:前面加载的动态库文件为qcril的库文件,此处实际执行的就是qcril.c中的Ril_init函数。funcs=rilInit(&s_rilEnv,argc,rilArgv);上面的函数传入的参数s_rilEnv结构如下,在qcril初始化时qcril_response_api保存了这个参数传入的OnRequestComplete、OnUnsolicitedResponse、RequestTimedCallback函数入口指针,在response时会用到。9funcs中的onRequest函数指针,就是qcril中的onRequest函数入口地址,具体使用见event处理部分介绍。3.2.4Ril_register处理上面执行qcril的Ril_init获得了一个RIL_RadioFunctions结构体指针,即funcs;之后调用RIL_register(funcs)注册event处理函数入口,启动rildsocket并监听,并将rildsocket监听事件加入eventloop监听队列,RIL_register(funcs)具体实现如下:1)将执行rilinit后返回的RIL_RadioFunctions结构体指针,复制到event处理回调函数入口指针列表中,后面rilddispatchevent会用到这个回调函数指针列表;memcpy(&s_callbacks[client_id],callbacks,sizeof(RIL_RadioFunctions));2)注册服务:radio::registerService(&s_callbacks,s_commands);registerService对应的逻辑在ril_service.cpp中,如下:#defineCALL_ONREQUEST(a,b,c,d,e)s_vendorFunctions->onRequest((a),(b),(c),(d))通过该宏定义即将消息发往qcril中。3.3rildevent的处理3.3.1rildmsg的解析RIL.java通过radioProxy调用ril_service.cpp中的方法,以hangup()为例说明。10addRequestToList中,将传入的数据转换成RequestInfo类型,如下:pRI=(RequestInfo*)calloc(1,sizeof(RequestInfo));pRI->pCI=&(s_commands[request]);//找到requestid对应的CommandInfo11RequestInfo结构如下:typedefstructRequestInfo{int32_ttoken;//thisisnotRIL_TokenCommandInfo*pCI;//最重要的参数,确定了request与哪个dispatch方法对应structRequestInfo*p_next;charcancelled;charlocal;//responsestolocalcommandsdonotgobacktocommandprocessRIL_SOCKET_IDsocket_id;intwasAckSent;//Indicateswhetheranackwassentearlier}RequestInfo;CommandInfo结构如下:typedefstruct{intrequestNumber;//requestidint(*responseFunction)(Parcel&p,void*response,size_tresponselen);}CommandInfo;CommandInfo与RIL_REQUEST_XXX的映射来源:staticCommandInfos_commands[]={#include"ril_commands.h"};3.3.2消息发送到QCRIL执行调用CALL_ONREQUEST方法时,该方法会调用onRequest函数,而onReauest函数的入口地址就是在rild启动时Ril_register中获取到的。#defineCALL_ONREQUEST(a,b,c,d,e)s_vendorFunctions->onRequest((a),(b),(c),(d))前面提到在rild启动的时候,动态加载了rillib,并执行了该库中的ril_init,12获得了RIL_init执行后返回的RIL_RadioFunctions入口地址,其中onRequest参数指向的地址就是qcril中的onRequest函数入口地址,正是通过这个入口地址,建立了rild与qcril的联系通道,将RILJ通过hidl下发的reauest消息,传递到qcril中处理。4Qcril简介Rild在启动时,rilinit执行了动态库文件中qcril的Ril_init()函数,完成了qcril的初始化,本章主要介绍qcril初始化的过程,以及qcril初始化时实现的基本功能。Ril_init函数完成的主要功能有3个,分别是:1)eventthread的初始化及启动Eventthread主要用来处理modem主动上报的indication的处理。2)qmiclient的初始化qmiclient是qcril与modem交互的通道,qcril向modem下发的command,modem上报indication或command处理结果,都需要通过qmiclient来完成。3)Oemsocketserver的初始化Oemsocketserver是androidrild之外,高通实现的AP与modem交互的扩展通道。13在eventthread初始化之前,初始化了一个重要的参数qcril_response_api,这个参数就是3.2.3节执行ril_init时传入的Ril_evt结构体指针,携带OnRequestComplete、OnUnsolicitedResponse、RequestTimedCallback函数入口指针,在request执行完成和modem主动上报indication时,执行向AP返回和上报的处理。4.1eventthread实现Eventthread初始化时创建一个线程,线程中初始化一个eventlist,创建一14个管道,将管道读端加入select监听fd集合,当mainthread中触发event时,可以通过向管道写端写入空数据,触发阻塞的select函数,之后调用qcril_process_event函数来处理event,再通过qcril_dispatch_event调用到对应的event处理函数。1)创建event线程,线程入口在qcril_event_main2)qcril_event_main具体实现线程功能//初始化event队列//创建管道//获取管道的读写端fd,设置读端非阻塞,并将其加入监听fd集合3)eventthread线程实现//线程执行,select监听fd集合,阻塞等待event触发//有event触发select非阻塞,qcril_process_event具体执行事件处理//qcril_process_event中检查event类型之后,dispatchevent//qcril_dispatch_event中调用对应的handler入口去具体执行对应event15Request、indication与handler映射关系在qcril.c文件中。4)初始化完成之后,线程block,函数处理退出到Ril_init中,再调用qcril_event_start启动4.2qmiclient初始化Eventthread初始化及启动完成之后,进行qmiclient的初始化;qmiclient是qcril与modem交互的通道,qcril向modem下发command、modem上报indication或command处理结果,都需要通过qmiclient来完成。Qmiclient有很多种类型,包括VOICE、DMS、NAS、PBM、WMS、IMS、UIM等,以VOICEclient为例;初始化VOICEclient时绑定了回调函数qcril_qmi_voice_unsol_ind_cb。回调函数的作用是当modem有对应qmiclient的消息上报到qcril后触发对应的INDICATION事件。//VOICEclient回调函数处理如下:Qmiclient绑定的回调回调函数与之前的eventthread相互联系,用来处理modem上报的indication和command处理结果,实现方式如下图所示:161)当modem上报indication时,对应qmiclient的回调函数会触发相应的event。2)Event触发后,将event加入eventthread初始化时创建的eventlist,之后向eventthread初始化时创建的管道写端写入空数据,触发eventthread的select函数非阻塞。3)Eventthread中select返回之后,最后调用qcril_dispatch_event找到该event对应的handler去处理。4.3Oemsocketserver实现(保留,未修改)除了第一章的Androidrildsocket可以实现AP与modem交互外,高通扩展了另一个AP与modem交互的通道oemsocket;qmiclient初始化完成之后,如果判断支持feature:QMI_RIL_FEATURE_OEM_SOCKET,则继续进行oemsocketserver的初始化,流程如下:1)创建一个socket,bind相应的端口号,之后监听该socketfd。2)实现一个线程,在线程中使用accept阻塞监听等到客户端的connect请求3)当AP侧需要下发OEM相关消息,则使用connect函数来连接,accept监听到连接请求之后,recv读取该socket数据4)数据读取之后,调用process_incoming_message处理5)最后调用qcril_dispatch_event找到对应oem消息的处理函数去具体处理174.4qcril主要函数1)RILD下发的request主要使用到下面3个函数AP通过rild下发的request消息,onRequest为处理入口:onRequest(intrequest,void*data,size_tdatalen,RIL_Tokent);|----QCRILdispatchesRILcommandrequestandreturnimmediately|----QCRILmustcallonRequestComplete()whenoperationiscomplete判断AP下发的request是否支持:supports(intrequestCode)|----QCRILreturns1iftheRIL_REQUESTcommandissupported取消未执行完成的request:onCancel(RIL_Tokent)|----QCRILmakesbestattempttocancelpendingRILrequest|----Shouldreturnimmediatelyandnotwaitforcancellation|----QCRILmustcallonRequestCompletewhenfinished|----CalledfromaseparateRILDthreadfromtherequestthread2)Qcril向RILD返回command处理结果或上报消息主要使用下面2个函数Request执行完成之后,调用onRequestComplete向AP返回结果:onRequestComplete(RIL_Tokent,RIL_Errnoe,void*response,size_tresponselen)|----CalledbyQCRILwhenanRILrequestcommandiscomplete|----CalledbyQCRILwhencancellationiscompleteModem主动上报的indication处理后,调用onUnsolicitedResponse向AP上报:18onUnsolicitedResponse(intunsolResponse,constvoid*data,size_tdatalen)|----CalledbyQCRILwhenitreceivesanotificationthatshouldbepropagatedup4.5RIL基本处理流程4.5.1AP下发的request的基本处理流程QCRIL时序图.pdf1)RILJ通过ril_service.cpp下发request。2)ril_service.cpp通过CALL_ONREQUEST宏定义调用该onRequest函数,根据rild启动时获取的qcril的onRequest入口指针,将request传入qcril处理。3)Qcril中onRequest查找request的handler函数,交给对应的handler函数处理。4)对应的handler函数使用对应的qmiclient向modem下发request。5)Modem处理完成request之后,向qcril返回response消息。Qcril处理后向AP返回response,利用前面初始化的qcril_response_api,调用onRequestComplete来返回执行结果。6)onRequestComplete中调用其response函数,ril_commands.h中定义了request对应的dispatch和response函数。ril_commands.h如下:8)response函数中向RadioResponse.java中返回结果。4.5.2Modem主动上报消息基本处理流程19RIL时序图.pdfmodem主动上报indication到qcril,利用qcril_response_api调用OnUnsolicitedResponse来向AP上报。1)OnUnsolicitedResponse函数中调用对应的response函数,response函数映射表在Ril_unsol_commands.h文件中。ril_unsol_commands.h如下:3)response函数向RadioIndication.java上报相应消息。5RIL侧部分业务5.1RAT业务5.1.1代码结构RAT相关代码存储目录:/vendor/qcom/proprietary/qcril/qcril_qmi。注意在qcril目录下包含qcril_fusion目录,这个目录是高通废弃的,里面的文件不会用到。学习时要特别注意区别目录。5.1.2开机搜网流程开机注网时序图.pdfLTEattach信令流程.pdf5.1.3Voice相关处理流程205.1.3.1W下MO_MTCALL流程参考文档:W_MO_MTCALL.docx5.1.3.2CSFBMO_MTCALL流程参考文档:CSFB_MO&MTCALL.docx5.1.3.3VOLTEMO_MTCALL流程VOLTE-MO.pdfVOLTEMTCALL.docx5.1.4补充业务参考文档:SS.docx5.2DATA相关处理流程(保留,未修改)5.2.1代码存储位置DATA相关代码存储目录:/vendor/qcom/proprietary/qcril/common/data。这里仅是部分代码,还有大部分在/vendor/qcom/proprietary/data/。215.2.2发送DataCall请求流程(ril,qcril侧)1.流程图2.流程说明①RILJ-->Qcril:RILJ与RILC建立起socket连接后,在RILC中会对s_commands_event进行监听。当RILJ通过rildsocket向RILC发起RIL_REQUEST_SETUP_DATA_CALL请求时,s_commands_event通过func发起RIL事件的回调函数,即调用processCommandsCallback()。接着调用processCommandBuffer()先解包数据,然后再根据Ril_commands.h中的映射关系:{RIL_REQUEST_SETUP_DATA_CALL,dispatchDataCall,responseSetupDataCall}调用dispatchDataCall函数,在此函数通过CALL_ONREQUEST(pRI->pCI->requestNumber,pStrings,datalen,pRI,pRI->socket_id)调用Qcril中的onRequest函数。②Qcril-->Qcril_data_netctrl在Qcril的onRequest函数中调用qmi_ril_fw_android_request_render_execution(),在此函数中首先通过event_id查询对应的dispatchentry,然后判断request是否需要在dedicatedthread中处理,如果需要,则创建线程。DataCall不需要dedicatedthread,接着调用qcril_dispatch_event()来选择对应的handler来处理request,映射关系如下:22{QCRIL_REG_ALL_ACTIVE_STATES(RIL_REQUEST_SETUP_DATA_CALL,qcril_data_request_setup_data_call)}。③Qcril_data_netctrl-->Dsi_netctrl:进入qcril_data_request_setup_data_call()函数,第一步检查是否有有RIL_REQUEST_DEACTIVATE_DATA_CALL这个消息正在处理,如果有,则函数block,并返回错误。第二步解析params_ptr里的数据并判断其有效性,将APN及其他参数复制到info_tbl里。一个DataCall对应一个info_tbl,最多可以有20个。第三步通过dsi_get_data_srvc_hndl()获取info_tbl[i].dsi_hndl并设置回调函数qcril_data_net_cb,此回调函数在处理request的response时用到。第四步在APN和IP_FAMILY基础上查询3GPP和3GPP2的profileID。如果FEATURE_QCRIL_USE_QDP有定义,则调用qcril_data_apn_based_profile_look_up_using_qdp()函数,如果Feature没有定义,则调用qcril_data_apn_based_profile_look_up()函数。第五步如果ril_apn不等于null,则根据profileid和ril_apn设置datacall的参数(dsi_set_data_call_param()).如果ril_apn等于null,则使用RIL提供的profileid设置dsi_hndl。第六步调用qcril_data_set_nai()函数设置设置username,password,authpref的相关信息到info_tbl中。第七步设置IP_Family信息,V4,V6或者V4_V6兼容。第八步将request请求加入reqlist中第九步调用dsi_start_data_call()开始一个datacall。第十步设置一个setupdatacallrequest的定时器,当长时间(超过定时器设置的时间)没有收到req的response时,不再继续等待。④Dsi_netctrl-->Qmi_wds_srvc第一步在dsi_start_data_call()中,将dsi_hndl_t类型的hndl强制类型转换为dsi_store_t,具体结构如下:typedefstructdsi_store_s{dsi_net_ev_cbnet_ev_cb;/*caller/ownercallbackfunction*/void*user_data;/*caller/ownercookie*/23dsi_evt_payload_t*ev_payload;/*Cachedeventpayload*/dsi_priv_tpriv;/*privatedata*/intdsi_tech;/*ifuserprovidedspecifictechnology*otherthanCDMA/UMTS,usethisfield*tostoreit*/void*self;/*usedtovalidatedsi_stor_tptr*/}dsi_store_t;第二步在hndl有效的条件下,查找dsi_iface_id。第三步调用dsi_mni_start()函数来启动modemnetworkinterface。在此函数中会调用qdi_wds_start_nw_if()(Qdi.c)来bringup该datacall。第四步在qdi_wds_start_nw_if()中,先检查传入参数的有效性,接着判断datacall的IPFamily是V4还是V6,绑定相应的handle到ipfamily上。最后根据不同的ipfamily来调用qmi_wds_start_nw_if()函数。注意:这里分别创建了V4和V6的start_nw_if第五步在qmi_wds_start_nw_if()中,先判断user_cbfunction指针是否为NULL,如果为NULL,后面会调用同步发送函数。DataCall之前已经设定了user_cbfunction,因此调用的是异步发送函数qmi_service_send_msg_async()来发送QMI消息。5.2.3DataCall设置成功响应流程1.流程图242.流程说明①netmgr-->Dsi_netctrl_netmgr:Modem建立好DataCall,通过qmi消息AP侧。在netmgr中完成IP地址,MTU,DNS和Gateway的设置后,Netmgr会发送NET_PLATFORM_UP_EV事件。②Dsi_netctrl_netmgr-->Qcril_data_netctrl:回调函数dsi_process_netmgr_ev注册在dsi_netctrl_cb的线程中,负责处理来自netmgr的event。当收到NET_PLATFORM_UP_EV后,生成相应的dsi事件DSI_EVT_NET_IS_CONN,表示Call已经建立。除了NETMGR_READY_RESP事件,其他dsi事件都要通过dsi_netmgr_post_event()函数发给对应的client。具体由哪个client处理,决定于dsi的ifaceid。在dsi_notify_users(dsi_iface_id,event)函数中,通过来dsi_iface_id匹配dsi_store_table中存储的指向dsistore的指针(该指针是回调函数qcril_data_net_cb()的handle),通过该指针调用回调函数qcril_data_net_cb()。③Qcril_data_netctrl-->Qcril:qcril_data_post_dsi_netctrl_event()函数中,将QCRIL_EVT_DATA_EVENT_CALLBACK事件通过qcril_event_queue()放入qcril_event队列中,通过向管道写入空字符唤醒eventthread,进行eventdispatch。25在qcril中有如下映射:{QCRIL_REG_ALL_STATES(QCRIL_EVT_DATA_EVENT_CALLBACK,qcril_data_event_hdlr)},由qcril_data_event_hdlr()函数来处理事件。在qcril_data_event_hdlr()中我们首先得到pendingrequest,在同时满足caseDSI_EVT_NET_IS_CONN和pend_req==RIL_REQUEST_SETUP_DATA_CALL的条件下,首先停止response定时器(此定时器在setupdatacall时设置,目的是防止无response时会无限等待的情况出现),然后判断可用datacall的制式(UMTS,Evdoetc),接着获取并填充call相关的所有参数(如ip地址,call类型,设备名称等等),最后创建response并通过qcril_data_response_success()发送出去。④Qcril-->RIL:在qcril_data_response_success()中,经过qcril_send_request_response()和qmi_ril_fw_send_request_response_epilog(),最终调用qcril_response_api[instance_id]->OnRequestComplete()将response发送出去,qcril_response_api是RIL_Env的指针。⑤RIL-->RILJ:Qcril发出的request由Ril.cpp中的RIL_onRequestComplete()来处理(RIL_Env),在此函数中现将数据进行打包(parcel),经过sendResponse()和sendResponseRaw(),通过socket发往RILJ。RIL在初始化时,注册了reciver线程监听socket,一旦有数据上报,则在RILReciver::run()函数中处理,首先在readRilMessage()中对数据进行解包,然后在processResponse()中调用相应的函数来处理,在Ril_commands.h中定义了RIL_REQUEST_SETUP_DATA_CALL的response函数:{RIL_REQUEST_SETUP_DATA_CALL,dispatchDataCall,responseSetupDataCall},剩下的工作将由responseSetupDataCall来进行处理。5.3UIM相关业务(保留,未修改)5.3.1代码结构UIM相关代码存储目录:/vendor/qcom/proprietary/qcril/common/uim。UIM相关业务可以分成两个部分:UIMstatus(包括读写,文件管理等)和STK。26与STK相关的文件包括qcril_gstk_qmi.c和qcril_gstk_qmi.h。其他文件统一归为UIMstatus相关。在qcril.c中我们可以看到与UIM和STK相关的事件及请求。Uim相关的基本以qcril_uim_**开头,STK相关的基本以qcril_gstk_**开头。这些事件和请求的处理机制与前文中讲述的机制相同。5.3.2UIM相关的处理流程对于UIM来说,QCRIL层提供了一个透明通道,大部分主动命令从framework层发起,如PIN码操作,ICCIO操作等等,代码逻辑比较简单。本节将着重讲解如何通过qcril判断当前的卡状态,分卡状态更新上报流程和获取当前卡状态流程。1.卡状态更新上报流程modem->qmi_uim_srvcSIM卡初始化或状态发生改变时会上报当前卡状态,modem侧接收到卡状态变更消息后向qcril侧发送QMI_UIM_STATUS_CHANGE_IND_MSG_ID消息通知android侧SIM卡状态发生变更;qmi_uim_srvc->qcril_uim.c回调函数qmi_uim_srvc_indication_cb()在初始化时被注册专门用来处理QMI_UIM_SERVICE相关消息,包括QMI_UIM_STATUS_CHANGE_IND_MSG_ID和QMI_UIM_REFRESH_IND_MSG_ID。处理QMI_UIM_STATUS_CHANGE_IND_MSG_ID消息时调用qmi_uim_handle_get_card_status_rsp()解析卡上报的卡状态消息内容,然后调用指针函数qmi_srvc_client_info_table[con_id][bok_keep_srvc_id].user_ind_msg_hdlr()处理,该指针函数对应的是qcril_uim.c的qcril_uim_indication_cb()函数;27qcril_uim.c->qcril_uim_card.cqcril_uim_indication_cb()函数中调用qcril_uim_copy_indication()将消息内容复制出来,然后封装QCRIL_EVT_UIM_QMI_INDICATION事件通过qcril_event_queue()放入qcril_event队列中,通过向管道写入空字符唤醒eventthread,进行eventdispatch。在qcril中有如下映射:{QCRIL_REG_ALL_STATES(QCRIL_EV
/
本文档为【QCRIL_RIL_架构分析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索