USB设备驱动程序设计
在使用DriverWizard生成驱动程序框架、模块及部分程序源代码后,开发者只需完成图2中三个控制代码所对应的三个功能模块的编程:模块USBDIO_IOCTL_ ID_CODE_Handler的功能是从控制端点0读取数据,模块USBDIO_IOCTL_ TEST_COMMAND_Handler的功能是向控制端点0发送一个控制命令,模块USBDIO_IOCTL_DMA_COMMAND _Handler的功能是向控制端点0发送一个要求USB设备进行DMA传输的控制命令,下面是第一个模块的编程实例。
NTSTATUS USBDIODevice::USBDIO
_IOCTL_ID_CODE_Handler(KIrp I)
{
NTSTATUS status =STATUS_
SUCCESS;
t << "Entering USBDIODevice
::USBDIO _IOCTL_ID_ CODE_
Handler, " << I << EOL;
PURB pUrb;
ULONG numData;
numData=*(PUCHAR)I.IoctlBuffer();
//设置读取的数据个数
pUrb=m_Lower.BuildVendorRequest(
(PUCHAR)I.IoctlBuffer(),//驱动程
序存放读取的数据的内存区
numData,//wLength,读取的数据个数
0,
0x0c,//bRequest 0,//wValue
TRUE,//input
TRUE,
NULL,
0x0472,//wIndex,传输到固件程序
的读数命令码
URB_FUNCTION_VENDOR_ENDPOINT,
NULL
);
if(pUrb==NULL)
{
I.Information() =0;
status=STATUS_INSUFFICIENT_
RESOURCES;
}
else
{
I.Information() =numData;
tatus=m_Lower.SubmitUrb(pUrb,NULL,
NULL,0);
delete pUrb;
}
return status;
}
对象I包含了应用程序下传的IRP内容,包括命令或数据等参数,函数BuildVendorRequest用来分配并初始化一个用于厂商请求的URB(USB Request Block),该URB将作为下传IRP的一个参数,通过函数SubmitUrb发送给总线驱动程序,以便完成与硬件的通信。
评论