• Android call setting 源码分析


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

     

     

    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;

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

     

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

    没写...)。

  • 相关阅读:
    Mysql InnoDB引擎下 事务的隔离级别
    Spring 两大核心 IOC 和 AOP
    java 冒泡排序
    MyBatis 传入List集合作为条件查询数据
    fastfusion运行
    数据集
    工具学习
    三维重建
    Scrivener破解
    博客园设置
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3165604.html
Copyright © 2020-2023  润新知