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

Android GSM驱动模块(rild)详细分析(一)基本架构及初始化

Android GSM驱动模块(rild)详细分析(二)request流程

Android GSM驱动模块(rild)详细分析(三)response流程

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

上篇最后说到 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;

更多相关文章

  1. Android(安卓)Service组件(1)
  2. Android(安卓)Media (Audio) Framework Analyse
  3. Android(安卓)NDK 使用第一步,编译c文件,声明jni并调用。
  4. android与Unity3d交互
  5. H5调用Android原生Api
  6. Android接入WebView(四)——浏览器书签与历史记录详细处理
  7. android 条形码的应用
  8. 详解 Android(安卓)的 Activity 组件【Z】
  9. 让android支持RTSP及live555分析

随机推荐

  1. Android(安卓)短信备份完整版
  2. [Android(安卓)Pro] proguard.cfg 配置文
  3. android 检查网络状态
  4. QQ上的tabhost效果
  5. android软键盘开关
  6. Android_Google android SDK源码(1)
  7. drawable animation 循环播放
  8. android开机自启广播无效果的曲线解决方
  9. Android(安卓)Studio安装配置
  10. android 3d页面跳转