windows 2000/xp WDM设备驱动程序开发 (2)

4. WDM环境  

  a  安装VC6.0;

  b  安装相应操作系统的DDK(组件一定要全选);

  c  安装DriverStudio;

  d  用VC6.0打开Compuware\Driver Studio\DriverWorks\Source\VdwLibs.dsw工程;

1)用DriverStudio的driverWizard来创建工程

   创建RegSample完后编译出现错误,删掉没有的函数,然后去掉了ntstrsafe.lib 链接库

2)EzDriverInstaller (driverstudio)安装 inf

3)图标,-20是 

                -5是 

     注册表的HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Class 可以更改对应的图标

4) 打log, KTrace, KDebugOnlyTrace, DbgPrint

    USB2.0 最高60MB/s黑色或白色接口,3.0是600MB/s蓝色, 

5. 驱动和应用的通信

5.1 打开设备 createFile(), 用GUID或符号链接

           同步:FILE_ATTRIBUTE_NORMAL

           异步:FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 

     关闭设备 closeHandle(), 产生 IRP_MJ_CLEANUP 和 IRP_MJ_CLOSE, 应用程序Ctrl_C强行退出和出错退出都产生这两个IRP

     DeviceIoControl(), 异步调用waitForSingleObject来等待IO完成

    

   readFile, writeFile, 

   

  

  5.2 驱动和应用通信

  WDM两种方法:

   1)异步完成IRP,intrdemo DS的例子,没看

   2)win32事件(就是createEvent),charFilter例子,没看

 

6. 常见编程技术

6.1 字符串

   CHAR, WCHAR, ANSI_STRING, UNICODE_STRING

   KUstring类

6.2 内存

  非分页内存 m_image = new(NonPagedPool) UCHAR[m_size];

  KMemory类,为内存描述符表MDL提供服务,

  KHeap类内存堆,比较大块

6.9 CancelSpinLock类, 全局取消自旋锁是瓶颈,CPU在等待自旋锁的时候什么也不能干。 可用IoSetCancelRoutine来代替

6.10 KSpinLock类,可以阻塞其他线程

6.12 timerSample, FileThread

      实例模仿driverMonitor来打印log

 

7. PNP 即插即用例程

  启动、停止、删除设备, DW自动生成这三例程

8. 电源管理

9. WMI 系统管理

10. IRP串行化

 1) driverworks提供了KDeviceQueue,

  KDevice::QueueIrp(),irp入队; 若队列闲则调用StartIo

 KDriverManagedQueueEx用于自己管理多个队列

  startIoChar_Driver实例

11. WDM过滤器驱动

  和普通驱动一样,都有DriverEntry,addDevice等,用设备堆栈来分层

  上层驱动用于添加附加功能

  下层驱动用于帮助写一个总线无关的驱动,如PCI总线、USB总线可以统一成一个总线结构的功能驱动

12 USB设备开发

   设备接口暴露一个或多个端点,有四种:批量,控制,中断,同步

   0号端点:默认的控制方法,

   事务由一个或多个阶段组成,阶段有三种:令牌、数据、握手

   (待续)

13. PCI设备驱动

   xp86的IO地址有64KB,而内存地址空间4GB

   KMemoryRange, KIoRange

   KPciConfiguration

   connect() , 把中断对象和中断服务例程连接起来

   DMA传输

 1)实例

    a) PCI9054接口卡,采用PLX公司的PCI9054芯片,局部总线接口模式为C模式,9054局部总线信号线和FPGA芯片相连。

    设备要访问的资源:前两个固定用于9054的操作寄存器;第三个为IO映射空间,用于设备访问

    b) FPGA有FIFO,DMA采用块模式

    c) 9054实例过程:先IO指令写32字节到FIFO,然后DMA块传输读

    d) DMAsample

 

 

 

 

   

posted @ 2017-06-30 11:45  波罗蜜  阅读(428)  评论(0编辑  收藏  举报