android QMI机制---Qcril初始化流程
来源:互联网 发布:360如何优化系统 编辑:程序博客网 时间:2024/06/13 16:30
3, Qcril初始化流程
rild守护进程的rild.c文件中main方法有关加载动态库代码如下,
dlHandle = dlopen(rilLibPath, RTLD_NOW);//加载库•••funcs = rilInit(&s_rilEnv, argc, rilArgv);//初始化 实际调用的是RIL_Init方法
s_rilEnv结构体定义如下,也就是qcril.c可以回调ril的方法
static struct RIL_Env s_rilEnv = { RIL_onRequestComplete, RIL_onUnsolicitedResponse, RIL_requestTimedCallback};
Android平台不同厂商的AP侧可以相同,但是Modem侧肯定会有很大的差异,RIL层要解决一个问题
就是适配不同厂商的Modem,为了达到兼容性要求,android在AP与Modem之间搭建了RILC的框架,
由不同的Modem厂商将自己的协议连接到AP侧。对于高通平台来说,RILC就是QCRIL。
qcril.c的RIL_Init方法主要步骤如下,
//设置线程的名字qmi_ril_set_thread_name( pthread_self() , QMI_RIL_QMI_RILD_THREAD_NAME);//初始化接收Modem消息的EventLoopqcril_event_init();// 初始化QCRIL各个模块qcril_init(c_argc, c_argv);// 启动线程qcril_event_start();//其他初始化qmi_ril_initiate_bootup();//返回接口函数return &qcril_request_api[ QCRIL_DEFAULT_INSTANCE_ID ];
初始化流程图如下,
3.1初始化EventLoop过程
在Qcril中搭建了EventLoop循环用于检测Modem上报的消息,而EventLoop机制的初始化工作是在
qcril_event_init()中完成的。
qcril_event.c的qcril_event_init方法主要部分如下,
//创建线程,入口方法为qcril_event_mainret = pthread_create(&qcril_event.tid, &attr, qcril_event_main, NULL);•••//设置线程的名字为eventqmi_ril_set_thread_name(qcril_event.tid, QMI_RIL_EVENT_THREAD_NAME);
在初始化过程中,通过pthread_create()函数创建了EventLoop线程,并且指出该线程的入口方法为
qcril_event_main(),主要逻辑如下,
qcril_event_init_list(&qcril_event.list); //初始化qcril_event.list链表 •••ret = pipe(filedes); //创建管道 •••while (qcril_event.started < 2) //阻塞等待qcril初始化 { QCRIL_LOG_VERBOSE("Event thread waiting for started == 2 (%d)", qcril_event.started ); pthread_cond_wait(&qcril_event_startupCond, &qcril_event.startup_mutex); }•••for (;;) // for循环读取qmi底层发送的请求 {•••//阻塞等待接收内容 n = select(qcril_event.fdWakeupRead + 1, &rfds, NULL, NULL, NULL);•••do //读取qmi内容 { ret = read(qcril_event.fdWakeupRead, &buff, sizeof(buff));•••//处理qmi发送的请求err_no = qcril_process_event( ev->instance_id, ev->modem_id, ev->event_id, ev->data, ev->datalen, ev->t );•••
在以上过程中,完成qcril_event.list链表的初始化,然后通过pthread_cond_wait进入阻塞状态,当被
解锁后以及进入EventLoop循环,检测到事件后,通过qcril_process_event处理。
3.2初始化qcril各个模块
Qcril在接到RILC的请求后,需要根据请求的类型将消息派发给不同的负责模块,而qcril_init()就是完成
各个模块的初始化工作。
qcril_init方法部分代码如下,
qcril_arb_init(); qcril_init_state(); qmi_ril_oem_hook_init(); qcril_db_init(); qcril_init_hash_table();//初始化Event table qcril_reqlist_init(); •••
在这里对qcril的各个模块进行初始化。其中完成了很重要的一步就是将qcril_event_table表拷贝给
qcril_hash_table,用于onRequest时对各种请求进行处理, qcril_init_hash_table方法如下,
for (reg_index = 0; reg_index < QCRIL_ARR_SIZE( qcril_event_table ); reg_index++) •••qcril_hash_table[hash_index] = &qcril_event_table[reg_index]; •••
qcril_event_table是一个静态表单,里面保存了所有RILC中下发请求的ID以及相应的处理函数,表单部分内容如下,
{ QCRIL_REG_ALL_STATES( QCRIL_EVT_UIM_QMI_COMMAND_CALLBACK, qcril_uim_process_qmi_callback ) },
里面每一项都包含两个元素:事件ID和处理函数,在处理这些消息时将会根据事件的ID查找并执行相应的处理函数。
比如,对于得到当前SIM卡状态这个请求,对应的ID为RIL_REQUEST_GET_SIM_STATUS,而其处理方法为
qcril_uim_request_get_sim_status。
3.3 EventLoop线程启动
初始化EventLoop时,在完成其链表的初始化过程后,通过pthread_cond_wait()将其阻塞,而现在要做的就是取消
其阻塞状态,使其进入消息检测循环。这是在qcril_event_start方法中完成的,
void qcril_event_start( void ){ QCRIL_MUTEX_LOCK( &qcril_event.startup_mutex, "[Main Thread] qcril_event.startup_mutex" );qcril_event.started = 2; //更新状态 pthread_cond_broadcast(&qcril_event_startupCond);//释放EventLoop锁QCRIL_MUTEX_UNLOCK( &qcril_event.startup_mutex, "[Main Thread] qcril_event.startup_mutex" );}
由于EventLoop被初始化后一直处于阻塞状态,所以在这里将started状态置为2后,对qcril_event_startupCond
进行解锁,从而使EventLoop进入循环。
3.4其他初始化过程
在qmi_ril_initiate_bootup方法如下,
qcril_setup_timed_callback( QCRIL_DEFAULT_INSTANCE_ID,QCRIL_DEFAULT_MODEM_ID, qmi_ril_bootup_perform_core_or_start_polling, NULL,NULL );
qmi_ril_bootup_perform_core_or_start_polling方法部分代码如下,
init_res = qmi_ril_core_init();//qmi初始化
qmi_ril_core_init方法调用qcril_qmi_client_init方法完成qcril客户端的初始化。
res = qcril_qmi_client_init();
3.5将回调函数注册给RILC
在Qcril的初始化完毕后,将自己的函数列表返回给RilC,也就是qcril_request_api:
static const RIL_RadioFunctions qcril_request_api[] = {{ RIL_VERSION, onRequest_rid, currentState_rid, onSupports_rid, onCancel_rid, getVersion_rid }};
这样的话,在RIL中调用的接口就会进入该函数列表中进行处理。
这样准备工作就完成了。
- android QMI机制---Qcril初始化流程
- android QMI机制---QCRIL消息发送
- Android 学习之QCRIL QMI
- RILD及qcril初始化流程
- android QMI机制---概论
- android QMI机制---QMUX
- android QMI机制---底层消息发送
- android QMI机制---Modem消息接收
- android QMI机制---modem消息发送
- Qualcomm平台qcril初始化及消息处理流程(原)
- Qualcomm平台qcril初始化及消息处理流程
- Qualcomm平台qcril初始化及消息处理流程
- Android Qcril
- framework学习之Qualcomm平台qcril初始化及消息处理流程
- qcril
- qcril
- Qcril
- Android/Bluetooth 初始化流程
- Scala的单例对象
- 【笔记】《重构-改善既有代码的设计》
- 文章标题 javap理解
- 决策树
- Django-数据库中常用的过滤操作
- android QMI机制---Qcril初始化流程
- SAE J1939 协议入门前须知(一)
- 微积分1:求极限
- JDK5并发(1) Locks-AQS
- 一些面试问题
- 2017年7月3日22:17:38
- 大话设计模式概括
- HDU1257题解
- 高偏差/低偏差,学习曲线,模型选择