wince5.0 中兴3G模块驱动分析

时间:2021-09-30 17:27:53

RIL 驱动

先来简单介绍下PXA310 平台下 中兴模块MG3732驱动的总体架构

wince5.0 中兴3G模块驱动分析

从这个图上可以很清楚的看到MG3732有两种接口,一个是spi接口,一个是USB 接口。

310平台下采用的是USB接口,看一下相关目录:RIL 相关驱动在driver目录的Ril_wcdma下,usb相关的驱动在Ztemtusbser目录下。

Ril驱动也属于六驱动,首先来分析Rilmain.cpp里的相关代码,这里面实现了流驱动的接口。BOOL WINAPI DllMain(HANDLE hinstDll, DWORD dwReason, LPVOID lpReserved)系统加载模块和卸载模块式在这个函数中实现的。几乎20%的代码都是在DWORD RIL_Init()中实现的。第一步是老规矩获得资源并初始化,这里主要是调用了LC6311_Init()函数,之后紧接着干了两件事,初始化多个相关的临界变量,和创造多个事件(g_hCriticalErrorEvent、g_hDriverPresentEvent、g_hNewDialOrHangupEvent、g_hCPINNEvent、g_hUsbShutDown);

之后做了个初始化默认终端配置(创建和添加注册表)。下面好好讲解下CRilHandle::StartInit()初始化函数。

StartInit这个函数中,先是从注册表中取得资源,创建了几天事件,之后用COM_OpenInternal() 函数打开了虚拟串口(这里就是USB的接口,后面会分析),之后进入了一个很重要的函数,LauchThreads(),在这个函数中同时开启了6个线程:

在线程CmdThreadProc中主要做的事是发送和接收AT命令;

在线程ReadThreadProc中主要做的事是从虚拟串口中读出响应队列;

在线程ResetReadioProc中主要做的事是休眠唤醒相关的 操作;

在线程UrcWakeupProc 中主要做的事是等待URC的中断事件(wakeup;

之后,创建了两个同步线程:

在线程HandUpThread中主要做的事是挂无线络连接;

在线程MoniDeviceStateThread中主要做的事是创建一个消息队列,监听设备相关的状态。

RIL中关于打电话,来电显示,发短信,收短信等代码的接口在RIL_IOControl中,在default:中,网络接口代码的宏定义有

IOCTL_RIL_GETSUBSCRIBERNUMBERS、

IOCTL_RIL_GETOPERATORLIST、

IOCTL_RIL_GETPREFERREDOPERATORLIST、

IOCTL_RIL_ADDPREFERREDOPERATOR、

OCTL_RIL_REMOVEPREFERREDOPERATOR、

IOCTL_RIL_REGISTERONNETWORK、

IOCTL_RIL_UNREGISTERFROMNETWORK、

OCTL_RIL_GETREGISTRATIONSTATUS

这些事件的处理代码都在Network.cpp中。接下来是来电话的处理代码,其中的宏定义有:

IOCTL_RIL_GETCALLERIDSETTINGS、

IOCTL_RIL_SETCALLERIDSTATUS、

IOCTL_RIL_GETHIDEIDSETTINGS、

IOCTL_RIL_SETHIDEIDSTATUS、

IOCTL_RIL_GETDIALEDIDSETTINGS、

IOCTL_RIL_SETDIALEDIDSTATUS、

IOCTL_RIL_GETHIDECONNECTEDIDSETTINGS、

IOCTL_RIL_SETHIDECONNECTEDIDSTATUS、

IOCTL_RIL_GETCLOSEDGROUPSETTINGS、

IOCTL_RIL_SETCLOSEDGROUPSETTINGS、

其实现代码都在Supsvc.cpp中。在这其中也实现了呼叫转移、呼叫等待的相关代码,这里不再列举;打电话的代码相关事件宏定义:

IOCTL_RIL_DIAL、

IOCTL_RIL_ANSWER、

IOCTL_RIL_HANGUP、

IOCTL_RIL_SENDDTMF、

IOCTL_RIL_SETDTMFMONITORING、

IOCTL_RIL_GETCALLLIST、

IOCTL_RIL_MANAGECALLS、

IOCTL_RIL_TRANSFERCAL、

IOCTL_RIL_GETLINESTATUS、

其代码的实现都在Callctrl.cpp中。接下来就是写有关功能锁、接收消息、发送消息相关的代码,在这里就不在一一列举了。

关于RIL 具体实现中兴在其相关资料中说的很明白。下面我们主要研究USB 相关驱动,以及usb怎么控制3G模块的。