Windriver简介

  1. 之前使用微软WDF框架下的WDK开发Windows驱动程序,使用起来调试速度太慢了,同时需要对内核态驱动程序有一定了解,就转到使用Windriver来开发驱动程序。就我个人而言,这款软件最大好处就在于它屏蔽了内核态下驱动程序的细节,所有的开发工作都建立在用户态下,你不必担心因为某些操作导致电脑蓝屏死机(当然有些特殊操作同样会蓝屏);开发代码也像写C语言一样,调试起来非常方便。
  2. windriver支持Win7/8/10等操作系统,支持PCI/PCIe/ISA等设备,在这里,我使用到的是win7+VS2013,总线类型是PCIe
  3. 使用这款软件开发驱动程序的流程很简单,你可以选择它自带软件界面来进行一些板卡的寄存器读写,也可以生成代码后进行定制修改,这样你只需要学习一些windriver封装好的函数就行了。
  4. 在jungo网站的windriver support里有一些使用windriver碰到的问题和解答,基本上涵盖了绝大部分常见的问题;在windriver for windows里可以下载到windriver pci的使用guide,告诉你如何快速见了一个windriver驱动程序,这也是接下来我要讲的。

Windriver快速生成驱动程序

  1. 首先需要安装windriver,百度一下就可以找到很多,我安装的是WinDriver v12.2.1版本,安装默认路径在C盘,安装好之后在桌面会出现两个图标,一个是windriver(用来生成驱动程序),另一个是监控软件Debug Monitor(执行windriver驱动程序时,监控内核态的执行过程)
  2. 将需要使用的板卡插入电脑相关PCIe卡槽后,打开DriverWizard,选择生成New host driver project,选择刚才的板卡,我这里是PCIe:Xilinx-DeviceID:0x1206
  3. 在右边选择Generate .INF file,Device name自己可以重新命名一个,勾选上支持MSI终端和自动安装,然后next保存后即可。这样一个初步的INF文件就生成好了,然后去设备管理器里找到插入的板卡,选择‘更新驱动程序’,选择‘浏览计算机以查找驱动程序软件’,选择‘从计算机的设备驱动程序列表中选择’,选择‘从磁盘安装’,选择‘浏览’,找到刚才生成的INF文件,打开确定安装好就行了。
  4. 接着我们回到select your device界面或者打开已生成的.wdp文件(和INF文件同一目录);这里我们可以看到这个板卡的配置空间信息,这一部分不用管,是板卡的配置信息通过PC映射出来的。

    接着是中断相关的信息,这里表示支持MSI中断,中断数字代码为9,下面可选监听中断,如果板卡产生了中断,在Information Panel界面会监听到。
  5. 最后一部分比较重要,是板卡的Memory资源映射到PC上。可以看到,该板卡总共设计了三个BAR空间,不同的BAR存储空间都有对应的首地址和长度。需要注意的是这里的地址并不是虚拟地址,个人认为也不是物理地址,是板卡的BAR存储空间通过PCIe映射到PC上的总线地址,如果需要进行代码开发是不能直接使用到的,除非该地址能被你想访问的寄存器所能识别到(也就是在FPGA板卡设计时,所访问的寄存器和该BAR空间必须相连)。
  6. 选择BAR0, 点击右边的Read/Write Memory访问该BAR,或者可以选择Add Access Register创建一个暂时存在的寄存器,来访问该BAR。
    接着我们在offset 0 处写下了0x12345678,读出来也是0x12345678,说明该BAR可以正常读写;而去读offset 1时读出来值是0x123456,offset 2是0x1234, offset 3是0x12,这说明是32bit编址,与我们写的size相符。
  7. 使用DriverWizard可以较为方便地访问板卡,并且可以使用一些简单功能,当然也可以进行DMA传输,就是需要配置寄存器比较多。如果进行修改代码的话,可以方便地进行功能定制化。

Windriver驱动代码生成

  1. 在DriverWizard菜单栏里选择Generate Code(安装好INF文件之后),Add device-specfic customization根据不同板卡我选择了Xilinx BMD design,也可以选择No custmomization;Code langiage默认为ANSI C;安装环境根据操作系统和VS板卡,我选择了MS .NET2013(for AMD64),IDE则就是MS Developer Studio .NET
  2. ok之后额外功能全勾选上,包括了Kernel PlugIn等功能,直接OK就可以了
  3. 接着去生成的目录打开.sln文件就可以看到生成的代码了,然后把报错处理掉,编译生成.exe文件,运行该exe程序后可以得到如下界面。

Note:

在DriverWizard的菜单栏Help里可以选择Windriver PCI/ISA/PCMCIA Mannul,会出现一个User Mannul的html文件,这个页面里会详细介绍Windriver生成驱动代码后,如何去修改来满足定制化功能需求,包括DMA/中断等功能,也有一些windriver下常用函数、数据结构的使用方法。

更多推荐

驱动程序(8) Windriver初步使用和快速生成驱动程序代码