usb驱动程序的编写采用wdm驱动程序

上传人:cl****1 文档编号:495482784 上传时间:2022-08-22 格式:DOCX 页数:9 大小:30.41KB
返回 下载 相关 举报
usb驱动程序的编写采用wdm驱动程序_第1页
第1页 / 共9页
usb驱动程序的编写采用wdm驱动程序_第2页
第2页 / 共9页
usb驱动程序的编写采用wdm驱动程序_第3页
第3页 / 共9页
usb驱动程序的编写采用wdm驱动程序_第4页
第4页 / 共9页
usb驱动程序的编写采用wdm驱动程序_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《usb驱动程序的编写采用wdm驱动程序》由会员分享,可在线阅读,更多相关《usb驱动程序的编写采用wdm驱动程序(9页珍藏版)》请在金锄头文库上搜索。

1、US网区动程序的编写采用WDM区动程序。WDM区动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP管理器、I/O管理器、电源管理器等)来调用或激活它们。具体驱动程序不同,其所包含的例程也不同。一个WDM动程序的基本组成包括以下5个例程:( 1)驱动程序入口例程:处理驱动程序的初始化。( 2)即插即用例程:处理PnP设备的添加、删除和停止。( 3)分发例程:处理用户应用程序发出的各种I/O请求。( 4)电源管理例程:处理电源管理请求。(5)卸载例程:处理驱动程序的卸载。包含文件:,makefile,sources)在文件中,包含了上述五个例程:中定义了各种数据结构还有各种IOCTL

2、控制码,用于不同数据的读写。中实现了各种驱动例程。包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。驱动程序入口例程:NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,INPUNICODE_STRINGRegistryPath)NTSTATUSntStatus=STATUS_SUCCESS;PDEVICE_OBJECTdeviceObject=NULL;DriverObject-MajorFunctionIRP_MJ_CREATE=Ezusb_Create;DriverObject-MajorFunctionIR

3、P_MJ_CLOSE=Ezusb_Close;ources.Ifyouwanttoaddanewsource#filetothiscomponent.Thisfilemerelyindirectstotherealmakefile#thatissharedbyallthedrivercomponentsoftheWindowsNTDDK#!INCLUDE$(NTMAKEENV)不要编辑这个文件。事实上每个WDME序所需要的makefile的内容都是一样的,只需要简单地copy一个makefile到新的项目中就可以了2、SourcesTARGETNAME=TARGETTYPE=DRIVERDRI

4、VERTYPE=WDMTARGETPATH=libINCLUDES=$(BASEDIR)inc;$(BASEDIR)incddk;TARGETLIBS=$(BASEDIR)lib*SOURCES=这个文件指定了驱动程序目标名是,是一个WDM1动程序,生成的文件存放在lib目录中。值得注意的是,“=”前后不能有空格,否则编译的时候会出错。开始编译:“开始”-“程序”-“DevelopmentKits”-“Windows2000DDK”-“CheckedBuildEnvironment”屏幕将显示:(有“回车”的那行是需要读者你亲自打进去的)NeworupdatedMSVCdetected.Upd

5、atingDDKenvironment。;SettingenvironmentforusingMicrosoftVisualC+tools.StartingdirscreationCompleted.D:NTDDKcdjtag_usb(回车)D:HelloWDMbuild(回车)如果源代码没有错误的话,生成的将存放在lib目录中。安装驱动程序:利用INF文件实现驱动的安装。我们一般是采用INF文件,inf文件如下所示:VersionSignature=$CHICAGO$Class=USBDriverVer=11/11/2007,1.00.00ClassGUID=36FC9E60-C465-11

6、CF-40000provider=%ECICT%SourceDisksNames1=%CYUSB_INSTALL%,SourceDisksFiles=1Manufacturer%MfgName%=ECICTEcict%VID_0547&%=CyUsb,USBVID_0547&PID_1002DestinationDirs=10,System32DriversAddReg=CopyFiles=AddReg=AddReg=Addservice=CyUsb,0x00000002,DisplayName=%ServiceType=1;SERVICE_KERNEL_DRIVSEtRartType=3;S

