Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9464802
  • 博文数量: 1750
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20091
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1750)

文章存档

2024年(26)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2009-12-01 11:18:51

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);

详细说明:
  1. mainloop中定义while (1) 循环, 其中打开GSM modem设备
  2. 创建一个独立线程, 执行 readerLoop (at_open()。
  3. 在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) |
给主人留下些什么吧!~~