Android RIL源码研究笔记 の ril (一)

    Android源码目录hardware/ril/libril中总共包含5个C/CPP文件,它们分别是ril_commands.h、ril_unsol_commands.h、ril_event.h、ril_event.cpp和ril.cpp。这篇文章主要分析ril.cpp文件。

    我们可以将该文件划分为定义部分和实现部分,先来看定义部分:

#define LOG_TAG "RILC" #include <hardware_legacy/power.h> #include <telephony/ril.h> #include <telephony/ril_cdma_sms.h> #include <cutils/sockets.h> #include <cutils/jstring.h> #include <cutils/record_stream.h> #include <utils/Log.h> #include <utils/SystemClock.h> #include <pthread.h> #include <binder/Parcel.h> #include <cutils/jstring.h> #include <sys/types.h> #include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <time.h> #include <errno.h> #include <assert.h> #include <ctype.h> #include <alloca.h> #include <sys/un.h> #include <assert.h> #include <netinet/in.h> #include <cutils/properties.h> #include <ril_event.h> namespace android { #define PHONE_PROCESS "radio" #define SOCKET_NAME_RIL "rild" #define SOCKET_NAME_RIL_DEBUG "rild-debug" #define ANDROID_WAKE_LOCK_NAME "radio-interface" #define PROPERTY_RIL_IMPL "gsm.version.ril-impl" // match with constant in RIL.java #define MAX_COMMAND_BYTES (8 * 1024) // Basically: memset buffers that the client library // shouldn't be using anymore in an attempt to find // memory usage issues sooner. #define MEMSET_FREED 1 // 常见的获取数组元素个数的方法 #define NUM_ELEMS(a) (sizeof (a) / sizeof (a)[0]) // 返回两数中较小者 #define MIN(a,b) ((a)<(b) ? (a) : (b)) /* 回复类型:经过请求的回复和未经请求的回复*/ #define RESPONSE_SOLICITED 0 #define RESPONSE_UNSOLICITED 1 /* Negative values for private RIL errno's */ #define RIL_ERRNO_INVALID_RESPONSE -1 // request, response, and unsolicited msg print macro // 即打印缓冲区printBuf的大小 #define PRINTBUF_SIZE 8096 // Enable RILC log #define RILC_LOG 0 #if RILC_LOG // 三个宏的调用顺序是startRequest - printRequest - closeRequest // 这样打印出来的请求命令将包含在()中 #define startRequest sprintf(printBuf, "(") #define closeRequest sprintf(printBuf, "%s)", printBuf) #define printRequest(token, req) \ LOGD("[%04d]> %s %s", token, requestToString(req), printBuf) // 三个宏的调用顺序是startResponse - printResponse - closeResponse // 这样打印出来的回复信息将包含在{}中 #define startResponse sprintf(printBuf, "%s {", printBuf) #define closeResponse sprintf(printBuf, "%s}", printBuf) #define printResponse LOGD("%s", printBuf) #define clearPrintBuf printBuf[0] = 0 #define removeLastChar printBuf[strlen(printBuf)-1] = 0 #define appendPrintBuf(x...) sprintf(printBuf, x) #else #define startRequest #define closeRequest #define printRequest(token, req) #define startResponse #define closeResponse #define printResponse #define clearPrintBuf #define removeLastChar #define appendPrintBuf(x...) #endif // 唤醒类型:不唤醒,部分唤醒 enum WakeType {DONT_WAKE, WAKE_PARTIAL}; // "经过请求的回复"结构体定义:请求号,命令分发处理函数,返回结果响应函数 // 该结构体的取值见ril_commands.h文件 typedef struct { int requestNumber; void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI); int(*responseFunction) (Parcel &p, void *response, size_t responselen); } CommandInfo; //"未经请求的回复"结构体定义:请求号,事件响应函数,唤醒类型 // 该结构体的取值见ril_unsol_commands.h文件 typedef struct { int requestNumber; int (*responseFunction) (Parcel &p, void *response, size_t responselen); WakeType wakeType; } UnsolResponseInfo; // 请求信息结构体,封装CommandInfo,串成链表 typedef struct RequestInfo { int32_t token; //this is not RIL_Token CommandInfo *pCI; struct RequestInfo *p_next; char cancelled; char local; // responses to local commands do not go back to command process } RequestInfo; // 用户回调信息结构体 typedef struct UserCallbackInfo { RIL_TimedCallback p_callback; // 回调函数 void *userParam; // 回调函数的参数 struct ril_event event; // ril event struct UserCallbackInfo *p_next; // 指向下一个回调信息结构(链表形式) } UserCallbackInfo; /*******************************************************************/ // 初始化回调结构 RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL}; static int s_registerCalled = 0; static pthread_t s_tid_dispatch; // 分发处理线程ID static pthread_t s_tid_reader; // 读者线程ID static int s_started = 0; // 文件描述符初始化 static int s_fdListen = -1; static int s_fdCommand = -1; static int s_fdDebug = -1; static int s_fdWakeupRead; static int s_fdWakeupWrite; // 5个相关的事件 static struct ril_event s_commands_event; static struct ril_event s_wakeupfd_event; static struct ril_event s_listen_event; static struct ril_event s_wake_timeout_event; static struct ril_event s_debug_event; static const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0}; // 初始化互斥量和条件变量 static pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER; static RequestInfo *s_pendingRequests = NULL; static RequestInfo *s_toDispatchHead = NULL; static RequestInfo *s_toDispatchTail = NULL; static UserCallbackInfo *s_last_wake_timeout_info = NULL; static void *s_lastNITZTimeData = NULL; static size_t s_lastNITZTimeDataSize; #if RILC_LOG static char printBuf[PRINTBUF_SIZE]; // 缓存打印信息的数组 #endif /*******************************************************************/ // dispatch*系列函数是基带处理器对应用处理器请求的处理函数 static void dispatchVoid (Parcel& p, RequestInfo *pRI); static void dispatchString (Parcel& p, RequestInfo *pRI); static void dispatchStrings (Parcel& p, RequestInfo *pRI); static void dispatchInts (Parcel& p, RequestInfo *pRI); static void dispatchDial (Parcel& p, RequestInfo *pRI); static void dispatchSIM_IO (Parcel& p, RequestInfo *pRI); static void dispatchCallForward(Parcel& p, RequestInfo *pRI); static void dispatchRaw(Parcel& p, RequestInfo *pRI); static void dispatchSmsWrite (Parcel &p, RequestInfo *pRI); static void dispatchCdmaSms(Parcel &p, RequestInfo *pRI); static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI); static void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI); static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI); static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI); // response*系列函数是应用处理器对基带处理器消息的响应函数 // 包括请求回复响应函数和事件响应函数 static int responseInts(Parcel &p, void *response, size_t responselen); static int responseStrings(Parcel &p, void *response, size_t responselen); static int responseString(Parcel &p, void *response, size_t responselen); static int responseVoid(Parcel &p, void *response, size_t responselen); static int responseCallList(Parcel &p, void *response, size_t responselen); static int responseSMS(Parcel &p, void *response, size_t responselen); static int responseSIM_IO(Parcel &p, void *response, size_t responselen); static int responseCallForwards(Parcel &p, void *response, size_t responselen); static int responseDataCallList(Parcel &p, void *response, size_t responselen); static int responseRaw(Parcel &p, void *response, size_t responselen); static int responseSsn(Parcel &p, void *response, size_t responselen); static int responseSimStatus(Parcel &p, void *response, size_t responselen); static int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen); static int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen); static int responseCdmaSms(Parcel &p, void *response, size_t responselen); static int responseCellList(Parcel &p, void *response, size_t responselen); static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen); static int responseRilSignalStrength(Parcel &p,void *response, size_t responselen); static int responseCallRing(Parcel &p, void *response, size_t responselen); static int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen); static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen); // 将数据结构信息转换成字符串输出 extern "C" const char * requestToString(int request); extern "C" const char * failCauseToString(RIL_Errno); extern "C" const char * callStateToString(RIL_CallState); extern "C" const char * radioStateToString(RIL_RadioState); #ifdef RIL_SHLIB extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data, size_t datalen); #endif static UserCallbackInfo * internalRequestTimedCallback (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime); /** Index == requestNumber */ // 很不错的一个用法,由于数组元素太多,为了代码的整洁清晰, // 将数组元素的定义放在一个单独的头文件中,并用#include进来即可 static CommandInfo s_commands[] = { #include "ril_commands.h" }; static UnsolResponseInfo s_unsolResponses[] = { #include "ril_unsol_commands.h" };


