您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页Radio Interface Layer v1_1

Radio Interface Layer v1_1

来源:华佗小知识


Radio Interface Layer

编号:

Radio Interface Layer

文档编号: 编 撰: 审 核: 批 准:

项目名称: 编撰日期: 审核日期: 批准日期:

3508 2003-10-29 YYYY-MM-DD YYYY-MM-DD

Company confidential 1/1

Radio Interface Layer

编号:

Radio Interface Layer

第一章 概述

RIL(Radio Interface Layer)是微软针对各种不同的无线通讯模块/硬件,而提出的一种软件

解决方案。作为一种硬件适配层(Hardware Adaptation Layer), RIL屏蔽了各种不同的无线通讯模块硬件对整个系统软件的影响。对于应用程序开发者来说,在开发时他不需要考虑具体的通信模块的硬件情况;而且即使换了新的通信模块,也不需要应用程序的代码。事实上,另一个手机巨头Motorola在他的i.smart手机解决方案中,也提出了类似的概念;他将整个手机系统分为两个子系统,一个是Radio子系统,另一个是应用子系统。两个子系统之间用标准的UART通信。这两种方案实际上都是将手机中RF, BB, 无线协议处理栈部分出来,组成一个相对的“无线modem模块”,从而最大化的减少通信模块对整个系统的影响。(当然,RIL也是MS进入手机/PDA领域,避开自己弱项的一种绝好方案)

对于开发人员来说,RIL就是一套API函数。这套API函数实现所有需要跟GSM/CDMA网络交换信息的功能,包括语音、数据、SMS等。他的功能基本上是基于GSM spec. 07.05和07.07 GSM AT接口的基础上。在具体的实现中,OEM可以选择用AT COMMAND来实现,也可以用别的方法来实现。

第二章 整体框架

RIL从实现上讲可以分为两层,一层是RIL Proxy层,另一层是RIL Driver层。Proxy层与硬件无关,且针对不同的硬件有不同的Proxy;Driver层与硬件相关,主要负责对RADIO的一些操作,如拨打电话,收发SMS等等。整个框架如下图所示

Company confidential 2/2

Radio Interface Layer

编号:

图中各个RIL Proxy模块由MS提供,而RIL Driver需要由我们(AMOI或AGERE)完成。

(注意:以上说法是针对PPC或Smartphone的用户。如果采用WIN CE开发,则TAPI层以下的所有模块都需要由用户自己开发)。RIL Proxy由一些动态连接库组成,应用程序通过连接这些DLL来使用这些RIL API。RIL Proxy的主要工作是

(1) 将用户调用的RIL_XXX()函数最终转换成对应RIL Driver层的RIL函数。绝大部分的

RIL API函数是最终通过RIL_IOControl()来实现的。 (2) 调用用户函数提供的callback函数,告诉用户一些Notification信息和异步的RIL函数调

用结果。

(3) 过滤掉用户不感兴趣的Notification。

在RIL Proxy层,MS定义了RIL Driver必须实现的一些函数/功能接口(通过一些头文件),但并没有规定OEM具体怎样实现。具体的实现则由RIL Driver来完成。最常见的Driver的实现方法是用AT COMMAND,当然用别的方法也是可以的,如双口RAM,AGERE的AMI接口等。

Company confidential 3/3

Radio Interface Layer

编号:

第三章 RIL在PPC/WinCE中的实现

需要掌握的知识:

1. WinCE中device driver的开发知识 2. RIL的整体框架

3. 跟你要实现的RIL Proxy所对应的协议的了解,特别是对整个流程要有深刻的理解 4. Agere AMI知识(如果我们采用AMI)或AT COMMAND 5. 一些C++的知识

3.1 MS RIL具体实现的大体框架

微软提供了实现RIL Driver的参考程序,OEM可以在这些程序的基础上,做一些相应的修改。

位置:\\PAK.Emulation.x86.13100\\PGrine\\public\\ossvcs\\ril 其中 ..\\driver\\gsm\\rilmain.cpp是RIL Driver程序

..\\Ntrilapp\\ main.cpp可以认为是一个Ril Proxy?(应该是类似一个RIL Proxy)

3.1.1 RIL Proxy (main.cpp)的实现

以下是RIL Proxy要完成的主要功能

WinMain()

(1) 创建两Event,hRequestEvent(从应用程序取得request)和hFinishedEvent(告诉应用程

序已经处理完成)

(2) 利用file mapping技术创建一个共享数据区。通过该共享数据区,Proxy线程和别的线程

