zoukankan      html  css  js  c++  java
  • windows 2000/xp WDM设备驱动程序开发 (2)

    4. WDM环境  

      a  安装VC6.0;

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

      c  安装DriverStudio;

      d  用VC6.0打开CompuwareDriver StudioDriverWorksSourceVdwLibs.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

       

  • 相关阅读:
    【vim】分割窗口、标签页与Quickfix窗口
    新手学cocos2dx,centos7下的安装过程
    外部排序,杀鸡焉用牛刀?
    5亿整数的大文件,怎么排?
    【Hadoop】HDFS
    你好,树
    写给博客园博客团队,md的预览在哪里?
    老菜鸟致青春,程序员应该选择java 还是 c#-
    高性能server分析
    高性能服务端漫谈
  • 原文地址:https://www.cnblogs.com/yuanming/p/7060924.html
Copyright © 2011-2022 走看看