优化RIL驱动,巧解WinCE电话漏接难题

随着3G移动电话热潮的高涨,我公司许多的嵌入式移动产品也正计划加入无线上网和电话功能。近期,公司委派我负责一个在WinCE 6.0平台下集成移动电话、无线上网和收发 SMS功能的项目。但没有想到的是这个项目却让我陷入到反复调试的痛苦之中。

    原因是这个在WinCE 6.0平台下开发的系统经常出现:漏接电话、或有信号但电话无法拨出、或短信收发不正常、或通话自动中断和通话断断续续等问题。初期我怀疑是因为信号质量问题所导致,所以花了大量时间和精力在硬件上,如天线和GSM射频通讯模块上。但后来却发现原来是我在Win CE 下没有进行优化RIL接口驱动所造成的问题。在这里与大家分享一些在此过程中得到的经验和教训。


    一.WinCE系统电话漏接的原因分析
    在无线移动通讯上,漏接的意思是指机器设备接通了,但机器设备却没反应。一般来说,这个故障可能出现在两个层面:一是GSM射频通讯基带部分没有发出有来电的消息;二可能是WinCE系统没有对GSM模块的来电消息做出响应。

    (1)硬件上没有发出有来电消息
第一种漏接的原因可能是GSM射频通讯基带部分没有发出有来电的消息,这部份主要是因为GSM硬件上出现了问题,使到系统根本没有输入信号。例如,在有信号的场合下但电话无法拨出时,很可能就是GSM信号质量出现问题。所谓信号质量问题是指在正常情况下接收到的信号强度明显低于正常标准,这是与GSM射频硬件相关的故障。因此,我把时间和精力都集中在天线接收和GSM射频通讯硬件上,例如更换增强型的天线和使用经测试合格的GSM射频芯片和基带处理芯片。但经过多次硬件调试和更换,却发现此问题一直存在,后来我决定先排除对GSM硬件可能存在故障的怀疑。

    (2)WinCE系统没有对来电消息做出响应
第二种漏接的原因可能是WinCE系统对来电信号没有做出响应。后来,经过多次调试,我发现问题还真是出在WinCE 6.0系统的软件部分。用专业术语的话说,就是在通讯接口层RIL模块(即Radio Interface Layer,无线接口层)和优先级处理上出了问题。这个RIL层主要是用于沟通WinCE系统与GSM通讯模块,并且对GSM通讯模块的行为做出适当的响应与动作,例如启动数据连接、发送 SMS 消息等。换句话说就是,当问题出在WinCE软件模块时,就算GSM信号强度提高了,该漏接的还是会漏接,该挂断的还是会挂断。
二.WinCE 6.0 RIL接口驱动详细分析   

  (1)WinCE 6.0新加入的电话功能
    一般来说,要在基于WinCE平台的产品上具备无线通讯功能(如拨号上网、拨打电话、收发短信)的方法有两种:一是选择让用户外接手机模块;二是在嵌入式产品上集成手机模块。如果是外接手机模块,那么手机只是起到在上网浏览期间接收和发送数据的作用,而如果是嵌入式设备自身集成手机模块,那么就可以很方便的实现无线通讯的全部功能。

    因此,为了实现嵌入式设备更好的增加无线通信功能,WinCE 6.0 提供了连接移动电话网络所需的接口函数。例如,WinCE 6.0 提供了cellcore.dll组件,这个动态链接库扩展了 Win32 API函数,其作用是用以支持各种移动电话服务,例如启动数据连接、发送 SMS 消息等。另一个重要组件是无线接口层 RIL驱动程序 ril.dll。该组件为应用层与移动电话硬件的连接提供了低级别接口。在早先几个版本的WinCE是不支持直接拨打电话和发送 SMS文本消息的。因此,在以前要想在WinCE上构建移动电话,OEM厂商就必须开发自己的接口层,然而这并非易事。现在有了这个RIL接口,要想在WinCE平台上构建移动电话程序,就不用OEM厂商再自己开发相应的接口层了,这一功能也大大激发OEM厂商在WinCE平台上构建移动电话程序的热潮。

    (2)什么是RIL(Radio Interface Layer)组件?
    在WinCE 6.0新加的RIL无线接口层组件原本是Windows Mobile里的,它的主要工作为连接WinCE操作系统和电话模块,RIL的主要作用是用于维护和关联无线GSM通讯模块的状态和事件消息。微软的帮助手册是这样介绍RIL的,作为无线通讯的一个非常重要的组件,RIL使各种无线语音和数据应用成为可能,也使到运行在WinCE 6.0上的软件可以通过RIL无缝地与GSM/GPRS或者CDMA2000 1X modem通信。RIL的位置是处于GSM无线基带系统的协议栈之上,而在WinCE系统的CellCore层之下。RIL跟上层通讯主要采用两种方式,一种是通过Socket发送与接收消息的方式来实现,还有另外一种方式是通过TCP/IP直接访问内核中的shared memory,进行RPC调用,这种方式主要应用在数据模式上。因此,RIL组件能隐藏GSM无线基带硬件上的一些细节,也就使到OEM厂商可以根据自己的需要将不同型号的无线modem集成到它们的产品之中。

    简单的说,就是只要采用了RIL驱动模块和底层的GSM通讯模块,WinCE系统就具有了移动电话的功能。一是因为RIL提供了语音、数据、SMS短信、SIM卡管理以及STK应用的功能,也包括了EXTAPI、拔号盘等移动电话的其它功能。二是因为从软件的角度来看,RIL工作在PPP、TCP/IP协议之下,能把AT命令的发送以及Response响应的解析,也能把数据可靠的传输。而且,除了对网络协议的支持,RIL也支持SMS、Voice Call等功能。

    (3)RIL驱动程序的结构解析
    从RIL组件的功能我们可知,开发一个移动电话的设计起点,是需要有效的进行RIL驱动程序的开发。因为RIL驱动程序为应用程序提供无线通信相关的服务,包括呼叫控制、短消息、GPRS等功能。而且对于上层应用程序来说,也可以抽象地把RIL驱动程序看作逻辑设备,它只需要和RIL驱动程序通信就能够获得所需要的服务。因此,RIL接口层驱动可以按照流驱动Stream I/O的规范来设计,这样做的好处是应用程序可以把设备看作文件,通过文件接口来访问RIL。

    在WinCE系统中,一个加载式驱动程序通常会被分成与硬件相关的PDD层和与硬件无关的MDD层两部分。MDD实现的是和平台无关的功能,它描述了一个通用的驱动程序框架,而PDD是和硬件以及平台相关的代码组成。MDD会调用PDD中特定的接口来获取硬件相关的信息。因此,在使用层次型驱动的时候,一般只需要基于相近的样列驱动程序,针对特定的硬件只修改PDD程序,MDD建立的框架可继续使用。

    在根据微软帮助手册的建议,RIL驱动程序的基本框架最好是采用MDD+PDD结构。一般来说,微软在WinCE中提供了很多通用驱动程序的MDD样本,所以关键在于调试PDD层。因为不同的GSM/GPRS通讯模块,其PDD层的实现是不一样的。例如,层次模型RIL_XXX是提供给DeviceManger的 stream Interface。而在RIL Service这一层,Dispather 会将request code 分发给相应的function,例如SMS短信息发送。然后SMS 的function 会发消息给 RIL Device,目的是为了请求以AT命令的形式发送给 GSM modem。也就是说,公用的MDD部分已经做好了,现在只需要针对不同的GSM模块进行不同的PDD驱动开发,这样就可以大大地提高开发效率了。

    (4)WinCE如何通过RIL实现电话功能?
    现在我们从WinCE线程的角度来观察RIL的工作流程。RIL主要包括RIL Stub 和 RIL Driver 两个部份。RIL Stub 和 RIL Driver 都拥有自己的线程,名为RILThread。应用程序调用RIL驱动程序的工作流程如下:①应用程序的进程在自己的进程空间里,以调用RIL Proxy方式发送请求。②RIL Proxy 以IPC方式把请求传给 Device Manager。③Device Mananger 根据操作码,将请求分发到相应的RIL驱动程序。④RIL Stub接收到操作码后根据PID做Context切换,然后把请求转发给RIL Driver。⑤最后,对应于用户进程Context中的RIL Driver会开始处理操作码。例如,RIL Driver将AT命令发给GSM modem,然后等待返回的response。

    因此,从以上的工作流程来看,RIL驱动模块性能的好坏会直接影响着所有无线通信应用相关的软件,而驱动程序设计是否经过优化又影响着RIL驱动程序的性能。
