zoukankan      html  css  js  c++  java
  • windows设备驱动程序WDF开发(3)

    第8章 KMDF过滤器驱动程序

    1. 管理设备的主功能为功能驱动FDO, 过滤器驱动位于FDO的上层或下层

        WdfFdoInitSetFilter // 声明这个一个过滤驱动

    2. 安装要修改FDO的inf文件

    FilterSample实例

    第9章 USB设备开发

    1. USB2.0 最快480Mb/s, UBS3.0速度 5.0Gbps (500MB/s)

    2. USB设备有一到多个配置

        每个配置有一到多个接口

        每个接口有一到多个端点,端点是通信管道的终点, 有四种:批量(bulk), 控制,中断(interrupt),同步(Isochronous)

        1)端点0默认是可以访问的,输入和输出

        2)FDO的作用是把IRP引导到正确端点的管道上,把需求提给总线驱动,总线驱动分解成事务(transaction),送往总线

            事务有一到多个阶段(phase),phase分令牌(token),数据和握手(ack)

    3. USB数据传输方式

        1)控制传输:最高优先级,最大数据64B,每个控制事务包括一个SETUP令牌,带可选的数据阶段和握手阶段,设备必须响应控制传输

        2)

     (usb驱动部分待续)

    第10章 PCI设备驱动程序开发

    1. 微机扩展插槽有:ISA(已淘汰), PCI(即插即用,不是热插拔)

       PCI: 32位数据总线,速率132~264MB/s, 

       通用PCI总线接口:AMCC的S5933,PLX的9054。也可以用FPGA实现PCI接口

    2. 开发驱动主要有3方面问题:硬件访问,中断处理,DMA传输

        X86有两种地址空间:I/O地址(只有64KB),内存地址(4GB以上)

        I/O映射:一个芯片的地址在I/O地址空间的范围,只能通过I/O指令来访问。

        内存映射:内存指令访问

    3. I/O访问

        WRITE_PORT_UCHAR ,   WRITE_PORT_USHORT, WRITE_PORT_ULONG

        WRITE_PORT_BUFFER_UCHAR ...

    4. 存储器访问

        WRITE_REGISTER_UCHAR ...

        WRITE_REGISTER_BUFFER_UCHAR

    5. 硬件访问编程

       1) 根据配置定义地址指针,用于修改PCI9054的寄存器, MemBaseAddress0 和 IoBaseAddress0

       2)EvtDevicePrepareHardware 中初始化 MemBaseAddress0

         CmResourceTypePort IO端口 资源

         CmResourceTypeMemory

         CmResourceTypeInterrupt  

    6. 中断处理

       WDFINTERRUPT, 运行在DIRQL级别,处理时间尽可能短

       中断服务例程是异步调用的,必须考虑其他例程和中断服务例程的共享数据的保护性访问(硬件中断自旋锁,运行在DIRQL)

       WDF_INTERRUPT_CONFIG_INIT, WdfInterruptCreate

    7. DMA编程对象

       1) WDFDMAENABLER,用于建立一个DMA适配器,说明DMA通道的特性,  WdfDmaEnablerCreate

       2) WDFDMATRANSACTION, 用于传输控制, WdfDmaTransactionCreate

           启动一个DMA传输,获取传输缓冲区的物理地址和字节数,DMA传输结束后的数据处理

           函数:

           WdfDmaTransactionInitialize(EvtProgramDmaFunction): WdfDmaTransactionExecute后会调用EvtProgramDmaFunction

           WdfDmaTransactionExecute 执行DMA传输

           WdfDmaTransactionRelease 终止传输

         WdfDmaTransactionDmaCompleted 测试传输是否完成

           WdfDmaTransactionDmaCompletedFinal 强行完成DMA传输

           WdfDmaTransactionGetBytesTransferred 传输的总字节数

           WdfDmaTransactionSetMaximumLength 设置传输的最大字节数,应小于65536

       3) WDFCOMMONBUFFER,申请系统的公用缓冲区, WdfCommonBufferCreate

           对于DMA操作,系统提供一个特殊的内存,物理上连续的内存,称为公用缓冲区(比较稀有,避免浪费)。

           对于支持分散/聚集DMA的设备,可以不用公用缓冲区

      

    8. DMA传输编程

        DPC中,测试DMA传输完成没有,若没有,则WdfDmaTransactionExecute 继续传输

    PCI9056:

    #define INTCSR 0x68
    #define CNTRL 0x6C
    #define DMAMODE0 0x80
    #define DMAPADR0 0x84
    #define DMALADR0 0x88
    #define DMASIZ0 0x8C
    #define DMADPR0 0x90//descriptor
    #define DMACSR0 0xA8//DMA通道0 命令状态寄存器
    #define HPIC 0x00
    #define HPIA 0x04
    #define HPID 0x08

    第11章 UMDF驱动程序编程入门

    UMDFSample实例

    是dll程序

    第12章 WinDbg使用介绍

    1. windbg调试:双机调试,也可以用虚拟机代替

        目标机:启动时选择“启用调试程序”

        主控机:winDbg中kernel debugging

        windbg:debug-》break, 使主控机和目标机连接

        .reload 加载符号文件

        ld projectName  加载PDB文件

        lm l 显示已经加载符号文件列表

    2. 调试

        F9 在源文件中设置断点

        G  使目标机运行

        F10 执行

  • 相关阅读:
    Java8 lambda表达式语法 1
    Spring WebMVC 4.1返回json时 406(Not Acceptable)
    上传 第三方jar包 nexus
    Nexus 使用配置
    Nexus 安装 使用说明
    mysql 常用命令
    JedisPoolConfig配置
    tomcat 管理端 安全措施
    Java ReentrantLock和synchronized两种锁定机制的对比
    spring 在web容器启动时执行初始化方法
  • 原文地址:https://www.cnblogs.com/yuanming/p/6775341.html
Copyright © 2011-2022 走看看