To Be Continued

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载]Manually configuring Microsoft Internet Information Services (IIS)

Manually configuring Microsoft Internet Information Services (IIS) 原文摘自http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic/com.ibm.websphere.base.doc/info/aes/ae/tins_manualWebIIS.html This topic describes manual configuration setti…

生活中的计算机趣味知识大全,五个有趣的电脑小知识

五个有趣的电脑小知识1&#xff0c; 更改临时文件夹的路径问&#xff1a;我使用的系统为Windows XP&#xff0c;我想把系统临时文件(Temp文件)存放区由C盘移到其他分区(如D盘)&#xff0c;请问该如何*作&#xff1f;答&#xff1a;在“我的电脑上点鼠标右键&#xff0c;选择“属…

稚晖君又整活啦!基于全志F1C200s的超迷你

转自全志在线B站最强小电视&#xff08;基于全志H3&#xff09;钢铁侠机械臂曾经靠着“B站最强小电视”以及号称“钢铁侠机械臂”等硬核产品出圈的稚晖君又双叒叕来整活啦&#xff01;稚晖君B站首页这次稚晖君开源了基于全志F1C200s的一个超迷你&低成本的Linux开发板&#…

分布式为什么使用Redis

一 为什么使用 Redis 在项目中使用 Redis&#xff0c;主要考虑两个角度&#xff1a;性能和并发。如果只是为了分布式锁这些其他功能&#xff0c;还有其他中间件 Zookpeer 等代替&#xff0c;并非一定要使用 Redis。 性能&#xff1a; 如下图所示&#xff0c;我们在碰到需要执行…

