`
javahigh1
  • 浏览: 1215924 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

WinCE中串口驱动及接口函数介绍

阅读更多

作者:ARM-WinCE

WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 184.5pt; HEIGHT: 255.75pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CTANG~1.MIA%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg" o:title="Drawing4"></imagedata></shape>

串口驱动本身分为MDD层和PDD层。MDD层对上层的Device Manager提供了标准的流设备驱动接口(COM_xxx)PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操作的函数指针,这些函数指针将指向PDD层中的串口操作函数。DDSI是指MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJPDD层会传给MDD层一个HWOBJ结构的指针,这样MDD层就可以调用PDD层的函数来操作串口。

微软针对于串口驱动提供了参考源代码,可以在下面的目录下找到:”\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\SERIAL”

串口驱动的结构也就是这样了,下面介绍相关的驱动中的接口。

1. HWOBJ结构

在串口驱动中,HWOBJ结构中的函数实现了对串口硬件的操作,并在MDD层被调用。可以说,该结构描述了串口设备的所有特性,先来介绍一下该结构,具体定义如下:
typedef struct __HWOBJ
{
ULONG BindFlags;
DWORD dwIntID;
PHW_VTBL pFuncTbl;
} HWOBJ, *PHWOBJ;

BindFlags:用于控制MDD层如何来处理IST,具体值如下:

THREAD_IN_PDD:MDD层不处理,中断在PDD层处理。

THREAD_AT_INIT:在驱动初始化的时候,MDD层启动IST。

THREAD_AT_OPEN:在驱动被Open的时候,MDD层启动IST。

dwInitID: 系统的中断号 pFuncTbl: 指向一个PHW_VTBL结构,该结构中包含一个函数指针列表,这些函数指针指向串口硬件操作函数,用于操作串口。

typedef struct __HW_VTBL 

	{

 	PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);

  	ULONG (*HWDeinit)(PVOID pHead);

  	BOOL (*HWOpen)(PVOID pHead);

  	ULONG (*HWClose)(PVOID pHead);

  	ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);

  	PVOID (*HWGetRxStart)(PVOID pHead);

  	INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);

  	VOID (*HWOtherIntrHandler)(PVOID pHead);

  	VOID (*HWLineIntrHandler)(PVOID pHead);

  	ULONG (*HWGetRxBufferSize)(PVOID pHead);

  	VOID (*HWTxIntrHandler)(PVOID pHead);

  	ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);

  	BOOL (*HWPowerOff)(PVOID pHead);

  	BOOL (*HWPowerOn)(PVOID pHead);

  	VOID (*HWClearDTR)(PVOID pHead);

  	VOID (*HWSetDTR)(PVOID pHead);

  	VOID (*HWClearRTS)(PVOID pHead);

  	VOID (*HWSetRTS)(PVOID pHead);

  	BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);

  	BOOL (*HWDisableIR)(PVOID pHead);

  	VOID (*HWClearBreak)(PVOID pHead);

  	VOID (*HWSetBreak)(PVOID pHead);

  	BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);

  	ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);

  	VOID (*HWReset)(PVOID pHead);

  	VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);

  	VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);

  	VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);

  	BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);

  	BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);

  	BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);

} HW_VTBL, *PHW_VTBL;

这些函数将在PDD层实现,用于实际的串口硬件操作。

2. MDD层API

MDD层向上提供了流设备接口,这部分代码微软已经实现,用于管理串口。虽然我们不需要实现这部分,但是还是对相应的接口做个简单介绍。

2.1HANDLE COM_Init(ULONG Identifier):

初始化串口设备,该函数通过读取注册表获得串口设备号,并获得相应的HWOBJ的结构指针,通过该指针调用PDD层的硬件初始化函数初始化串口。

Identifier:如果驱动被设备管理器加载,那么这个参数将包含一个注册表键值在” HKEY_LOCAL_MACHINE\Drivers\Active”路径下。如果驱动是通过调用RegisterDevice函数来加载的,那么这个值等于dwInfo的值。在COM_Init中,会先打开该键值,用返回的句柄来查询DeviceArrayIndex值,并根据该值获得PDD层的HWOBJ结构指针。

2.2 BOOL COM_Deinit(void):

卸载串口设备,该函数中主要做了一些释放资源的操作。也可以被DeregisterDevice函数调用。

2.3 HANDLE COM_Open(HANDLE pContext, DWORD AccessCode, DWORD ShareMode):

打开串口设备。应用程序调用CreateFile函数打开串口时,该函数会被调用。

pContextCOM_Init函数返回的Handle

AccessCode设置访问模式,比如共享读或者是读写模式。

ShareMode在参数从应用程序中的CreateFile函数中传来,表示是否支持独自占有。

2.4 BOOL COM_Close(DWORD pContext):

关闭串口设备。应用程序调用CloseHandle函数关闭串口时,该函数会被调用。

pContext该参数为COM_Open函数返回的Handle

2.5 ULONG COM_Read(HANDLE pContext, PUCHAR pTargetBuffer, ULONG BufferLength, PULONG pBytesRead):

读串口数据。应用程序调用ReadFile函数读串口的时候,该函数被调用。

pContextCOM_Open函数返回的Handle

pTargetBuffer指向一个用于存放读到数据的Buffer

BufferLengthpTargetBuffer指向的Buffer的大小。

pBytesRead实际读到的数据的大小。

2.6 ULONG COM_Write(HANDLE pContext, PUCHAR pSourceBytes, ULONG NumberOfBytes):

写串口数据。应用程序调用WriteFile函数写串口的时候,该函数被调用。

pContextCOM_Open函数返回的Handle

pSourceBytes指向一个Buffer,该Buffer包含要写入串口的数据。

NumberOfBytes要写入串口的数据的大小。

2.7 BOOL COM_PowerUp(HANDLE pContext):

该函数主要用于串口设备从suspend模式恢复到正常模式。

pContext串口设备的Handle

2.8 BOOL COM_PowerDown(HANDLE pContext):

该函数主要用于串口设备从正常模式进入suspend状态。

pContext串口设备的Handle

2.9 BOOL COM_IOControl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DOWRD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut):

该函数主要实现了一些串口的IO控制,他会被应用层的一些串口函数调用来获得或者设置串口的状态。

dwOpenDataCOM_Open函数返回的Handle

dwCodeI/O控制操作码。

pBufIn传入的Buffer

dwLenIn传入的Buffer的大小。

pBufOut传出的Buffer

dwLenOut传出的Buffer的大小。

pdwActualOut:实际传出的数据的大小。

对于串口驱动来说,COM_IOControl函数非常有用,应用程序通过调用COM_IOControl函数并传入不同的操作码,实现了控制串口的功能。这里列举一些操作码如下:

操作码

解释

IOCTL_SERIAL_CLR_DTR

设置串口的DTR管脚为低

IOCTL_SERIAL_CLR_RTS

设置串口的RTS管脚为低

IOCTL_SERIAL_DISABLE_IR

禁用串口的红外模式

IOCTL_SERIAL_ENABLE_IR

启用串口的红外模式

IOCTL_SERIAL_GET_COMMSTATUS

清除串口设备的异常标记并返回当前状态

IOCTL_SERIAL_GET_DCB

获得串口的DCB结构

IOCTL_SERIAL_GET_MODEMSTATUS

获得当前Modem的控制寄存器值

IOCTL_SERIAL_GET_PROPERTIES

重新获得当前串口设备的硬件属性

IOCTL_SERIAL_GET_TIMEOUTS

获得串口设备的读写超时

IOCTL_SERIAL_GET_WAIT_MASK

获得等待事件标记掩码

IOCTL_SERIAL_IMMEDIATE_CHAR

在发送数据前,先发送一个特定的字符

IOCTL_SERIAL_PURGE

清除串口中的输入输出Buffer,也可以中止未进行的读写操作

IOCTL_SERIAL_SET_BREAK_OFF

串口通讯从中断状态恢复

IOCTL_SERIAL_SET_BREAK_ON

设置串口为中断状态,停止发送接收数据

IOCTL_SERIAL_SET_DCB

设置串口的DCB结构

IOCTL_SERIAL_SET_DTR

设置串口的DTR管脚为高

IOCTL_SERIAL_SET_QUEUE_SIZE

目前,在微软的MDD层代码中没有支持

IOCTL_SERIAL_SET_RTS

设置串口的RTS管脚为高

IOCTL_SERIAL_SET_TIMEOUTS

设置串口的读写操作超时

IOCTL_SERIAL_SET_WAIT_MASK

设置等待事件标记掩码

IOCTL_SERIAL_SET_XOFF

软件流控模式下,终止数据传输

IOCTL_SERIAL_SET_XON

软件流控模式下,启动数据传输

IOCTL_SERIAL_WAIT_ON_MASK

等待一个与事件掩码中匹配的事件

上述的操作码,很多都会被应用程序调用,看看MDD层中的实现,其中一些也是调用了PDD层下的函数来完成对串口硬件的设置。

3. PDD层API

PDD层的函数主要是实现了对串口硬件的操作,函数比较多,不过还是都说一下吧:

3.1 PHWOBJ GetSerialObject(DWORD DeviceArrayIndex):

该函数返回一个指向HWOBJ结构的指针,该结构包含了相关硬件接口函数的函数指针。

DeviceArrayIndex串口索引号

3.2 VOID HWClearBreak(PVOID pContext):

清除串口中断状态,用于串口从中断状态恢复。

pConText指向HWInit函数返回的指针。

3.3 VOID HWClearDTR(PVOID pContext):

设置串口的DTR管脚为低

pConText指向HWInit函数返回的指针。

3.4 VOID HWClearRTS(PVOID pContext):

设置串口的RTS管脚为低

pConText指向HWInit函数返回的指针。

3.5 VOID HWClose(PVOID pContext):

关闭由HWInit函数初始化的设备

pConText指向HWInit函数返回的指针。

3.6 VOID HWDeinit(PVOID pContext):

当设备驱动被卸载的时候,该函数被调用。

pConText指向HWInit函数返回的指针。

3.7 VOID HWDisableIR(PVOID pContext):

禁用串口的红外模式

pConText指向HWInit函数返回的指针。

3.8 VOID HWEnableIR(PVOID pContext):

启用串口的红外模式

pConText指向HWInit函数返回的指针。

3.9 VOID HWGetCommProperties(PVOID pContext, LPCOMMPROP pCommProp):

重新获得当前串口设备的硬件属性。

pConText指向HWInit函数返回的指针。

pCommProp指向一个COMMPROP结构,该结构描述硬件设备的属性,比如最大波特率,停止位以及流控模式等。

3.10 INTERRUPT_TYPE HWGetIntrType(PVOID pContext):

获得当前的中断类型。返回值可以是INTR_NONEINTR_LINEINTR_RXINTR_TXINTR_MODEM,这些值在Serhw.h中定义。

pConText指向HWInit函数返回的指针。

3.11 VOID HWGetModemStatus(PVOID pContext, PULONG pModemStatus):

获得Modem的状态。

pConText指向HWInit函数返回的指针。

pModemStatusModem的状态。

3.12 ULONG HWGetRxBufferSize(PVOID pContext):

获得串口硬件接收Buffer的大小。

pConText指向HWInit函数返回的指针。

3.13 PVOID HWGetRxStart(PVOID pContext):

返回硬件接收Buffer的起始位置。

pConText没有被使用。

3.14 ULONG HWGetStatus(PVOID pContext, LPCOMSTAT lpStat):

获得硬件状态信息。

pConText指向HWInit函数返回的指针。

lpStat指向COMSTAT结构,该结构描述硬件状态。

3.15 PVOID HWInit(ULONG Identifier, PVOID pMDDContext, PHWOBJ pHWObj):

初始化串口硬件设备。

Identifier该驱动的键值,从MDD层传到PDD层。

pMDDContext指向MDD层串口相关信息,从MDD层传给PDD层。

pHWObj指向HWOBJ结构。

3.16 BOOL HWIoctl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)

执行I/O控制

dwOpenDataCOM_Open函数返回的Handle

dwCodeI/O控制操作码。

pBufIn传入的Buffer

dwLenIn传入的Buffer的大小。

pBufOut传出的Buffer

dwLenOut传出的Buffer的大小。

pdwActualOut:实际传出的数据的大小。

3.17 VOID HWLineIntrHandler(PVOID pContext):

线路状态信息中断处理函数

pContext指向HWInit函数返回的指针。

3.18 VOID HWModemIntrHandler(PVOID pContext):

该函数检测Modem状态,并对相关中断进行处理。

pContext指向HWInit函数返回的指针。

3.19 BOOL HWOpen(PVOID pContext):

打开串口设备,可以在该函数中打开串口硬件供电。

pContext指向HWInit函数返回的指针。

3.20 VOID HWOtherHandler(PVOID pContext):

该函数已经被HWModemIntrHandler取代,实现与HWModemIntrHandler一样。

pContext指向HWInit函数返回的指针。

3.21 BOOL HWPostInit(PVOID pContext):

该函数在COM_Init中被调用,但是在串口数据,硬件以及IST初始化后备调用。

pContext指向HWInit函数返回的指针。

3.22 BOOL HWPowerOff(PVOID pContext):

串口硬件进入Suspend模式。

pContext指向HWInit函数返回的指针。

3.23 BOOL HWPowerOn(PVOID pContext):

串口硬件从Suspend模式恢复到工作模式。

pContext指向HWInit函数返回的指针。

3.24 VOID HWPurgeComm(PVOID pContext, DWORD fdwAction):

清除串口硬件buffer的信息。

pContext指向HWInit</

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics