- 论坛徽章:
- 0
|
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。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/90973/showart_2108090.html |
|