7、ERVICE_DEMAND_STARETrrorControl=1;SERVICE_ERROR_NORMALServiceBinary=%10%System32DriversLoadOrderGroup=BaseHKR,DevLoader,*ntkernHKR,NTMPDriver,;StringsCYUSB_INSTALL=YourDeviceInstallationDiskECICT=ECICTMfgName=ECICT VID_0547&= USB_Jtag ControlerReplaceGUIDbelowwithcustomGUID07BBF83D-D0B2-4915-870C-FC

8、5B0B049DFC 准备好这个文件后,插入控制器,然后跳出设备驱动安装的对话框。我想从列表选择硬件”-“其它设备”-“从磁盘安装”,选择所在的路径,然后安装。当安装完成后,系统就会添加上你写好的驱动程序了。(可以在“设备管理器”中查看到),这个驱动程序就投入使用。驱动程序与应用程序的接口对用户来说,所用的应用程序都通过I/O控制来访问设备驱动程序。用户的应用程序首先通过调用Win32函数CreateFile()来取得访问设备驱动的句柄。然后,用户程序使用Win32函数DeviceIoControl()来提交I/O控制码,并为CreateFile函数返回的设备句柄设置I/O缓冲区。下

9、面的例程验证所获取的EZ-USBS备的句柄:HANDLEDeviceHandle;DeviceHandle=CreateFile(“.ezusb-0”,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);随后,用户的应用程序通过调用Win32函数DeviceIoControl()来向设备驱动程序发送请求。下面显示的是DeviceIoControl()函数的原型。EZ-US暇备驱动程序IOCTL使用相同的函数参数名。BOOLDeviceIoControl()HANDLEhDevice,/外设句柄DWORDdwIoControlCod

10、e,/I/O操作控制代码LPVOIDlpInBuffer,/输入缓冲区指针DWORDnInBufferSize,/输入缓冲区大小LPVOIDlpOutBufferSize,/输出缓冲区指针DWORDnOutBufferSize,/输出缓冲区大小LPDWORDlpBytesReturned,/实际返回的字节数LPOVRLAPPERlpOverLapper/用于异步操作的重叠指针其中I/O操作控制代码是在USB设备驱动程序中定义和实施实际数据操作的,如在驱动程序中定义的:IOCTL_EZUSB_GET_DEVICE_DESCRIPTOR,IOCTL_EZUSB_BULK_READ,IOCTL_EZ

11、USB_BULK_WRTE代码。例如:(1)通过红色标注的ioctl控制码写入一个地址值。/*VENDOR_OR_CLASS_REQUEST_CONTROLmyReqfeS施仪的数据结构ULONGnBytes;WORDpvBuffer1;/tempfordataandaddresspvBuffer0=Addr;/地址/写地址=0x00;/0-HOSTT0DEVICE,1-DEVICETOHOST=2;/1-class,2-vendor=0;/0-device,1-interface,2-endpoint,3-other=0xb4;=0x00;/在这里不起作用=0x00;DeviceIoCont

12、rol(hDevice,IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST,/他制码&myRequest,sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL),pvBuffer,2,&nBytes,NULL);*/2)大块数据的写/*BULK_TRANSFER_CONTROLbulkControl;/pipetypeselectedPWORDpData=0;/通道0用于写,通道1用于读。pData=(PWORD)malloc(lenth*2);DeviceIoControl(hDevice,IOCTL_EZUSB_BULK_WRITE,数据块的写I

13、OCTL码&bulkControl,sizeof(BULK_TRANSFER_CONTROL),pData,length*2,&nBytes,NULL);*/(2)大块数据的读/*BULK_TRANSFER_CONTROLbulkControl;/pipetypeselectedPWORDpData=1;/通道0用于写,通道1用于读。pData=(PWORD)malloc(lenth*2);DeviceIoControl(hDevice,IOCTL_EZUSB_BULK_READ,微据块的读IOCTL码&bulkControl,sizeof(BULK_TRANSFER_CONTROL),pData,length*2,&nBytes,NULL);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号