• 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

       

  • 相关阅读:
    第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
    POJ1050 To the Max 最大子矩阵
    POJ1259 The Picnic 最大空凸包问题 DP
    POJ 3734 Blocks 矩阵递推
    POJ2686 Traveling by Stagecoach 状态压缩DP
    iOS上架ipa上传问题那些事
    深入浅出iOS事件机制
    iOS如何跳到系统设置里的各种设置界面
    坑爹的私有API
    业务层网络请求封装
  • 原文地址:https://www.cnblogs.com/yuanming/p/7060924.html
Copyright © 2020-2023  润新知