首页 > 系统相关 >转载:基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建

转载:基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建

时间:2023-11-20 15:13:14浏览次数:35  
标签:PCI 驱动程序 接口卡 Windows WDF PCIe 开发

原文出处:http://www.cnblogs.com/jacklu/p/4619110.html

本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法。

这个系列的博客将首先用一个篇幅为不懂Windows 下PCI/PCIe驱动开发的介绍WDF和开发环境搭建,接下来几篇将直接讲述程序编写,

看完这几篇后,希望能够帮助读者了解如何通过500行左右的代码实现一个标准的PCIe接口卡驱动程序。

毕设题目的PCIe板卡是BAR0下映射两个5K的内存,偏移地址为0x20000和0x22000,源代码在文章结束后会考虑公布

 

如果你觉得这篇博客对你的项目有用,请引用以下论文:

Meng Shengwei, Lu Jianjie. Design of a PCIe Interface Card Control Software Based on WDF. Fifth International Conference on Instrumentation and Measurement, Computer, Communication and Control. IEEE, 2016:767-770.

1.1WDM与WDF

Windows平台下的设备驱动程序从Windows 2000开始都是以WDM ( Windows Driver Model) 框架为平台进行开发。以此模型开发,开发者需要一方面实现驱动程序与硬件的交互,另一方面要对操作系统内核进行操作,难度大。驱动程序容易出现问题,这也是Windows2000以来操作系统容易蓝屏的原因。

为了改善这种局面,降低驱动程序开发者的开发难度,提高系统稳定性,微软推出了新的驱动程序开发模型WDF。WDF对WDM进行了封装,将驱动程序中与操作系统交互的细节由框架实现。这样驱动程序就从内核中分离出来,开发者只需要专注处理与硬件的交互,简化了驱动程序的设计,提高了整个系统的可靠性和稳定性。WDM与WDF样例驱动程序对比如下表所示。通过该表可以看到基于WDF框架的驱动程序,代码量显著减少,开发起来更加容易。

WDF是UMDF(User Mode Driver Framework,用户模式驱动程序框架)和KMDF(Kernel Mode Driver Framework,内核模式驱动程序框架)的总和。由于本课题基于PCIe硬件设备进行驱动开发,涉及到内存读写等内核操作,所以使用KMDF框架来编写驱动程序。

1.2 Windows驱动程序

我们知道Windows是一个分层的操作系统,它的运行依赖于上层组件向下层组件的调用。一个简化的I/O流模型如下图:

 

1.3 WDF框架

通过参考《竹林蹊径 深入浅出Windows驱动开发》和《Developing_drivers_with_the_Microsoft_Windows_Driver_Foundation》,WDF抽象的框架如下图所示:

 

WDF已经把驱动程序开发做了很好的封装,开发者只需要定义框架对象和编写事件回调函数。WDF中也采用对象,但是它和C++这种编程语言中的对象不相同,毕竟WDF是C写的。如何解释WDF的对象我也做不到,我的一直把WDF中的对象看做一种数据结构,比如WDFDRIVER对象,其实就是一个与驱动程序相关的结构体。另外,WDF中也有例程这样的称呼,是对routine的翻译,可以理解为函数体。所以简单来说,对PCIe驱动程序来说,开发者需要定义一些结构体,编写几个函数就ok了,具体如何被调用,那就是WDF框架内部的事情了,我们只需要知道,当我们注册好编写好的回调例程之后,当事件发生(设备插入、设备打开、I/O操作等)时,WDF会自动帮我们调用相关的例程。

 1.4 开发环境搭建

Windows 驱动程序开发工具包 (WDK) 与 Microsoft Visual Studio 和用于 Windows 驱动程序的调试工具相集成。该集成环境给开发者提供了开发、构建、打包、部署、测试和调试驱动程序时所需的工具。

本课题确定时,微软的最新驱动程序工具包为WDK8.1。WDK8.1 更新与 Microsoft Visual Studio2013 集成。开发者需要首先在微软的官方网站上下载并安装 Visual Studio 2013,然后安装WDK 8.1 更新。微软声明不再对WDK8.0提供支持,也不再对WDK 8.0做任何更新,WDK8.0也不支持Windows8.1的驱动程序开发。所以本课题选用WDK8.1作为开发工具包。然而新技术发展速度飞快,在本课题完成之际,微软打算极力推广的Windows 10操作系统还未正式公布,针对Windows 10的驱动程序开发工具包WDK 10已经推出。未来一定会推广使用WDK10来开发。

下载链接:https://msdn.microsoft.com/zh-cn/windows/hardware/hh852365,下载两个安装包,依次安装,非常简单。

1.5 PCIe简介

最后简要介绍一下PCIe。

PCIe协议采用分层结构,如下图所示,PCIe的结构主要由以下三个层次组成,它们分别是:传输层(Transaction Layer),数据链路层(Data Link Layer)以及物理层(Physical Layer)。其中物理层又可以分为两个子层:逻辑子层(Logical Sub-block)和电气子层(Electrical Sub-Block)。

