微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > WinCE下的串口驱动分析

WinCE下的串口驱动分析

时间:02-27 来源:互联网 点击:

到SerialAPI这一层,在这个层次上串口的行为还是相对简单的。





















我们这里仅仅涉及上面所提到的Serial/irda Driver这部分(绿色部分)。在wince提供的驱动例程中串口/红外驱动采用分层结构设计,MDD提供框架性的实现,负责提供OS所需的基本实现,并将代码设计与具体的硬件设计无关。而PDD提供了对硬件操作相应的代码。这些代码通过结构HWOBJ来相互联系。对于MDD PDD的整体驱动来看,串口驱动模型是作为Stream来实现的。

两者合一以达到实现驱动的目的。DDSI就是指这两个部分之间的接口,这个接口并非受到强制的物理/逻辑关系来约束,而是人为的规定的。在涉及到一种特定硬件我们进行针对实现的时候往往需要的是了解硬件的物理特性和控制逻辑,然后根据DDSI的约束就来进行实现。对于这里描述的驱动模型而言结合关键在于结构指针HWOBJ的使用和具体实现。在实际的驱动应用中仅仅需要实现HWOBJ相关的一系列函数,而无需从驱动顶层完全开发。串口驱动模型作为一种常用驱动模型在windowsCE中常常用于串口/红外/USB Client的具体实现。该驱动模型中对全功能的串口进行了定义,除了常用的TX和RX引线定义以外,针对DTR、RTS等功能引脚都进行了支持,使得用该模型设计的串口驱动支持流控制、具备驱动Modem等设备的能力。

事实上,如果需要的话完全可以将该驱动一体化设计(抛开PDD-MDD的划分,也就无须DDSI)。也就是不使用现有的驱动架构来进行实现。考虑到串口驱动的使用频率和执行效率要求都不是很苛刻的情况下抛弃驱动架构另外实现的就没有多大必要了。

对于驱动本身而言,串行驱动从功能和实现上相当的简单,确具被相当全面的成分,对该驱动的分析和了解无疑是学习流式驱动程序很好的典范。

代码分析

在开始具体代码之前我们先来看看,相关的一些结构。 HWOBJ是相应的硬件设备操作的抽象集合。结构的定义后的注释与实际的用途有点点出入,BandFlags指定IST的启动时间,可选为在初始化过程启动或是在打开设备的时候起动ISR.而第二个参数则是指定拦截的具体的系统中断号。最后一个参数是一个结构,该结构定义了硬件操作的各式行为函数的指针,MDD正是通过这些函数来访问具体的PDD操作。
typedef struct __HWOBJ {

ULONG BindFlags; / Flags controlling MDD behaviour. Se above.

DWORD dwIntID; / Interrupt Identifier used if THREAD_AT_INIT or THREAD_AT_OPEN

PHW_VTBL pFuncTbl;

} HWOBJ, *PHWOBJ;

而HW_VTBL则是代表具体硬件操作函数指针的集合,该结构所指向的函数包括了初始化、打开、关闭、接收、发送、设置Baudrate等一系列操作。结构存在就像纽带一样联系着PDD中的具体实现和MDD中的抽象操作。PDD的实现必须遵循HW_VTBL中所描述的函数形式,并构造出相应的HW_VTBL实例。驱动的编写就是针对这些函数来一一进行实现。

typedef struct __HW_VTBL {

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

BOOL (*HWPostInit)(PVOID pHead);

ULONG (*HWDeinit)(PVOID pHead);

BOOL (*HWOpen)(PVOID pHead);

ULONG (*HWClose)(PVOID pHead);

INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);

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

VOID (*HWTxIntrHandler)(PVOID pHead, PUCHAR pSrc, PULONG pBytes);

VOID (*HWModemIntrHandler)(PVOID pHead);

VOID (*HWLineIntrHandler)(PVOID pHead);

ULONG (*HWGetRxBufferSize)(PVOID pHead);

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,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top