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

WinCE下的串口驱动分析

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

由CE的电源事件来引发,MDD并没有对这两个函数进行处理,仅仅是将其传递给PDD。

COM_IOControl

该函数用于实现向设备发送命令的功能。由于代码本身没有什么流程或逻辑性可言,全都是单独的实现,下面就用列表的方式大致的说一下这些命令字和其实现。

Command

Note

IOCTL_PSL_NOTIFY

在调用驱动的进程退出时产生,并不是串行驱动专有的IO命令。这里会调用 ProcessExiting函数进行处理。这个函数的内容放到后面来看。

IOCTL_SERIAL_SET_BREAK_ON

中断(暂停)serial当前的发送或是接收,具体实现在PDD中

IOCTL_SERIAL_SET_BREAK_OFF

从中断(暂停)状态恢复,具体实现在PDD中

IOCTL_SERIAL_SET_DTR

将DTR引线拉高。(直接调用PDD实现)

IOCTL_SERIAL_CLR_DTR

将DTR引线拉低。(直接调用PDD实现)

IOCTL_SERIAL_SET_RTS

将RTS引线拉高。(直接调用PDD实现)

IOCTL_SERIAL_CLR_RTS

将RTS引线拉低。(直接调用PDD实现)

IOCTL_SERIAL_SET_XOFF

软件流模式下中止数据发送(Xflow控制)

IOCTL_SERIAL_SET_XON

软件流模式下启动数据发送(XFlow控制)

IOCTL_SERIAL_GET_WAIT_MASK

获取当前的事件对象

IOCTL_SERIAL_SET_WAIT_MASK

设置事件对象,这个过程相对比较麻烦,要将当前获得的事件对象mask设置到所有的Open实例中,这和前面的 EvaluateEventFlag过程相似。

IOCTL_SERIAL_WAIT_ON_MASK

等待与提供的事件相同的事件发生,实现实体是 WaitCommEvent后面再讨论。

IOCTL_SERIAL_GET_COMMSTATUS

清除异常并返回当前状态(由PDD实现)

IOCTL_SERIAL_GET_MODEMSTATUS

获取modem状态(由PDD实现)

IOCTL_SERIAL_GET_PROPERTIES

获取通讯************************(由PDD实现)

IOCTL_SERIAL_SET_TIMEOUTS

设置超时时间(包含PDD实现)

IOCTL_SERIAL_GET_TIMEOUTS

获取超时时间

IOCTL_SERIAL_PURGE

清除制定的发送或接收缓冲内的数据(含PDD实现)

IOCTL_SERIAL_SET_QUEUE_SIZE

不明,若知道请告知

IOCTL_SERIAL_IMMEDIATE_CHAR

为扩展功能,在发送数据前设置一个标志数

IOCTL_SERIAL_GET_DCB

获取DCB数据结构

IOCTL_SERIAL_SET_DCB

设置DCB数据结构

IOCTL_SERIAL_ENABLE_IR

启动红外模式(由PDD实现)

IOCTL_SERIAL_DISABLE_IR

禁用红外模式(由PDD实现)

到这里MDD的主要函数都已经介绍过了,下面几个函数是在DeviceIOControl中用到的。这里顺便也来看一下:

ProcessExiting

该函数在IOCTL_PSL_NOTIFY命令的执行过程中被调用,之前的情景是使用驱动的进程在被取消的过程中,在这里主要是清除所有正在会话中的线程。以便直接kill掉该进程。

WaitCommEvent

事实上该函数为SerialAPI WaitCommEvent在驱动内的实现,其作用为阻塞线程直道某一固定的串口通告(事件消息)发生。在具体的实现中,是用WaitForSingleObject来实现阻塞。在进入阻塞之前,函数适用一个循环主体首先查询是否存在已有的通告与等待通告相符,若没有就等待下一次事件发生,待事件发生再次进行检查。如此循环达到阻塞的目的。

ApplyDCB

DCB数据结构是描述串行口波特率,流控制,奇偶效验等资料的载体。该函数是MDD设置DCB数据结构至驱动内部和硬件的手段,这里使用了大量的PDD操作来完成硬件设置。

总结:

在驱动实现方面,除去所谓Multi-Open的处理外,串口的MDD并没有什么特别的之处,在掌握了硬件行为和应用软件行为后很容易能读懂其间的代码。

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

网站地图

Top