李健铎 孟宪华
(东软医疗系统股份有限公司,辽宁 沈阳110034)
在医疗诊断过程中,人体的心电(ECG)在诊断高血压性心脏病上的临床意义和应用价值。本设计心电模块Physio 系统如图1 主要包括连接电脑端的ECG 组合电缆,处理ECG 信号的逻辑电路,Cypress 型号CY7C64713(FX1)芯片以及Physio 探头接口插件。
图1 心电模块系统
WDF(Windows Driver Foundation)是微软继WDM(Windows Driver Model)之后提出的全新的驱动程序模型,目前在主流Windows7/8/10 操作系统中应用广泛,相比WDM框架,WDF 框架拥有高度灵活,可扩展,实现了公共驱动程序功能(如电源管理、PNP 支持)。
本文驱动设计主要以Windows10 操作系统1803 版为基础,USB 驱动主要使用的驱动程序堆栈是USB 3.0 stack,与USB 2.0 差别在于USB 协议层加载的基础驱动程序堆栈不同,见表1,这导致了WDF 编写风格的不同。
表1 驱动程序堆栈
WDF 提供了两个框架,内核模式驱动程序框架(KMDF)和用户模式驱动程序框架(UMDF),本文设计使用的是KMDF 驱动程序架构。
无论是内核模式还是用户模式的驱动程序,都采用同一套对象模型构建,采用了同一个基础承载,如表2 所示,通过调用WdfDriverCreate 函数创建一个驱动对象,贯穿整体驱动框架。在WDF 框架中,设备对象是驱动对象的核心成员,调用EvtDriverDeviceAdd 函数来创建所需的设备对象。与WDM不同的是,EvtDriverDeviceAdd 函数不仅完成创建设备对象,还会创建电源管理模块、IO 队列、设备驱动接口GUID 等一系列功能。
表2 基础框架接口
KMDF 驱动不能直接与Physio 心电模块通信,所以驱动需要创建请求并将其提交到USB 驱动程序堆栈进行处理,而每个请求中包含了一个URB 请求块(USB request block),KMDF 驱动程序通过URBs 执行所有设备特定的操作,包括数据传输。在将URB 提交到USB 驱动程序堆栈之前,KMDF 驱动程序必须用该请求的相关信息对其进行初始化。在Windows10 操作系统下,URBs 初始化方式也有明确的要求。主要分为四个步骤:URB请求包创建、URB 初始化、URB 信息填充、URB 发送。
表3 URB 基本操作函数
IO 读写函数不同于WDF 的BULK Write/Read 函数,为了与超声系统兼容,读写函数在PhysioEvtIoDeviceControl()函数中执行,以读功能为例,通过FindUsbPipeType()函数获取上下文句柄UsbPipeHandle,调用WdfUsbTargetPipeIsInEndpoint()函数获取当 前 管 道 是 IN 还 是 OUT ( 读 取 为 IN), 利 用WdfUsbTargetPipeFormatRequestForRead()函数,当数据被读取后执行后回调函数EvtRequestReadCompletionRoutine(),至此,来自心电模块的采集数据就传递到系统软件中。
根据Cypress 芯片CY7C64713 设计要求,在设备加载驱动过程中需要下载两次bix 固件,分别是引导文件physioFX1.bix和功能文件physio.bix。图2 所示的是正确的加载引导及功能文件后,设备正常枚举的情况。
图2 设备枚举成功
结合超声系统环境,在成人心脏的预设下如图3 所示,利用心电模拟器进行波形仿真:
图3 心电模块模拟仿真图
本文主要介绍了Windows10 操作系统下的心电模块的驱动开发,并在超声系统中模拟波形验证,同时围绕心电模块进行了相关通道控制测试,确保了设备的安全性及可靠性。