当前位置:操作系统 > 安卓/Android >>

Android call setting 源码分析 从顶层到底层(下)

看下篇之前,请先读这三篇文章:

 

 

 Android GSM驱动模块(rild)详细分析(一)基本架构及初始化http://www.zzzyk.com/kf/201201/116966.html

 Android GSM驱动模块(rild)详细分析(二)request流程http://www.zzzyk.com/kf/201201/116967.html

 Android GSM驱动模块(rild)详细分析(三)response流程http://www.zzzyk.com/kf/201201/116968.html

 这几篇分析了android 的 GSM 也就是 RIL 部分的驱动。我这篇文章也就是建立在这个基础上的。

 

 上篇http://www.zzzyk.com/kf/201201/116969.html最后说到 framework 最后通过 socket 给底层发信息来沟通,有一个守护进程来接收信息,这个进程就是 rild。具体的代码在/hardware/ril 下面。代码结构和流程的介绍上面3篇文章都已说明,这里只是通过call setting 中 caller ID 的设置来追踪代码的完整流程。

 

request:

 framework 发送信息后, rild 进程先select 到,然后进入 ril.cpp中的 listenCallback,有数据就进入 processCommandsCallback 回调函数,再调用 processCommandBuffer,这里调用pRI->pCI->dispatchFunction 来最终处理数据。

 pRI是一个CommandInfo结构,初始化的内容在 /hardware/ril/libril/ril_commands.h 中。上篇说到要处理的是 RIL_REQUEST_SET_CLIR,从{RIL_REQUEST_SET_CLIR, dispatchInts, responseVoid} 可知要调用的dispatchFunction 就是dispatchInts。在ril.cpp 中的 dispatchInts 函数最终是调用 s_callbacks.onRequest 来处理请求。s_callbacks 是一个RIL_RadioFunctions,它的初始化是在/hardware/ril/reference-ril/reference-ril.c:

 static const RIL_RadioFunctions s_callbacks = {
      RIL_VERSION,
      onRequest,
      currentState,
      onSupports,
      onCancel,
      getVersion
 };

 同一文件中的 onRequest 处理上层发来的信息,简单点的指令就直接调用at_send_command 发指令给 simcard,复杂点的就分发

到requestXXX函数来处理,不过最终还是调用at_send_command来写入 AT 指令。

 at_send_command 相关的函数都在/hardware/ril/reference-ril/atchannel.c 中。at_send_command ->

at_send_command_full -> at_send_command_full_nolock -> writeline,这个writeline 最终调用 write 来把信息写到设备中。

 对了,onRequest中是如何处理RIL_REQUEST_SET_CLIR的?

 case RIL_REQUEST_SET_CLIR:
            //TO DO
        break;

  ...饿滴神,怎么来个TO DO...看样子是要等咱自己来写了(我说android手机咋那么少)。

 

 指令写进去后要把结果传出来,这就是response的流程了。开头提到的文章写的很不错,这里也不赘述了(反正我要的代码又

没写...)。

作者 liujian885

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,