RIL 驱动
先来简单介绍下PXA310 平台下 中兴模块MG3732驱动的总体架构
从这个图上可以很清楚的看到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模块的。