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 执行