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
- 2410串口——MDD和PDD的结合方法
- 2410串口——MDD和PDD的结合方法
- 驱动程序---音频 MDD 和 PDD
- 驱动程序---音频 MDD 和 PDD
- wince驱动-串口分析-mdd,mddcommon,pdd
- wince驱动程序---音频 MDD 和 PDD
- MDD+PDD+FMD架构 HIVE的实现
- Windows CE 5.0:驱动程序---音频 MDD 和 PDD
- Windows CE串口驱动简析(2)-PDD层实现:CReg2410Uart和TX部分(基于WinCE5.0 SMDK2410 BSP的Serial驱动)
- Windows CE串口驱动简析(4)-PDD层实现:CPdd2410Serial1和CPdd2410Serial2(基于WinCE5.0 SMDK2410 BSP的Serial驱动)
- WINCE官方提供的串口驱动PDD层代码简单分析
- WINCE官方提供的串口驱动PDD层代码简单分析
- MTD和MDd导致的问题
- MTD和MDd导致的问题
- MTD和MDd导致的问题
- MTD和MDd导致的问题
- JNI_OnLoad方法和RegisterNatives方法的结合
- wince 2440串口驱动PDD分析(作者:wogoyixikexie@gliet)
- 开始探索技术之旅
- 在C#.net中如何操作XML
- 为php安装GD
- SQL SERVER CE RDA同步配置记录
- ASP.NET页面刷新方法总结
- 2410串口——MDD和PDD的结合方法
- XML复习(S2)
- php定时计划任务介绍
- Mysql 定义外键
- CMS(内容管理系统)
- mysql常见命令和学习心得
- Infra Recorder
- 关于C# MessageBox的使用
- 2009-09-02