在事件循环中, 由listenCallback监听ril事件(即上层发送代表at命令的ril事件), listenCallback注册processCommandsCallback回调函数, processCommandsCallback->processCommandBuffer对事件解析, s_commands设置了事件与事件处理函数的对应关系,processCommandBuffer由s_commands找到该事件的处理函数, 并调用之. 该处理函数调用reference_ril.cpp->onrequest()->at_send_command->writeline向串口发送at命令.
相关文件: Atchannel.c(readline()读取串口发来的对at命令的处理结果)readerLoop()调用readline()获取结果, 根据是是否为urc做不同处理, urc为远程进程对modem发送的at命令的处理结果.在reference-ril.cpp 中由at_open()注册的onUnsolicited函数完成对串口发来的at结果的处理, onUnsolited->RIL_onUnsolicitedResponse(实现在ril.cpp中)由s_unsolResponses数组获取对结果的处理函数, s_unsolResponses为处理ril结果的数组(即接收),s_commands为处理ril命令的数组(即发送). solicited表示等待对请求处理的一种等待状态。
术语:
fd
文件描述符 unix pipe
管道 unix cond
一般是condition variable的缩写 tty
通常使用tty来简称各种类型的终端设备 unsolicited response
被动请求命令来自baseband event loop
的消息队列机制,由unix的系统调用select()实现 android init.rc
守护进程启动后被执行的启动脚本。 init HAL
硬件抽象层(Hardware Abstraction Layer,HAL)
android的ril位于应用程序框架与内核之间,分成了两个部分,一个部分是rild,它负责socket与应用程序框架进行通信。另外一个部分是Vendor RIL,这个部分负责向下是通过两种方式与radio进行通信,它们是直接与radio通信的AT指令通道和用于传输包数据的通道,数据通道用于手机的上网功能。
对于RIL的java框架部分,也被分成了两个部分,一个是RIL模块,这个模块主要用于与下层的rild进行通信,另外一个是Phone模块,这个模块直接暴露电话功能接口给应用开发用户,供他们调用以进行电话功能的实现