TLP(Transaction Layer Packet)由传输层产生,通过使用存储器事务,I/O事务,配置事务和消息事务来进行信息数据的通信;DLLP(Data Link Layer Packet)由数据链路层产生,用来在该链路上两个直连设备之间传递信息,其内容主要包括功耗管理信息,流控制信息以及 TLP 的应答信息等。DLLP只开始在数据链路层,并止于数据链路层,不会上传到传输层。

以上是希望读者能够对PCIe有个初步的了解,但是对驱动程序的开发并没什么卵用。

对PCIe设备来说,它可以有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。因为PCIe设备支持即插即用,所以并不占用固定的内存地址和I/O地址,而是在设备插入时由操作系统决定其映射的基址。配置空间对设备控制程序设计来说非常关键。PCIe设备支持基本的256字节PCI兼容配置空间。对PCI/PCIe设备来说,其基本的配置空间为前64字节,如下图所示。

由于PCIe是基于PCI提出的,地址空间模型没有变化,所以PCI控制软件可以完全兼容PCIe设备。

下一篇博客将讲述PCIe的WDF驱动程序中几个非常重要的概念,对初学者了解WDF非常有用。

 广告时间~本人博士赚外快,如需要完整的驱动程序源代码请联系合作email: [email protected]

标签:PCI,驱动程序,接口卡,Windows,WDF,PCIe,开发
From: https://www.cnblogs.com/swlingling/p/17843984.html

相关文章

  • 转载:基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概
    原文出处:http://www.cnblogs.com/jacklu/p/4646601.html本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法。在上一篇简要介绍了WDF和开发环境搭建后,本篇将讲述几个WDF中的概念,对开发者了解WDF非常有帮助,属于“内功部分”;本篇文章结......
  • Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息
    (文章目录)前言本文将带大家学习驱动程序的具体编写及出口入口函数解析。一、出口函数入口函数解析每一个驱动程序都是含有出口函数和入口函数的,装载驱动的时候先调用入口函数,卸载驱动的时候则调用出口函数。入口出口函数的形式如下:static__initinthello_dev_init(void)......
  • Linux读取文件的简单字符驱动程序
    Linux读取文件的简单字符驱动程序设备驱动程序作为沟通外部硬件与Linux内核的纽带,属于嵌入式开发中不可避免的一环。Linux内核程序的开发和用户空间中开发的不同之处在于两点,一是内核程序由内核进行调用,基本没有一个类似于用户空间程序中的main函数,二是内核代码无法调用很多我们......
  • ESXI内虚拟服务器安装VMware tools报Windows无法验证此驱动程序软件的发布者
    ESXI内虚拟服务器安装VMwaretools报Windows无法验证此驱动程序软件的发布者 安装VMwaretools时,报Windows无法验证此驱动程序软件的发布者提示无法安装驱动后,自动回滚,导致安装失败。后来发现是WIN2008R2虚拟服务器少了KB4474419补丁,下载这个补丁的镜像文件(下载链接:https......
  • Rockchip RK3399 - DRM HDMI驱动程序
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux:6.3----------------------------------......
  • 关于Windows打印机驱动相关问题-如何利用Java(或其他)调用打印机驱动程序完成原始文件翻
    前面这些都是问题描述,问题在偏下面场景:用户电脑上安装了PCL驱动,可通过驱动完成打印。需求:现在需要提供一种脱离PC端完成文件上传并打印的功能。让用户使用手机或pc未安装驱动时都能打印文件。目前思路:首先上传文件这一步没有任何问题,开发了相应的H5界面,通过浏览器进行原始文件......
  • 第一个驱动程序(在Ubuntu系统下运行)
    一、构造内核源码树#apt-cachesearchlinux-source#apt-getinstalllinux-source-4.4.0(下载的源码在目录/usr/src下)#解压内核源码tarxjf.....进入源码目录#makeoldconfig#make#makemodulesmakemodules_install12345678ref:http://blog.chinaunix.n......
  • Rockchip RK3399 - DRM eDP驱动程序
    在《RockchipRK3399-DRM驱动程序》》我们已经介绍过了,RK3399有两个VOP,均可以支持HDMI、eDP、DP、MIPIDSI0、MIPIDSI1显示接口,本节我们选择eDP作为分析的对象。一、设备树配置1.1edp设备节点设备节点vopb下的子节点vopb_out_edp通过edp_in_vopb(由remote-endpoint属性指定)......
  • Rockchip RK3399 - DRM eDP驱动程序
    在《RockchipRK3399-DRM驱动程序》》我们已经介绍过了,RK3399有两个VOP,均可以支持HDMI、eDP、DP、MIPIDSI0、MIPIDSI1显示接口,本节我们选择eDP作为分析的对象。一、设备树配置1.1edp设备节点设备节点vopb下的子节点vopb_out_edp通过edp_in_vopb(由remote-endpoint属性指定)......
  • 数据采集IO卡 软件无线电处理平台:136-KC705E增强版基于FMC接口的 Kintex-7 XC7K325T P
    一、板卡概述   本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动。   二、功能和技术指标: 板卡功能参数内容主处理器Xi......