手动添加mysql服务

重新安装系统以后不再重新安装mysql 只需要我们把mysql服务添加到系统服务里即可,一下是具体步骤: 安装mysql服务 新建并编辑内容如下的一个bat文件&#xff0c;并且执行&#xff08;盘符:\mysql\bin\mysqld-nt.exe为安装目录&#xff0c;按实际情况填写,如果安装路径里面有空格…

心情

今天有些沮丧。 突然想起一句话&#xff1a; 千山暮雪&#xff0c;形影相吊&#xff01; 不知道是因为想起这句话才沮丧&#xff0c;还是因为心情差才想起这句话。 转载于:https://www.cnblogs.com/armlinux/archive/2006/12/20/2391047.html

微型计算机突然断电什么信息全部都是,微型计算机的硬件组成阶段作业(函授2014春).doc...

微型计算机的硬件组成阶段作业(函授2014春)微型计算机的硬件组成一、单项选择题(共15道小题&#xff0c;共15.0分)下列叙述中&#xff0c;错误的一个是个人微型计算机键盘上的Ctrl键是起控制作用的&#xff0c;它必须与其他键同时按下才有作用个人微型计算机在使用过程中突然断…

困扰多年的PCB散热问题终于可以解决了!

做电子的同学应该都会知道电路板&#xff0c;电路板分为基板导电部分组成。如下图&#xff0c;我们普通的单层电路板是一块有机材料加上导电铜层组成的。在大学那会我们会用面包板来做一些基础的实验&#xff0c;用面包板做实验可以减少打PCB板的时间&#xff0c;因为制作一个P…

进程之间的通信方式-共享内存

共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法&#xff0c;一个进程向共享内存区域写入了数据&#xff0c;共享这个内存区域的所有进程就可以立刻看到其中的内容。原理图如下&#xff1a; 共享内存的实现分为两个步骤&#xff1a; 一、…

第4天:调用样式表

用web标准设计网站&#xff0c;过渡的方法主要是采用XHTMLCSS&#xff0c;css样式表是必不可少的。这就要求所有网页设计师必须熟练掌握CSS&#xff0c;如果你以前不常用&#xff0c;那么现在就开始学习吧。要制作符合web标准的网站&#xff0c;不懂CSS是设计不出漂亮的页面的。…

获取url参数值(可解码中文值)

/*** 根据指定参数名称获取参数值* param {String} urlStr 参数名称* return {Object} 参数值* */ getUrlParams function (urlStr) {// 获取url中"?"符后的字串let url urlStr || location.href;let params {};if (url.indexOf(?) ! -1) {let str url.sub…

和一个刚毕业不久的朋友聊天

我记得还在你上大学的时候&#xff0c;我们就开始联系了&#xff0c;想不到的是你已经毕业半年多。我相信每个人都会有经历从学生到工作的过程&#xff0c;当然肯定也会因为工作后面对很多不一样的人和事&#xff0c;我也希望能够通过我们的一次对话&#xff0c;让没有毕业的同…

大工奥鹏计算机在线作业,大工20春《计算机网络技术》在线作业1题目【标准答案】...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼大工20春《计算机网络技术》在线作业1试卷总分:100 得分:100一、单选题 (共 10 道试题,共 50 分)1.网络协议是通信双方必须遵守的事先约定好的规则,一个网络协议由语法、语义和 ( ) 三部分组成。A.逆序B.次数C.时序D.词序2.运输层的…

xflash里的hello world程序

下面是hello world实例&#xff0c;虽然看起来与html里的按钮一样&#xff0c;但是&#xff0c;xflash里所有的元素都和页面无关&#xff0c;是纯flash的。从代码看&#xff0c;使用起来还是比较简单的&#xff0c;只需要包含xflash.js文件就可以满足进一步的开发要求了。 具体…

ListView中convertView和ViewHolder的工作原理

w和Adapter参考&#xff1a;http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html工作原理&#xff1a;1.ListView针对List中每个item&#xff0c;要求adapter给我一个视图(getView)2.一个新的视图被返回并显示如果我们有上亿个item要显示怎么办&#xff1f;为每…

简单的for()循环使用方式foreach

知识点&#xff1a; 1、foreach使用。 2、小数随机数的生成&#xff0c;Random.nextFloat()。 3、将字符串转化为字符数组&#xff0c;String.toAharArray()。 Java SE5引入了一种新的更加简洁的for语法用于数组和容器&#xff0c;即foreach语法&#xff0c;表示不必创建int变量…

RTOS 任务间互斥的难题

作者 | strongerHuang微信公众号 | 嵌入式专栏在基于RTOS开发项目时&#xff0c;通常都会遇到互斥的情况&#xff0c;比如&#xff1a;几个任务都要使用一个UART串口进行发送数据。如果不加互斥锁&#xff0c;优先级高的任务&#xff0c;会抢占串口并发送数据&#xff0c;则有可…

武汉工程大学计算机学院研究生难吗,武汉工程大学考研难吗?一般要什么水平才可以进入?...

问&#xff1a;从武汉工程大学毕业的学生就业怎么样&#xff1f;值不值得报考&#xff1f;答&#xff1a;2020年武汉工程大学就业质量报告未公布&#xff0c;从2019年武汉工程大学就业质量报告来看&#xff1a;2019届硕士毕业生就业463人&#xff0c;就业率为95.66%。2019届研究…

android中绘图Paint.setAntiAlias()和Paint.setDither()方法的作用

转载&#xff1a;http://blog.csdn.net/lovexieyuan520/article/details/50732023 在自定义View中&#xff0c;这两个Paint.setAntiAlias()和Paint.setDither()方法用的很多&#xff0c;都只有一个boolean值&#xff0c;作用大家未必清楚&#xff0c;今天抽了点时间研究下&…

简单分析STM32和51的区别

分享本文&#xff0c;简单分析STM32与51单片机的区别与取舍之处。单片微型计算机简称单片机&#xff0c;简单来说就是集CPU&#xff08;运算、控制&#xff09;、RAM&#xff08;数据存储-内存&#xff09;、ROM&#xff08;程序存储&#xff09;、输入输出设备&#xff08;串口…