三.优先级处理时需要注意的要点

    (1)什么是优先级处理问题?
    一般来说,WinCE系统上的移动电话设计并没有像Symbian一样针对电话做过优化,甚至根本没考虑到GSM通讯模块的特殊性,而仅仅是把它当作一个可以扩展的硬件模块。也就是说,GSM通讯模块和普通硬件模块的优先级是一样的。因此,连接GSM通讯模块的RIL作为一个驱动和其它驱动是平等的抢夺CPU周期,或平等的被调度,甚至在优先级上都是一样的。但是,GSM通讯模块和其它扩展硬件又有几点很大的差别:一是它需要WinCE系统对某些通讯事件进行足够及时的响应;二是某些正在进行的通讯任务必须不得被抢占,至少不得被长时间挂起,这点有些类似于实时系统的要求。

    正是这样的优先级处理方式在WinCE平台下是会导致漏接电话的。例如,在移动电话有来电时,就会发起一个高于RIL驱动优先级的线程,它会在下一个分发期间拿走CPU处理权,而在它退出之前RIL是无法及时抢回时间片的,因为WinCE对优先级的处理远不如Win NT复杂和灵活,因此可能会存在高优先级线程完全控制CPU而导致低优先级线程被饿死的情况发生的,这样就会“丢失”这一次来电消息,现象就是漏接。或在通话期间产生了一个高优先级线程,它也会从RIL驱动手里夺走CPU控制权,从而可能导致通话中途断开的情况。而且,许多实践也证实,WinCE系统的通讯稳定性问题绝大多数都出在优先级处理上,再加上WinCE系统本身在任务调度上也经常会出现BUG,结果使到高优先级的线程经常无法从低优先级手里拿到时间片,从而导致优先级系统失效。

    (2)优先级处理不当会导致RIL驱动假死
    另外,WinCE发生电话漏接现象除了是优先级问题外,还可能是RIL驱动出现“假死”。 因为很多实践证明目前大多数RIL驱动“假死”问题,都是由于软件问题而非硬件问题造成的。实际上,WinCE系统上出现这种问题也不是很奇怪的,因为出现“假死”的原因主要是因为RIL驱动程序的入口点函数、注册键和GSM模块没有进行适当的交互。因为RIL驱动程序写得是否很好是因人而异的, 毕竟RIL驱动层是用户自己定制的, 而非由微软实现的。

    (3)RIL驱动COM串口的占用问题
在进行RIL驱动端口设计时,许多开发人员常常忽视的一个问题是关于串口的占用问题。因为说到底RIL驱动的底层还是用AT来操作的,如发命令、Response解析等。这是由于GSM模块Modem的历史原因所造成的,因为AP一直是通过基于串口的AT命令与BB交互。包括目前的一些Edge、或3G模块、或像omap的AP/BP集成的芯片,它们大多数仍然是使用模拟串口机制来使用AT命令的。再加上串口是不可复用的,所以在应用RIL时一定要避免串口被占用。

    最后,还需要特别注意的是要避免串口访问的冲突问题。因为只要WinCE系统启动时RIL驱动加载后,就会一直占用着这个串口,别的应用程序是无法直接访问到这个串口的,而无论这个应用程序的优先级有多高。

你可能感兴趣的:(优化,interface,sms,WinCE,通讯,电话)