可以互相交换信息

(3) 初始化COM driver和RIL driver(在实际应用中,这部分初始化代码会在系统启动时被

调用)

(4) 等待用户请求WaitForSingleObject(hRequestEvent, INFINITE)

(5) 处理请求ExecuteCall(hMutex, pMapped),这是RIL Proxy主要的工作 (6) 告诉应用程序处理完成SetEvent(hFinishedEvent) (7) 回到(4)

(8) 反初始化COM driver和RIL driver

Step(5)详细注释:

将用户的一些请求CALLID_RIL_XXX(这些请求是用户程序放在共享数据区的)转换成相应的RIL_XXX()函数。(RIL_XXX函数为RIL Driver函数,其实现在rilmain.cpp中)。其中最

Company confidential 4/4

Radio Interface Layer

编号:

关键的转换是将CALLID_RIL_IOCONTROL转换成RIL_IOControl()函数。

3.1.2 RIL Driver (rilmain.cpp)的实现:

以下是RIL Driver中比较关键的几个函数的注释  RIL_Init()

(1) 生成一个device handle实例

(2) 通过设置Event,告诉RIL Driver已经启动

 RIL_Open() 打开一个Driver实例,不同的RIL Proxy可以对应不同的Driver实例。这些实例由RIL Driver统一管理。在调用RIL_Open()时,需要提供RIL的device handle (在RIL_Init中得到) (1) 生成一个CRilInstanceHandle实例

(2) 将该实例添加到一个list中,这个list由device handle集中管理

 RIL_IOControl()

绝大部分的RIL API函数是在RIL_IOControl()中实现的,基本上它就是一个大的switch : case 语句。

以RIL_GetLineStatus()为例,RIL Driver会跳到

case IOCTL_RIL_GETLINESTATUS:

CALLDRVAPI(RILDrv_GetLineStatus);

break;

最终RIL Driver要做的工作都会在RILDrv_GetLineStatus()函数中实现。在现在微软所给的例子中,RILDrv_GetLineStatus()函数实际上是一个空函数。因此,如果由我们自己来实现RIL Driver,要做的工作就是要实现各个RILDrv_XXX()函数。至于具体的实现,一是可以用AT COMMAND来实现,二是可以用AMI实现。

 RIL_Close()和RIL_Deinit()

分别为RIL_Open()和RIL_Init()的反过程,不多叙。

3.2 一个简单的例子

以下是一个应用程序利用RIL拨打电话的大致过程:

1. 应用程序APP向TAPI调用LineMakeCall()

Header: Tapi.h.

Link Library: Tapi32.lib.

2. TAPI向TSP(TAPI Service Providers)调用TSPI_lineMakeCall() /************************************************************* 以下是打开Modem端口的过程 i. TSPI_lineMakeCall()/ Tspi.c 调用DevLineOpen() / modem.c

Company confidential 5/5

Radio Interface Layer

编号:

ii. DevLineOpen() 调用 OpenModem()

iii. OpenModem() 调用CreateFile(pLineDev->szDeviceName …) iv. CreateFile() 最终会调用driver XXX_Open()

************************************************************/ i. TSPI_lineMakeCall()/ Tspi.c 调用ControlThreadCmd (pLineDev,

PENDING_LINEMAKECALL, dwRequestID); ii. ControlThreadCmd() 调用SignalControlThread(pLineDev) iii. SignalControlThread(pLineDev) 调用SignalCommMask(pLineDev) // Signal

UnimodemListenThread ???

iv. …

3. TSP向RIL Proxy调用RIL_Dial()

4. Proxy向RIL Driver调用RIL_IOControl(), RIL Driver调用RILDrv_Dial()

5. 在RILDrv_Dial()中,RIL向硬件发送AT COMMAND,从而通过无线通信模块向网

络发出通话请求

注意1:以上过程只是一个示意性的过程,在实际的打电话过程中,还会涉及到很多别的交互过程,如RIL_SetAudioDevice(),RIL_GetCallList(),这些就需要我们对通话过程的协议有一个清楚的了解。

注意2:根据MS提供的信息,针对PPC或Smartphone用户,MS会实现RIL Proxy以上的所有模块,用户只需实现RIL Driver和HW。(但到现在为止,MS还没有提供针对RIL的TSPI,这也是以上例子中TSPI_lineMakeCall最终会去调用UniModem模块的原因。)而对WIN CE用户,用户需要自己完成TAPI层以下的所有模块。

Company confidential 6/6

Radio Interface Layer

