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