详细说明Android手机的种种特性 |
本文标签:Android Android作为一个高效的.NET程序语言 。其混合了函数语言和物件导向程序编制语言,并且完美的适用于编程、算法、技术和探索性开发,因此可以在使用的过程当中感受到趣味性和吸引力 。 都依赖于include目录中ril.h头文件 。目前cupcake分支上带的是gsm的支持,另有一cdma分支,这里分析的是gsm驱动 。GSM模块,由于Modem的历史原因,AP一直是通过基于串口的AT命令与BB交互 。包括到了目前的一些edge或3g模块,或像omap这类ap,bp集成的芯片,已经使用了USB或其他等高速总线通信 。 但大多仍然使用模拟串口机制来使用AT命令 。这里的RIL(Radio Interface Layer)层,主要也就是基于AT命令的操作,如发命令,response解析等 。(gprs等传输会用到的MUX协议等在这里并没有包含,也暂不作介绍 。) 以下是详细分析,因为篇幅原因,会以连载形式发布出来(大概3篇),本文主要涉及基本架构和初始化的内容,首先介绍一下rild与libril.so以及librefrence_ril.so的关系: 1. rild: 2. libril.so: 3. librefrence_ril.so: 它转换来自libril.so的请求为AT命令,同时监控Modem的反馈信息,并传递回libril.so 。在初始化时, rild通过符号RIL_Init获取一组函数指针并以此与之建立联系 。 4. radiooptions: 接下来分析初始化流程,主入口是rild.c中的main函数,主要完成三个任务: 2. 初始化librefrence_ril.so,也就是跟硬件或模拟硬件modem通信的部分(后面统一称硬件), 通过RIL_Init函数完成 。 3. 通过RIL_Init获取一组函数指针RIL_RadioFunctions, 并通过RIL_register完成注册,并打开接受上层命令的socket通道 。 每个ril_event结构,与一个fd句柄绑定(可以是文件,socket,管道等),并且带一个func指针去执行指定的操作 。具体流程是: ril_event_init完成后,通过ril_event_set来配置一新ril_event,并通过ril_event_add加入队列之中(实际通常用rilEventAddWakeup来添加) 。 add会把队列里所有ril_event的fd,放入一个fd集合readFds中 。这样ril_event_loop能通过一个多路复用I/O的机制(select)来等待这些fd, 如果任何一个fd有数据写入,则进入分析流程processTimeouts(),processReadReadies(&rfds, n),firePending() 。 后文会详细分析这些流程,另外我们可以看到, 在进入ril_event_loop之前, 已经挂入了一s_wakeupfd_event, 通过pipe的机制实现的, 这个event的目的是可以在一些情况下,能内部唤醒ril_event_loop的多路复用阻塞 。 比如一些带timeout的命令timeout到期的时候 。至此第一个任务分析完毕,这样便建立起了基于event队列的消息循环,稍后便可以接受上层发来的的请求了(上层请求的event对象建立,在第三个任务中) 。 |