学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

max 发表于 2009-12-4 01:10

RIL我有话说

[i=s] 本帖最后由 max 于 2009-12-4 01:44 编辑 [/i]

[url=http://chenyq2008.spaces.live.com/blog/cns!F73164AC8D0D8D50!394.entry]http://chenyq2008.spaces.live.com/blog/cns!F73164AC8D0D8D50!394.entry[/url]


【三大困扰,两宗罪】
1.        神秘的celltsp。
2.        modem特性的差异
3.        无诚意的connection manager


1. 未知的celltsp。这是一个动态库,是tapi和ril之间的桥梁,比如要完成一个呼叫过程,celltsp和ril驱动是有许多的互动,奈何celltsp没有源码,只能根据手册和调试信息来猜测celltsp的行为。MSDN只有此一句:CellTSP ignores RIL_NOTIFY_CONNECT. Use RIL_NOTIFY_CALLPROGRESSINFO to indicate call state transitions.好家伙,这算嘛回事?

2. modem特性差异。AT标准是只有一份,可是各家解读不同,同一个命令,有些可能会认为处理完毕正确返回OK,有些可能会立刻返回OK。更特别的是专有命令,比如微软手册提到的CPI命令,俺家用的模块就没有,CPI是call progress information。这个差异可是会导致RIL驱动中呼叫流程变化。

3. 无诚意的connection manager。 CM功能充满诱惑力,在CE6 R3中呈现时眼前为之一亮。兴奋打包进去后才发现,没法用,或者说不会用。原来CM是需要配置的,用DMProcessConfigXML来配置一个xml脚本。好家伙,这个函数芳踪何在?这算嘛事。

max 发表于 2009-12-4 01:18

RIL我有话说(1)

【简介】
RIL是移动通讯核心(cellcore)和无线硬件设备(modem)之间通讯的控制接口,由此集成GSM, CDMA等不同Modem设备,适应不同无线网络。RIL由两部分组成:RIL proxy和RIL driver。RILproxy是一个基于CE的动态链接库(DLL)  --- ril.dll,微软已经提供,它简化上层各个应用对驱动的访问。 而RIL driver即流驱动需要自己实现。RILdriver向系统提供无线服务,包括语音、 数据和SMS。RILdriver同时也通知无线状态的改变,例如服务区(coverage)、信息强度和来电等。 RIL模型类同音频模型,ril proxy好比waveapi, ril driver好比wave流驱动。


图1.

max 发表于 2009-12-4 01:26

RIL我有话说(2)

[i=s] 本帖最后由 max 于 2009-12-4 01:33 编辑 [/i]

[p=30, 2, left][font=宋体]【[/font]RIL[font=宋体]结构和接口】[/font][/p]
[p=30, 2, left][font=宋体]一:串口驱动。[/font][/p][p=30, 2, left][font=宋体]最下层是串口硬件和串口驱动。[/font]Modem[font=宋体]串口连接最普遍的说法是需要用到[/font]9pin[font=宋体]的全功能串口,我的看法,在[/font]RIL[font=宋体]驱动中对[/font]DCD[font=宋体]配置的修改,使用[/font]3[font=宋体]线串口也是可以的,但是在完整的产品还是要通过[/font]3[font=宋体]线之外的其他[/font]io[font=宋体]来辅助,不然会牺牲掉硬件流控以及唤醒,通知等功能。[/font][/p]
[p=30, 2, left][font=宋体]二:可选的[/font]mux[font=宋体]驱动。[/font][/p][p=30, 2, left][font=宋体]考虑到[/font]modem[font=宋体]不仅有[/font]at[font=宋体]控制通道,还有数据传输通道,而串口是无协议的接口,所以从软件实现和性能考虑,最好的方式当然是[/font]2[font=宋体]个串口分别提供。但实际中常见的都是[/font]1[font=宋体]个串口的,支持[/font]gsm0710[font=宋体]协议的[/font]modem[font=宋体]能够实现在[/font]1[font=宋体]个物理串口基础上虚拟多路串口。怎么判断是否支持多路复用?[/font] modem[font=宋体]用[/font][b]AT+CMUX[/b][font=宋体]命令来完成多路复用协议。[/font]Cellcore[font=宋体]里面[/font]Gsm 07.10[font=宋体]协议已经提供源码实现[/font]mux07_10.dll[font=宋体],默认的虚拟出[/font]2[font=宋体]个串口[/font]COM7[font=宋体]和[/font]COM9.[font=宋体]典型应用中,[/font]COM7[font=宋体]作为[/font]AT[font=宋体]命令通道,[/font]COM9[font=宋体]作为数据通道,这样意味着在[/font]gprs[font=宋体]状态下语言短信业务有可能可以同时使用,不必退出[/font]data[font=宋体]模式。如果你的[/font]modem[font=宋体]本身就已经有[/font]2[font=宋体]路物理串口,那么[/font]710mux[font=宋体]驱动是不需要的。如果你的[/font]modem[font=宋体]并不支持[/font]GSM 07.10[font=宋体]协议,只有[/font]+++[font=宋体]退出[/font]data[font=宋体]模式了。[/font]
[/p]
[p=30, 2, left][font=宋体]三:[/font]RIL[font=宋体]驱动。[/font][/p][p=30, 2, left]710mux[font=宋体]驱动之上就是[/font]ril[font=宋体]驱动了。[/font]MS[font=宋体]已经抽象了大部分[/font]ril[font=宋体]驱动的功能,通过了[/font]MDD[font=宋体]源码,所以写一个[/font]ril[font=宋体]驱动就是把自己[/font]modem[font=宋体]相关的代码和[/font]MDD[font=宋体]链接成一个流驱动[/font]rilgsm.dll[font=宋体]。[/font]ril[font=宋体]驱动与串口驱动的最大不同在于,[/font]ril[font=宋体]是同时支持多个应用使用的,每次[/font]open[font=宋体]都[/font]new[font=宋体]一个[/font]Instance[font=宋体]对应。[/font][/p][code]DWORD RIL_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{

   pDevice = (CRilHandle)dwData;
   pHandle = new CRilInstanceHandle;
   pHandle->Init(pDevice);
   pDevice->AddToList(pHandle);
   return (DWORD)pHandle;
}
[/code][p=30, 2, left][font=宋体]上层应用打开[/font]RIL[font=宋体]之后就可以使用[/font]RIL[font=宋体]流驱动的[/font]IOCTL[font=宋体]来使用[/font]RIL[font=宋体]驱动。[/font][/p]
[p=30, 2, left][font=宋体]四:[/font]RIL[font=宋体]代理层[/font][/p][p=30, 2, left][font=宋体]直接使用[/font]ril[font=宋体]驱动显得不方便,所以[/font]MS[font=宋体]继续封装了一个[/font]RILProxy[font=宋体]的层,由它来和驱动打交道,这个[/font]RIL Proxy[font=宋体]的实体是[/font]ril.dll[font=宋体],函数形式都是[/font]RIL_XXX()[font=宋体],函数声明在[/font]ril.h[font=宋体]文件。基本上所有的应用都是使用代理层来实现。[/font][/p]
[p=30, 2, left][font=宋体]五:应用层[/font][/p][p=30, 2, left]RIL Proxy[font=宋体]的上层是[/font]TAPI/ExTAPI[font=宋体],[/font] SIM[font=宋体]管理程序,[/font]SMS[font=宋体]管理程序,电话,以及是基于[/font]gprs[font=宋体]的网络应用程序。如图[/font]1[font=宋体],这些顶层的应用也许并没有直接和[/font]RIL[font=宋体]驱动打交道,中间还有一些代理层,如下面列出的[/font]celltsp.dll, sms.dll[font=宋体]等。[/font][/p][p=30, 2, left][font=宋体]
[/font][/p][p=30, 2, left]tapi-> tsp(celltsp.dll) -> ril[font=宋体]代理[/font](ril.dll) –> rilgsm.dll[/p]
[p=30, 2, left]Sim -> sim api(cellcore.lib) -> ril.dll ->rilgsm.dll[/p]
[p=30, 2, left]Sms -> sms api(sms.dll) -> sms provider(sms_provider.dll) ->smsdrv.dll -> ril.dll -> rilgsm.dll[/p]
[p=30, 2, left][font=宋体]再往上,还有[/font]connection manager([font=宋体]在[/font]CE6 R3[font=宋体]包含[/font])[font=宋体]连接管理器[/font]api[font=宋体],[/font] ATCI[font=宋体]和[/font]Assisted tapi[font=宋体]这些。[/font] ATCI[font=宋体]是保留给应用一条对[/font]modem[font=宋体]直接发[/font]AT[font=宋体]命令的管道,但只在[/font]wm[font=宋体]中有[/font]ce[font=宋体]并没有包含。[/font]Assisted Tapi[font=宋体]在[/font]ce6[font=宋体]的文档仅仅包含[/font]tapiRequestMakeCall[font=宋体],按照理解,这个是提供给系统拨号软件之外的第三方软件一个[b]请求[/b]拨号的接口,会转发到系统的拨号软件处理。至于[/font]connection manager[font=宋体]是[/font]09[font=宋体]年[/font]10[font=宋体]月发布[/font]R3[font=宋体]版本中的新增内容,如同[/font]wm[font=宋体]中的[/font]CM[font=宋体]模块,这对应用而言是很有吸引力的模块,具有自动完成各种网络连接,自动选择网络,自动重拨,永远在线按需使用等功能,遗憾的是根据我目前实验,因为[/font]DMProcessConfigXML[font=宋体]在[/font]CE[font=宋体]无实现,[/font]CM[font=宋体]配置存在困难,如您有答案不吝赐教。[/font][/p]

sanlybeen 发表于 2010-1-12 09:59

楼主,讲解的很不错啊,学习了:victory:

dingzy930 发表于 2010-3-31 14:37

正在学习,不错不错~~

cloud.gf 发表于 2010-4-11 22:52

谢谢分享!

页: [1]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0