2410串口——MDD和PDD的结合方法

来源:互联网 发布:淘宝怎么开通企业店铺 编辑:程序博客网 时间:2024/05/16 06:14

我在我的BSP里面有MDD.c,ser2410_ser.c,ser2410_hw.c,三个源代码文件。MDD.c和单层驱动的结构类似,都是一些供应用程序调用的接口函数,调用了HWInit等函数。我看了几篇关于串口驱动分析的文章,结合代码,很多不明白。
////////////////////////////////////////////////////////
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结构,该结构中包含一个函数指针列表,这些函数指针指向串口硬件操作函数,用于操作串口。

 

view plaincopy to clipboardprint?
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; 
///////////////////////////////////////////////////////////////////////////////////////////////
HWOBJ以及BOOL (*HWIoctl)等HW开头的函数在C:/WINCE500/PUBLIC/COMMON/OAK/INC/serhw.h定义了,
这些文章都说(*HWIoctl)等HW开头的函数在PDD层中实现,但是我在ser2410_ser.c,ser2410_hw.c这些文件并没有看见这些函数的名字。怎么回事的?只看到一些
SerClose,SL_Close之类的函数,
MDD.c,ser2410_ser.c,ser2410_hw.c是怎么联合起来的?恳请大家指点一下。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

自己动手,丰衣足食

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

我找到答案了
原来是我程序太菜了,有些隐蔽的东西没有发觉。惭愧
现在贴出来给大家笑话一下。

//////////////////////////////////////////////
原来在ser2410_ser.c中有如下程序
const
HW_VTBL IoVTbl = {  //初始化结构体
SerInitSerial,
SL_PostInit,
SerDeinit,
SerOpen,
SerClose,
SL_GetInterruptType,
SL_RxIntr,
SL_TxIntrEx,
SL_ModemIntr,
SL_LineIntr,
SL_GetRxBufferSize,
SerPowerOff,
SerPowerOn,
SL_ClearDTR,
SL_SetDTR,
SL_ClearRTS,
SL_SetRTS,
SerEnableSerial,
SerDisableSerial,
SL_ClearBreak,
SL_SetBreak,
SL_XmitComChar,
SL_GetStatus,
SL_Reset,
SL_GetModemStatus,
SerGetCommProperties,
SL_PurgeComm,
SL_SetDCB,
SL_SetCommTimeouts,
};
extern const HW_VTBL SerCardIoVTbl;

其实MDD.c里所出现的PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext); 等函数只是定义了一下而已,后面使用一个IoVTbl 函数表来初始化这些函数,相当于做了个转换。分层驱动就是通过这些函数来实现的。

 

作者wogoyixikexie@gliet.桂林电子科技大学一系科协,原文地址:http://blog.csdn.net/gooogleman


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gooogleman/archive/2008/08/19/2794325.aspx