
应用实例
在本嵌人式系统中,硬件选用了Philips公司生产的USB2.0高速接口器件ISP1581,实现主机与嵌人式系统间的USB数据传输。
为了适应各种USB外设的需要,USB提供了四种不同的传输类型。这里,为满足嵌入式系统与主机间大量、可靠的数据交换要求,数据传输选用批量传输方式。
USB功能驱动程序的构成及实现
本功能驱动程序主要由四个模块组成:初始化模块、I/O模块、即插即用管理模块和电源管理模块。另外,还有一个.INF文件用于驱动程序的安装。
初始化模块
在初始化模块中,包括有每一个设备驱动程序都有的一个初始化入口点:DriverEntry例程,每次设备驱动程序启动时该例程被系统自动调用,其最重要的功能是设置驱动程序对应于I/O请求的主功能代码(MajorFunction)的回调例程。DriverEntry例程如下所示:
DriverEntry(IN PDRIVER_OBJECT DriverObject, …)
//驱动程序人口
{
DriverObject->DriverExtension->AddDevice=AddDevice;
DriverObject->DriverUnload=DriverUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE]=Create;
DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close;
DriverObject->MajorFunction[IRP_MJ_READ]=Read;
DriverObject->MajorFunction[IRP_MJ_WRITE]= Write;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=IoControl;
DriverObject->MajorFunction[IRP_MJ_PNP]=Pnp;
DriverObject->MajorFunction[IRP_MJ_POWER]=ProcessPowerIrp;
}
初始化模块中还包括有Create和Close两个例程,这是Win32程序获得和释放设备句柄的唯一途径;AddDevice例程在系统添加一个设备时被PnP管理器调用,其主要工作是创建并初始化设备对象;DriverUnload例程在系统卸载硬件时使用,由I/O管理器调用,释放所有资源。
I/O模块
I/O模块由读写例程Read、Write和设备控制例程IoControl构成。
*读写例程
读写两个例程用于实现批量数据传输。通过设置urb->UrbBulkOrInterruptTransfer. TransferFlags标志位可以决定数据流向,因此将它们放在同一个例程中。读 写例程主要处理流程如下:
(1)调用IoGetCurrentIrpStackLocation(),获得指向自身I/O堆栈单元的指针;
(2)使用构造宏UsbBuildInterruptOrBulkTransferRequest(),构造一个URB_BULK_OR_INTERRUPT_TRANSFERURB类型的URB结构;
(3)调用IoGetNextlrp StackLocation()获得下一层驱动程序的I/O堆栈单元位置,并传递构造好的URB;
(4)调用IoSetCompletionRoutine(),将一个I/O完成例程与IRP关联;
(5)调用IoCallDriver() ,将请求传递给下层驱动程序处理。
*IoControl例程
用户程序使用DeviceIoControl函数传递一个称为I/O控制代码(IOCTL)的32位长度的参数,I/O管理器将IOCTL放在IRP的 Parameters.DeviceIoControl.IoControlCode域中,在功能驱动程序中由IoControl例程使用该参数确定应执行的功能。
IOCTL值由CTL_CODE宏生成,CTL_CODE宏有四个宏参数。在本驱动程序中定义了两个IOCTL,分别用于复位管道和向USB固件发送一次批量传输字节数。IoControl例程对这两个IOCTL的处理流程与上面的读写例程类似,这里就不再赘述。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10294527/viewspace-126747/ ,如需转载,请注明出处,否则将追究法律责任。