LOCAL_SRC_FILES:= \
reference-ril.c \
atchannel.c \
misc.c \
at_tok.c
LOCAL_SHARED_LIBRARIES := \ libcutils libutils libril
ifeq (foo,foo) #build shared library LOCAL_SHARED_LIBRARIES += \ libcutils libutils LOCAL_LDLIBS += -lpthread LOCAL_CFLAGS += -DRIL_SHLIB LOCAL_MODULE:= libreference-ril include $(BUILD_SHARED_LIBRARY) else #build executable LOCAL_SHARED_LIBRARIES += \ libril LOCAL_MODULE:= reference-ril include $(BUILD_EXECUTABLE) endif
|
通过Android.mk的部分内容看出,
reference-ril可以编成库形式,也可以编成可执行程序。无论是so还是exe都是可执行的,流程肯定都类似,所以我们从exe角度去分析程序。
1. reference-ril 命令行参数: -p or -d /dev/tty_device,
对于一般的终端采用的是通过串口来操纵GSM modem的,所以一般的命令行参数是采用的 -d /dev/ttySx 的形式。
2. 注册回调函数组
static const RIL_RadioFunctions s_callbacks = {
RIL_VERSION,
onRequest,
currentState,
onSupports,
onCancel,
getVersion
};
RIL_register(&s_callbacks); //ril.c文件中, libril.so中的接口
|
3. 进入循环 mainLoop(NULL);
详细说明:
- mainloop中定义while (1) 循环, 其中打开GSM modem设备
- 创建一个独立线程, 执行 readerLoop (at_open()。
- 在readerLoop线程中(ATChannel.c). 不断从modem对应串口中读出GSM模块返回的信息,并进行处理。
if(isSMSUnsolicited(line)) {
s_unsolHandler (line1, line2);
}
else {
processLine(line);
}
|
其中详尽的内容可以进一步跟踪。
如果按照库的形式分析本单元可以得到从GSM modem 串口发送的接口 (at_send_command_xxx 系列函数)
综述: librefrence.so主要负责跟Modem硬件通信,是需要直接操作硬件的。 它转换来自libril.so的请求为AT命令给GSM modem,同时监控GSM的反馈信息,并传递回libril.so。
阅读(3005) | 评论(0) | 转发(0) |