3095|4

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

问2410 Wince串口驱动的问题 [复制链接]

我在我的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是怎么联合起来的?恳请大家指点一下。

最新回复

今天11月28号了。 上面这个问题,我也困惑。我在看代码的时候经常遇到这样的问题,甚至会跨文件。 我自己的理解是,在platform builder 下,因为有dirs和sources的关系,所以可以这样写。 如果别的平台,又没这样的机制,恐怕要编译不过的。 你的理解呢?  详情 回复 发表于 2008-11-28 08:55
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

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

//////////////////////////////////////////////
原来在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;

const
HW_VTBL IrVTbl = {
        SerInitIR,
        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,
        SerEnableIR,
        SerDisableIR,
        SL_ClearBreak,
        SL_SetBreak,
        SL_XmitComChar,
        SL_GetStatus,
        SL_Reset,
        SL_GetModemStatus,
        SerGetCommProperties,
        SL_PurgeComm,
        SL_SetDCB,
        SL_SetCommTimeouts,
        };


其实MDD.c里所出现的HWInit//PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);  //只是函数指针,分层驱动就是通过这些函数来实现的。

程序太烂了,惭愧。还有些不明白,再看。
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
/////////////////////////////////////////
还有个问题我不明白
/////////////////////////////////////////
SL_GetInterruptType,
        SL_RxIntr,
        SL_TxIntrEx,
        SL_ModemIntr,
        SL_LineIntr,
        SL_GetRxBufferSize
,这些函数是在ser2410_hw.c里实现的,但是在ser2410_ser.c并没有声明就直接使用,按照C语言的语法,肯定是错误的,但是居然能用。这些我真不明白,我想请你帮我解释一下。因为在eeworld里面,就是你我在看这个串口了。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 gooogleman 的回复:
/////////////////////////////////////////
还有个问题我不明白
/////////////////////////////////////////
SL_GetInterruptType,
SL_RxIntr,
SL_TxIntrEx,
SL_ModemIntr,
SL_LineIntr,
SL_GetRxBufferSize,这些函数是在ser2410_hw.c里实现的,但是在ser2410_ser.c并没有声明就直接使用,按照C语言的语法,肯定是错误的,但是居然能用。这些我真不明白,我想请你帮我解释一下。因为在eeworld里面,就是你我在看这…


搞错了,应该向大家问才是。刚才直接把和别人聊天的内容发上来,没有想到我没有权限修改内容。难道要到专家级别才可以修改的吗?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
今天11月28号了。
上面这个问题,我也困惑。我在看代码的时候经常遇到这样的问题,甚至会跨文件。
我自己的理解是,在platform builder 下,因为有dirs和sources的关系,所以可以这样写。
如果别的平台,又没这样的机制,恐怕要编译不过的。
你的理解呢?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表