编号:

3.3 MS RIL Device Driver的具体实现:

两个线程:

这两个线程都是在RIL_Init()时启动 - CRilHandle::LaunchThreads()

(1) CmdThreadProc

a) 功能:Sending commands from the Command Queue to COM port b) 实现:见Atcomm.cpp的CRilHandle::CommandThread() i. // Tell the main thread that we've reached the checkpoint

GetCheckPoint()->Reached(); ii. //查看COMMAND QUEUE中是否有COMMAND需要执行

if (!WaitForCommandOrCancel())

iii. // Get the next command from the Queue

hr = g_pCmdQ->Get(pCmd, INFINITE);

iv. // Send the command to comm port

m_pComDevice->SendRILCmdHandleRsp() v. // If this command dropped the modem into the data mode, switch to

Company confidential 7/7

Radio Interface Layer

编号:

data-mode operation!!利用VSP概念,可以在传输DATA的过程中(DATA

MODE)suspend该Call, 并插入一条Command。等该COMMAND的返回信号回来后,再恢复原先的Call.

//发送RIL COMMAND(写AT COMMAND)的过程 – SendRILCmdHandleRsp() CComHandle::

::SendRILCmdHandleRsp() =>::WriteCmdsToComPort() => ::WriteCharsToComPort() => ::Write()

=> DOWNST_WRITEFILE() /*在这里用AMI来实现??*/ => WriteFile() // Writing to a Serial Port

(2) ReadThreadProc

a) 功能:Reading responses from COM port into the Response Queue AND handle

received data.

b) 实现:见Atcomm.cpp的CRilHandle::ResponseThread() i. // Tell the main thread that we've reached the checkpoint

GetCheckPoint()->Reached(); ii. // Wait for more data

if ( (!m_pComDevice->VirtWaitCommEvent(&dwMask)) || (!dwMask) )

iii. // Read the data

m_pComDevice->Read(szData, RESP_DATA_BUF, dwRead) // 即CComHandle::Read

1. DOWNST_READFILE()

2. // 通过读COM口来读取数据

#define DOWNST_READFILE(handle, buf, len, read) ReadFile(handle, buf, len, read, NULL)

iv. // Handle received data

// 以初始化后,返回5个数据,为13,10,48(“0”),13,10为例 CRilHandle::HandleRxData()

1. // 先将读入的数据加到一个Buffer中

CRilHandle::AppendReadBytes()

// No buffer yet -- need to allocate it i.e.

// CRilHandle::m_pReadBytes, 一个CBuffer*变量 2. CRilHandle::GiveUpReadBytes()

3. // Allocate a new response, if we need it

pRsp = new Cresponse

4. // Append data to the response

pRsp->AppendString()

a) // Append the new data to the buffer -- CBuffer::Append() b) // Parse a response -- CResponse::Parse() i. ParseNotification()

1. ParseRspPrefix() // 去掉开头的\\r\\n, i.e. 13,10

Company confidential 8/8

Radio Interface Layer

编号:

v.

szPointer=”0,cr,lf”

2. ParseUInt() // ?? ii. ParseOKOrError( TURE,) // iii. ParseOKOrError( FALSE,)

5. // 如果是command result,放到Response Q中

QueueRsp()

a) g_pRspQ->Put()

6. // 如果是Notification,通知所有的RIL Proxy (实际上是放到RIL proxy的

CRilNotificationQueue)

a) CRilHandle::BroadcastRealBlobNotification() b) CRilHandle::BroadcastNotification() c) // Notify all RIL proxy instances

m_pInstances->Enum(NotifyHandle, (DWORD)rpnd); d) CRilInstanceHandle::Notify() e) m_notificationQ.Put() i. // Put the element in our queue.

m_rgpItems[m_nUsed++] = pItem; ii. // There's something new in the queue,

// so signal waiting threads. m_eventItems.Set(); 

7. // See if the last command caused us to enter (or return) to data mode 8. // 处理剩余的数据 GOTO ii.

三类Queue:

1. Command Queue

存放要发送到COM口的Command

2. Response Queue

存放从COM口收到的信息

以上两个Q为全局变量,在Atcmd.cpp中定义 // Command Queue

CPriorityQueue* g_pCmdQ = NULL; // Response Queue

CQueue* g_pRspQ = NULL;)

3. Notification Queue

存放跟某个CRilInstanceHandle有关的信息,每个CRilInstanceHandle都有一个CRilNotificationQueue(针对每一个RIL proxy instances)

Company confidential 9/9

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务