Android RIL源码分析(1)

第一部分, c/c++代码

Android系统源代码目录里面: hardware/ril 目录包含了所有有关于telephony的底层代码.

1.目录架构(20101215的git版本):

ril

|-- CleanSpec.mk

|-- include

|
|-- telephony

|
|-- ril_cdma_sms.h

//CDMA SMS

|
|-- ril.h
//Android RIL 框架的一些接口和数据结构

|-- libril

|
|-- Android.mk

|
|-- MODULE_LICENSE_APACHE2

|
|-- NOTICE

|
|-- ril_commands.h
//RIL命令列表

|
|-- ril.cpp

|
|-- ril_event.cpp

|
|-- ril_event.h

|
|-- ril_unsol_commands.h
//RIL 主动上报信息列表

|-- reference-cdma-sms

|
|-- Android.mk

|
|-- reference-cdma-sms.c

|
|-- reference-cdma-sms.h

|-- reference-ril

|
|-- Android.mk

|
|-- atchannel.h
//负责向modem读写数据

|
|-- atchannel.c

|
|-- at_tok.h

|
|-- at_tok.c

|
|-- misc.h

|
|-- misc.c

|
|-- MODULE_LICENSE_APACHE2

|
|-- NOTICE

|
|--
reference-ril.c
//主要负责与modem进行交互

|-- rild


|-- Android.mk


|-- MODULE_LICENSE_APACHE2


|-- NOTICE


|-- radiooptions.c

//调试时配置Modem参数


|-- rild.c
//RIL守护进程

其中include/telephony目录下面的ril.h文件,定义了104个如下的宏:


RIL_REQUEST_XXXX

这些宏代表客户进程向Android telephony发送的命令,包括SIM卡相关的功能,打电话,发短信,网络信号查询等等。

2.目录hardware/ril/libril

本目录下代码负责与客户进程进行交互。在接收客户进程命令后,调用相应函数进行处理,然后将命令响应结果传回客户进程。在收到来自网络端的事件后,也传给客户进程。

v
文件ril_commands.h:列出了telephony可以接收的命令;每个命令对应的处理函数;以及命令响应的处理函数。

v
文件ril_unsol_commands.h:列出了telephony可以接收的事件类型;对每个事件的处理函数;以及WAKEType???

v
文件ril_event.h/cpp:处理与事件源(端口,modem等)相关的功能。ril_event_loop监视所有注册的事件源,当某事件源有数据到来时,相应事件源的回调函数被触发(firePending-> ev->func())

v
文件ril.cpp:

Ø
RIL_register函数:打开监听端口,接收来自客户进程的命令请求(s_fdListen
=android_get_control_socket(SOCKET_NAME_RIL);),当与某客户进程连接建立时,调用listenCallback函数;创建一单独线程监视并处理所有事件源(通过ril_event_loop)

Ø
listenCallback函数:当与客户进程连接建立时,此函数被调用。此函数接着调用
processCommandsCallback处理来自客户进程的命令请求

Ø
processCommandsCallback函数:具体处理来自客户进程的命令请求。对每一个命令,ril_commands.h中都规定了对应的命令处理函数(dispatchXXX),processCommandsCallback会调用这个命令处理函数进行处理。

Ø
dispatch系列函数:此函数接收来自客户进程的命令己相应参数,并调用onRequest进行处理。

Ø
RIL_onUnsolicitedResponse函数:将来自网络端的事件封装(通过调用responseXXX)后传给客户进程。

Ø
RIL_onRequestComplete函数:将命令的最终响应结构封装(通过调用responseXXX)后传给客户进程。

Ø
response系列函数:对每一个命令,都规定了一个对应的response函数来处理命令的最终响应;对每一个网络端的事件,也规定了一个对应的response函数来处理此事件。response函数可被onUnsolicitedResponse或者onRequestComplete调用。

3. 目录hardware/ril/reference-ril分析:

本目录下代码主要负责与modem进行交互。

v
文件reference-ril.c:此文件核心是两个函数:onRequest和onUnsolicited

Ø
onRequest 函数:在这个函数里,对每一个RIL_REQUEST_XXX请求,都转化成相应的ATcommand,发送给modem,然后睡眠等待。当收到此ATcommand的最终响应后,线程被唤醒,将响应传给客户进程(RIL_onRequestComplete-> sendResponse)。

Ø
onUnsolicited函数:这个函数处理modem从网络端收到的各种事件,如网络信号变化,拨入的电话,收到短信等。然后将时间传给客户进程(RIL_onUnsolicitedResponse -> sendResponse)

v
文件atchannel.c:负责向modem读写数据。其中,写数据(主要是ATcommand)功能运行在主线程中,读数据功能运行在一个单独的读线程中。

Ø
at_send_command_full_nolock函数:运行在主线程里面。将一个ATcommand命令写入modem后进入睡眠状态(使用pthread_cond_wait或类似函数),直到modem读线程将其唤醒。唤醒后此函数获得了ATcommand的最终响应并返回。

readerLoop函数: 运行在一个单独的读线程里面,负责从modem中读取数据。读到的数据可分为三种类型:网络端传入的事件;modem对当前ATcommand的部分响应;modem对当前AT command的全部响应。对第三种类型的数据(ATcommand的全部响应),读线程唤醒(pthread_cond_signal)睡眠状态的主线程。

你可能感兴趣的:(Android RIL源码分析(1))