接口驱动程序开发(上)
linux驱动开发(一)

linux驱动开发(⼀)1:驱动开发环境要进⾏linux驱动开发我们⾸先要有linux内核的源码树,并且这个linux内核的源码树要和开发板中的内核源码树要⼀直;⽐如说我们开发板中⽤的是linux kernel内核版本为2.6.35.7,在我们ubuntu虚拟机上必须要有同样版本的源码树,我们再编译好驱动的的时候,使⽤modinfo XXX命令会打印出⼀个版本号,这个版本号是与使⽤的源码树版本有关,如果开发板中源码树中版本与modinfo的版本信息不⼀致使⽆法安装驱动的;我们开发板必须设置好nfs挂载;这些在根⽂件系统⼀章有详细的介绍;2:开发驱动常⽤的⼏个命令lsmod :list moduel 把我们机器上所有的驱动打印出来,insmod:安装驱动rmmod:删除驱动modinfo:打印驱动信息3:写linux驱动⽂件和裸机程序有很⼤的不同,虽然都是操作硬件设备,但是由于写裸机程序的时候是我们直接写代码操作硬件设备,这只有⼀个层次;⽽我们写驱动程序⾸先要让linux内核通过⼀定的接⼝对接,并且要在linux内核注册,应⽤程序还要通过内核跟应⽤程序的接⼝相关api来对接;4:驱动的编译模式是固定的,以后编译驱动的就是就按照这个模式来套即可,下⾯我们来分下⼀下驱动的编译规则:#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build# 开发板的linux内核的源码树⽬录KERN_DIR = /root/driver/kernelobj-m += module_test.oall:make -C $(KERN_DIR) M=`pwd` modulescp:cp *.ko /root/porting_x210/rootfs/rootfs/driver_test.PHONY: cleanclean:make -C $(KERN_DIR) M=`pwd` modules cleanmake -C $(KERN_DIR) M=`PWD` modules这句话代码的作⽤就是到 KERN_DIR这个⽂件夹中 make modules把当前⽬录赋值给M,M作为参数传到主⽬录的Makefile中,实际上是主⽬录的makefile中有⽬标modules,下⾯有⼀定的规则来编译驱动;#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build我们在ubuntu中编译内核的时候⽤这两句代码,因为在ubuntu中为我们保留了⼀份linux内核的源码树,我们编译的时候直接调⽤那个源码树的主Makefile以及⼀些头⽂件、内核函数等;了解规则以后,我们设置好KERN_DIR、obj-m这两个变量以后直接make就可以了;经过编译会得到下⾯⼀些⽂件:下⾯我们可以使⽤lsmod命令来看⼀下我们ubuntu机器现有的⼀些驱动可以看到有很多的驱动,下⾯我们使⽤insmod XXX命令来安装驱动,在使⽤lsmod命令看⼀下实验现象可以看到我们刚才安装的驱动放在了第⼀个位置;使⽤modinfo来打印⼀下驱动信息modinfo xxx.ko这⾥注意vermagic 这个的1.8.0-41是你⽤的linux内核源码树的版本号,只有这个编译的版本号与运⾏的linux内核版本⼀致的时候,驱动程序才会被安装注意license:GPL linux内核开元项⽬的许可证⼀般都是GPL这⾥尽量设置为GPL,否则有些情况下会出现错误;下⾯使⽤rmmod xxx删除驱动;-------------------------------------------------------------------------------------5:下⾯我们分析⼀下驱动。
实验五WinCE中的驱动程序开发

WinCE中的驱动程序开发一.实验目的1、熟悉WinCE中流式接口驱动程序的12个接口的功能。
2、掌握流式驱动程序的工作过程。
3、能够编写出流式接口的驱动程序。
二.实验内容使用VS2005的智能设备应用程序开发方法,进行网络通信的编程,并通信多线程技术实现服务器与客户端之间的文件传输。
三.实验设备及工具硬件:PC机一台;软件:Windows XP操作系统,VS2005开发环境,WinCE 6.0开发环境,或Windows Mobile 5.0 SDK四.实验步骤及说明(1)写出流式接口驱动程序的12个接口,及每个接口的功能。
答:见教材515页(2)写出流式驱动程序的工作过程。
答:第一步:加载驱动程序,主要有两种加载方式:(1)当系统启动时,设备管理器搜寻注册表的HKEY_LOCAL_MACHINE\Drivers\BuiltIn键下面的子键,并逐一加载该子键下的每一个驱动,此过程称为BusEnum;(2)应用程序可调用ActivateDeviceEx()函数动态地加载驱动程序。
第二步:设备管理器从注册表的dll键值中获取驱动程序所在的DLL文件名。
第三步:设备管理器调用LoadDriver()函数把该DLL加载到自己的虚拟地址空间中。
第四步:设备管理器在注册表的HKEY_LOCAL_MACHINE\Drivers\Active下,记录所有已经加载的驱动程序。
第五步:设备管理器调用驱动程序中的COM_Init函数,并把上一步中添加的注册表项的完整路径作为COM_Init函数的第1个参数传入驱动程序内。
第六步:在COM_Init中,通常须对硬件进行一些最基本的初始化操作。
通过以上的操作完成流式驱动程序的加载任务。
对驱动程序的操作:第一步:应用程序使用该设备。
首先,应用程序调用CreateFile(TEXT(“COM1”)….)打开设备。
然后,文件系统判断打开的是文件还是设备。
最后,如果打开的是设备,就将控制权交回设备管理器。
Windows 驱动程序开发指导说明书

课程内容驱动基本概念介绍驱动核心代码分析WDM和WDF介绍Windows 10通用驱动平台驱动程序是一个软件模块,可以使操作系统和硬件设备进行交互驱动程序是操作系统的一个扩展驱动程序一般是由硬件的设计者或厂商进行编写Microsoft已经为符合公共设计规范的硬件设备提供了内置的驱动程序可执行文件,扩展名是.exe入口函数是Main()Main()函数完成大部分工作应用程序完成工作后返回,并释放内存空间在用户态运行可执行文件,扩展名是.sys入口函数是DriverEntry()DriverEntry()不会做很多工作,只是初始化驱动驱动其他部分会注册很多回调函数,会被系统的不同模块调用驱动不会返回,会一直存在直至被显示的释放在内核态或用户态运行Driver StacksPDO位于驱动栈的最底层,和总线驱动相关联当总线驱动被加载时,它会枚举所有挂载在总线上面的设备并请求设备所需要的资源每个设备都有自己对应的PDOPnP管理器会确定每个设备的驱动并在设备的PDO 之上构建适当的设备栈设备栈的核心部分,FDO和设备功能驱动相关联设备功能驱动完成Windows和设备交互的核心功能对上向应用程序和服务提供上层接口对下为设备或其他驱动提供数据交换的接口一个设备栈可以包含多个FiDO,可以在FDO之上或之下每个FiDO和一个过滤驱动相关联,FiDO是可选的通常的目的是修改一些在设备栈中传输的I/O请求,例如可以加密和解密读写请求当一个新设备被插入到系统后,系统总线驱动会向PnP管理器报告这个新设备PnP管理器通过总线驱动查询这个设备的更多信息,比如设备ID和设备所需要的资源PnP管理器利用这个信息去查找是否有有对应的驱动在本地或WU(Windows Update)上面一旦查找到设备对应的驱动,Windows便会安装并加载这个驱动加载驱动到地址空间解析驱动中引入的函数-调用其他模块调用驱动的入口函数(DriverEntry()),因此驱动可以注册回调函数调用AddDevice(),驱动此时可以创建一个“设备对象”,并将这个对象加入到设备栈中所有的事物在驱动框架中都是用对象呈现的(驱动,设备,请求等等)对象拥有属性,方法和事件WDF 对象方法属性事件操作对象的函数被WDF 框架调用用于通知某些事件设置或获取单个属性值的方法Driver (WDFDRIVER)Device (WDFDEVICE)Device (WDFDEVICE)Queue (WDFQUEUE)Queue (WDFQUEUE)……ObjectOperation方法:Status = Wdf Device Create ();属性:Cannot failWdfInterrupt Get Device();WdfInterrupt Set Policy();Can fail:Status = WdfRegistry Assign Value();Status = WdfRegistry Query Value();Status = WdfRequest Retrieve InputBuffer();回调事件:PFN_WDF_INTERRUPT_ENABLE EvtInterruptEnable初始化宏:WDF_XXX_CONFIG_INITWDF_XXX_EVENT_CALLBACKS_INIT当驱动被加载时,DriverEntry是第一个被操作系统调用的函数WdfDriverCreate( RawDriverObject, […] , attributes, &driver )NTSTATUS DriverEntry(_In_PDRIVER_OBJECT DriverObject ,_In_PUNICODE_STRING RegistryPath ) {[…]// Create WDF Driver ObjectWDF_OBJECT_ATTRIBUTES_INIT(&attributes);attributes.EvtDriverUnload = OnDriverUnload;WDF_DRIVER_CONFIG_INIT(&config, OnDeviceAdd);status = WdfDriverCreate(DriverObject ,RegistryPath ,&attributes,&config,&driver );}WDF EventWDF MethodWDF ObjectDeclare vars这是一个过滤驱动程序吗?驱动程序是电源管理策略的所有者吗?为设备对象创建I/O队列创建辅助对象,例如计时器,工作者对象,锁等NTSTATUS OnDeviceAdd( WDFDRIVER Driver,PWDFDEVICE_INIT DeviceInit) {WDFDEVICE device;IWDFIoQueue* pDefaultQueue= NULL;DeviceInit->SetPowerPolicyOwnership(TRUE );status= WdfDeviceCreate(&DeviceInit,&deviceAttributes, &device);context = GetContext(device);context->WdfDevice= device;status = pIWDFDevice->CreateIoQueue(NULL, TRUE, WdfIoQueueDispatchParallel,TRUE, FALSE, &pDefaultQueue);return status;}Static Configuration Device CreateSetting ContextQueue Create进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)NTSTATUS OnPrepareHardware(WDFDEVICE Device ,WDFCMRESLIST ResourcesRaw ,WDFCMRESLIST ResourcesTranslated ) {int ResourceCount = WdfCmResourceListGetCount(ResourcesTranslated );for (i=0; i < ResourceCount; i++) {descriptor =WdfCmResourceListGetDescriptor(ResourcesTranslated , i);switch (descriptor->Type) {case CmResourceTypePort : […]case CmResourceTypeMemory : […]case CmResourceTypeInterrupt : […]default : break ;}}return STATUS_SUCCESS ;}进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)NTSTATUS OnD0Entry(IN WDFDEVICE Device ,IN WDF_POWER_DEVICE_STATE RecentPowerState ){PADXL345AccDevice pAccDevice = nullptr pAccDevice = GetContext(Device);WdfWaitLockAcquire(pAccDevice->m_WaitLock);I2CSensorWriteRegister(pAccDevice->m_I2CIoTarget, MY_REGISTER,MY_VALUE, sizeof (MY_VALUE) );pAccDevice->m_PoweredOn = true ;WdfWaitLockRelease(pAccDevice->m_WaitLock);return STATUS_SUCCESS ;}进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)NTSTATUS OnInterruptEnable(IN WDFINTERRUPT Interrupt,IN WDFDEVICE Device){PDEVICE_EXTENSION devExt;ULONG regUlong;PULONG intCsr;devContext = GetDeviceContext(WdfInterruptGetDevice(Interrupt) );intRegId = &devContext->IntRegisterId regVal = READ_REGISTER_ULONG( intRegId );regVal = ENABLE_INTERRUPT_BYTE( regVal );WRITE_REGISTER_ULONG( intRegId, regVal );return STATUS_SUCCESS;}进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)EvtIoResume EvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildren EvtDeviceRemoveAddedResourcesStart power-managed queuesEvtIoResume Disarm wake signal, if it was armed. (called onlyduring power up; not called during resource rebalance)EvtDeviceDisarmWakeFromSx EvtDeviceDisarmWakeFromS0Request information about child devicesEvtChildListScanForChildren Enable DMA, if driver supports it EvtDmaEnablerSelfManagedIoStartEvtDmaEnablerEnableEvtDmaEnablerFillConnect interruptsEvtDeviceD0EntryPostInterruptsEnabledEvtInterruptEnable Notify Driver of state change EvtDeviceD0EntryDevice OperationalRestart from here if device is in low power statePrepare hardware for power EvtDevicePrepareHardwareChange resources requirements EvtDeviceRemoveAddedResourcesEvtDeviceFilterAddResourceRequirementsEvtDeviceFilterRemoveResourcRequirementsRestart from here if rebalancing resourcesCreate Device object EvtDriverDeviceAddDevice arrivedEnable self-managed I/O, if driver supports it.EvtDeviceSelfManagedIoInit (implicit power up),EvtDeviceSelfManagedIoRestart (explicit power up)Stop power-managed queuesEvtIoStop Arm wake signal, if it was not armed. (calledonly during power up; not called duringresource rebalance)EvtDeviceArmWakeFromSx EvtDeviceArmWakeFromS0Disable DMA, if driver supports it EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerDisableEvtDmaEnablerFlushDisconnect interrupts EvtDeviceD0EntryPostInterruptsDisabledEvtInterruptDisableNotify Driver of state changeEvtDeviceD0Exit Device OperationalStop here if transitioning to low power stateRelease hardware EvtDeviceReleaseHardwarePurge power-managed queuesEvtIoStop Stop here if rebalancing resourcesFlush I/O if driver supports self-managedI/OEvtDeviceSelfManagedIoFlush Device removedSuspend self-managed I/O, if driver supports it.EvtDeviceSelfManagedIoSuspend Cleanup I/O buffers if driver supports self-managed i/o EvtDeviceSelfManagedIoCleanupDelete device object s context area.EvtDeviceContextCleanupEvtDeviceContextDestroyWDM和操作系统深度耦合,WDM驱动程序直接调用系统服务例程,直接操作系统数据结构WDM驱动程序全部为内核态程序,操作系统对驱动输入只做有限的检查WDF框架处理与操作系统的交互,驱动本身专注于和设备交互WDF基于对象模型和事件驱动WDF支持内核态程序和用户态程序将操作系统底层的复杂逻辑抽象化使驱动代码有可能<20行对不同的硬件设备使用相同的编程模型例如GPIO,UART,I2C,NFC,传感器驱动框架内置的日志系统为数据分析定制的工具支持上千种不同的硬件设备最初UMDF V1基于C++ COMUMDF V2使用和内核态驱动开发相同的模型和语法支持USB周边设备,传感器,NFC,智能卡,HID(包括触控)等等驱动崩溃只会影响宿主进程,不会影响整个操作系统系统重启策略可以自动恢复崩溃的UMDF驱动Windows 10提供了一系列API和DDI,对于所有的Windows平台都是通用的,被称为Universal Windows Platform(UWP) Windows通用驱动是指一个内核态或用户态的驱动并能运行在所有基于UWP的系统上面Windows通用驱动只能调用属于UWP部分的DDI,这部分DDI会在MSDN文档中标记为Universal确定你的驱动是否支持UWP,把你的驱动标记为通用驱动然后重新编译在Visual Studio中打开驱动项目工程在配置选项中把操作系统选择为Windows 10在工程属性中把目标平台改为“通用”,其他选项还有“桌面”和“手机”重新编译驱动,这时可以会出现一些链接器错误尝试修复这些错误,对于出现错误的API,请参考文档是否有通用平台的API可以替代,如果没有,您可能需要重新设计你的驱动KMDF version Release method Included in this versionof Windows Drivers using it run on1.19Windows 10, version1607 WDK Windows 10, version1607Windows 10 version1607 and later,Windows Server 20161.17Windows 10, version1511 WDK Windows 10, version1511Windows 10 version1511 and later,Windows 10 Mobile,Windows 10 IoT Core,Windows Server 20161.15Windows 10 WDK Windows 10Windows 10 for desktop editions, Windows 10 Mobile, IoT Core, Windows Server 2016UMDF version Release method Included in this version ofWindows Drivers using it can run on2.19Windows 10, version 1607WDK Windows 10, version 1607Windows 10, version 1607 (all SKUs), Windows Server 20162.17Windows 10, version 1511WDK Windows 10, version 1511Windows 10 for desktop editions (Home, Pro, Enterprise, and Education), Windows 10 Mobile, Windows 10 IoT Core (IoT Core), Windows Server 20162.15Windows 10 WDK Windows 10Windows 10 for desktop editions, Windows 10 Mobile, IoT Core, Windows Server 2016驱动程序运行在哪个版本的操作系统上驱动程序支持的硬件类型驱动程序使用的驱动模型确定驱动程序是否使用了只有KMDF支持的功能,如果驱动程序没有使用KMDF的功能,并且驱动运行在Windows 8.1或以后的系统上,则可以迁移到UMDF 2https:///en-us/windows/hardware/drivers/wdf/wdf-porting-guide Which Drivers Can Be Ported and WhereDifferences Between WDM and WDFPreparing for PortingSteps in PortingSummary of KMDF and WDM Equivalents。
驱动开发面试题目及答案

驱动开发面试题目及答案1. 什么是驱动开发(Driver Development)?驱动开发是指为操作系统提供硬件设备的控制程序。
驱动程序与硬件设备之间通过操作系统的驱动模块进行交互,实现设备的初始化、数据传输、中断处理和错误处理等功能。
2. 驱动开发的基本要求有哪些?- 具备良好的编程基础和扎实的操作系统原理知识- 熟悉硬件电路和设备的工作原理- 熟悉特定硬件设备的相关规范和协议- 具备调试和故障排除的能力- 具备团队合作和沟通能力3. 驱动开发的流程包括哪些步骤?- 需求分析和规划:确定需要开发的驱动类型、支持的硬件设备和操作系统版本,制定开发进度和计划。
- 硬件适配和端口配置:了解硬件设备的接口特征和相关寄存器,编写初始化代码和配置驱动程序与设备的通信接口。
- 设备驱动程序编写:根据硬件设备的规范和操作系统的驱动接口,编写设备驱动程序,包括设备初始化、数据传输、中断处理等。
- 调试和测试:通过调试工具和测试用例验证驱动程序的正确性和性能,修复错误和优化程序。
- 集成和发布:将开发好的驱动程序集成到操作系统中,并进行安装和发布,确保程序能够正常运行。
4. 驱动开发中常见的编程语言有哪些?- C语言:大部分驱动程序都是使用C语言编写的,因为其具有良好的效率和可移植性。
- 汇编语言:部分特定的硬件设备驱动程序可能需要使用汇编语言编写,以直接操作硬件寄存器和指令。
- C++语言:在一些需要更高级别的抽象和封装的场景下,可以选择使用C++语言开发驱动程序。
5. 驱动开发中涉及的常用接口和框架有哪些?- Windows驱动程序框架(WDF):用于开发驱动程序的框架,提供了一系列的函数和模型,简化了驱动程序的开发和维护。
- Linux设备模型(Device Model):用于将设备抽象为设备树的形式,并提供一组API进行设备驱动程序的开发。
- Android驱动开发框架:用于在Android操作系统上开发设备驱动程序的框架,提供了一系列Java和C/C++函数库。
基于FPGA的IEEE488接口协议实现及驱动程序开发

!计算机测量与控制!"#""!$#!%"!!"#$%&'()'*+%('#',&-!",&(".!#&$(!#收稿日期 "#""#"&%$!修回日期"#""#$"&%作者简介 刘!阳!&**'"&男&湖北十堰人&硕士研究生&主要从事嵌入式开发*自动控制等方向的研究%通讯作者 罗显志!&*,'"&男&湖北十堰人&博士&研究员&硕士生导师&主要从事软件无线电*实时高速信号处理*北斗卫星导航系统等方向的研究%引用格式 刘!阳&罗显志&周杨罗&等!基于Z 9b :的/>>>(%%接口协议实现及驱动程序开发'+(!计算机测量与控制&"#""&$#!%")&$(&(&!文章编号 &',&()*% "#"" #%#&$(#%!!-./ &#!&')"' 0!1234!&&5(,'" 67!"#""!#%!#""!!中图分类号 89",$文献标识码 :基于N 2Q =的S <<<M ]]接口协议实现及驱动程序开发刘!阳 罗显志 周杨罗 李!政!湖北大学计算机与信息工程学院&武汉!($##'""摘要 />>>(%%作为一种通用的并行总线&凭借其低延时*可靠传输等优势&广泛应用于仪器控制与测试系统中$针对目前符合/>>>(%%接口协议的专用b 9/Q 芯片如^:8**&(*B 9-,"&#*=F '%(%%等都已停产&且在售b 9/Q 控制器产品类型少且价格十分昂贵&难以满足国内市场需求的现象&采用了一种基于Z 9b :技术来实现/>>>(%%接口协议的方案&以典型的b 9/Q 接口芯片^:8**&(为蓝本&使用N E R 4O K P 语言描述b 9/Q 接口功能&调用N /<:虚拟仪器函数库开发驱动程序与设备通信&组建完整的自动测试系统&并通过<F 9/指令对仪器进行程控*数据采集等操作$该方案有效地解决了专用b 9/Q 芯片停产的问题&同时开发成本低$经实验测试实现了/>>>(%%接口协议功能&产品性能稳定&各项功能满足测试系统中的测控需求&具有一定的工程实用价值%关键词 />>>(%%$b 9/Q $^:8**&($N /<:$<F 9/$自动测试系统S #$.'#',&*&6","3S <<<M ]]S ,&'(3*0'2("&"0".*,:G (6U '(G 'U '."$#',&K *+':",N 2Q =M /C `A 2P &M C .@4A 2[G 4&c V .C `A 2P O B K &M /c G E 2P!<1G K K O K LF K I 7B 6E R A 2H /2L K R I A 64K 2>2P 42E E R 42P &V B X E 4C 24W E R S 46J&D B G A 2!($##'"&F G 42A "=>+&(*0&):S A P E 2E R A O 7A R A O O E O X B S &/>>>(%%4S\4H E O J B S E H 4242S 6R B I E 261K 26R K O A 2H 6E S 6S J S 6E I S\46G 46S A H W A 26A P E S K L O K \H E 5O A J A 2H R E O 4A X O E 6R A 2S I 4S S 4K 2!:67R E S E 26&6G E S 7E 14A Ob 9/Q1G 47S 1K 2L K R I 42P 6K 6G E />>>(%%426E R L A 1E 7R K 6K 1K O &S B 1GA S^:8**&(&B 9-,"&#A 2H =F '%(%%&G A W E X E E 2H 4S 1K 2642B E H &A 2H 6G E 7R K H B 16S K Lb 9/Q1K 26R K O O E R K 2S A O E G A W E L E \6J 7E S A 2H A R E W E R J E Y 7E 2S 4W E &\G 41G 4S H 4L L 41B O 66KI E E 66G E 2E E H S K L 6G E H K I E S 641I A R 3E 6&A S 1G E I E X A S E H K 2Z 9b :6E 1G 2K O K P J 4S A H K 76E H 6K R E A O 4[E 6G E />>>(%%4256E R L A 1E 7R K 6K 1K O &X A S E HK 26G E 6J 741A Ob 9/Q426E R L A 1E 1G 47^:8**&(&6G Eb 9/Q426E R L A 1E L B 2164K 24SH E S 1R 4X E H 42N E R 4O K P O A 2P B A P E &6G E W 4S AW 4R 6B A O 42S 6R B I E 26L B 2164K 2O 4X R A R J 4S 1A O O E H 6KH E W E O K 76G EH R 4W E R 6K1K I I B 241A 6E\46G6G EE T B 47I E 26&A1K I 7O E 6EA B 6K I A 6416E S 6S J S 6E I4S E S 6A X O 4S G E H &A 2H 6G E 42S 6R B I E 264S 7R K P R A I I E H A 2H 6G E H A 6A 4S 1K O O E 16E H 6G R K B P G 6G E <F 9/42S 6R B 164K 2S !8G E S 1G E I E E L 5L E 164W E O J S K O W E S 6G E S G B 6H K \27R K X O E IK L S 7E 14A Ob 9/Q1G 47&I E A 2\G 4O E 6G E H E W E O K 7I E 261K S 64S O K \!8G R K B P G 6G E E Y 7E R 4I E 26A O 6E S 6&6G E />>>(%%426E R L A 1E 7R K 6K 1K O L B 2164K 24S R E A O 4[E H &6G E 7R K H B 167E R L K R I A 21E 4S S 6A X O E &A 2HA O O L B 2164K 2SI E E 66G EI E A S B R E I E 26A 2H 1K 26R K O R E T B 4R E I E 26S 426G E 6E S 6S JS 6E I &\G 41GG A S 1E R 6A 42E 2P 42E E R 42P7R A 1641A O W A O B E !'@A "(:+)/>>>(%%$b 9/Q $^:8**&($N /<:$<F 9/$AB 6K I A 6416E S 6S J S 6E I B !引言在自动测试系统中&/>>>(%%总线扮演着重要的角色%它是一种面向仪器设备的通用总线接口&也被称为b 9/Q 总线'&"(%该接口最早由V 9公司提出&经过几十年的发展&已经形成了一套行业标准%且该接口能满足设备之间互相通信的功能&实现信息共享的需求%近年来&国内在自动化控制*精密仪器研制等领域发展迅猛&在医疗*军工等领域&对测试系统的需求越来也越大%b 9/Q 作为业界使用最广泛的测试总线&不仅成本低&而且传输稳定&在未来的一段时间内&国内市场仍然有一定的需求量%市面上的b 9/Q 转换器基本都采用专用接口芯片来设计&此类芯片连接微处理器&通过读写寄存器等操作能很方便的实现b 9/Q 接口的所有功能%目前&能自主生产基于/>>>5(%%协议的专用b 9/Q 接口芯片的公司仅^/*8/*^>F */26E O 几家'$(&但该类芯片都已停产&可供购买的成品b 9/Q 转换器如^/5b 9/Q 5C <Q 5V <价格在$###元以上&对国内庞大的用户群体来说成本过高%国内在测试接!投稿网址 \\\!0S 01O J3[!1K I Copyright ©博看网. All Rights Reserved.第%期刘!阳&等)基于Z 9b :的/>>>(%%""""""""""""""""""""""""""""""""""""""""""""""""""""接口协议实现及驱动程序开发#&$)!#口领域的研究较少&仅有电子科大等几个团队&且市面上国产转换器占有率不高%随着:</F 技术的飞速发展&Z 95b :在嵌入式领域得到了广泛应用&它灵活*稳定*可移植性强&所以能够用来替代一些专用芯片%基于以上因素&本文详细阐述使用Z 9b :芯片来实现/>>>(%%总线协议的方案及实现流程&为相关开发人员提供可行性参考%C !总体设计基于Z 9b :的/>>>(%%协议转换器的设计主要包括硬件和软件两部分%硬件部分包括硬件电路设计与硬件控制程序设计$软件部分主要是驱动程序开发&最后通过用户程序与仪器通信%该方案组建一套完整的测试系统&其总体结构'((如图&所示%图&!总体结构框架该方案的核心在于硬件控制程序设计&开发前需要对/>>>(%%总线协议做深入研究&同时剖析^/的^:8**&(的内部结构&掌握其协议的工作原理%硬件控制程序的主要内容是模拟b 9/Q 接口的十种功能&然后通过读写控制模块控制数据准确无误的传输&在9F 与仪器之间搭建数据传输的桥梁%软件驱动程序连接9F 与转换器&实时发送程控指令并接收返回的数据%E !硬件电路设计硬件电路设计主要包括电源模块*C <Q 5C :U 8模块*Z 9b :主控模块及外围电路*b 9/Q 接口模块%硬件设计框架如图"所示%图"!硬件设计框架E D C !电源模块电源模块为整个系统提供稳定电压%电源芯片使用=F $(#'$&该芯片性能好&市场应用广泛&可实现升压和降压功能&但其实现电路不同%本系统采用C <Q 接口供电&其电压大致为);"N 左右&所以需设计降压电路%Z 95b :芯片的不同Q:^a 所需电压不同&因此添加M =&#%(可调输出线性稳压器&提供$;$N *";)N *&;"N 工作电压%电源电路部分设计如图$所示%图$!电源模块该芯片内部有恒定的&;")N 基准电压&输出电压与U $)和U $'的阻值有关&其输出电压的计算公式为)U K B 6#&^")$!&%3$'-3$)"!&"!!由公式!&"推出&为输出)N 电压&U $'和U $'的阻值分别为&#a 和$a $%E D E !YL K J Y =/O 模块C <Q 5C :U 8模块建立9F 端与主控芯片的数据通道%协议转换芯片采用F V $(#b 5C <Q 转串口芯片&该芯片外围电路简单&性能稳定&资料丰富%电路中将3.与8.引脚接入Z 9b :芯片进行数据交换&-f 与-]接入C <Q 接口数据引脚与9F 端进行数据交换%该芯片工作时需外接&"=晶振&同时为保证系统时钟的同步&引出时钟输入引脚与Z 9b :芯片相连%C <Q 5C :U 8模块如图(所示%图(!C <Q 5C :U 8模块E DF !N2Q =主控模块及Q 2S K 接口模块Z 9b :主控芯片的选择参考市场两大主流Z 9b :芯片厂商&再结合本项目的设计要求&最终采用@4O 42Y 的<7A R 56A 25'系列的@F '<M @(芯片&该芯片的引脚数和容量能满足设计需求&且网络资源充足&易上手%!投稿网址 \\\!0S 01O J3[!1K I Copyright ©博看网. All Rights Reserved.!!计算机测量与控制!第$#""""""""""""""""""""""""""""""""""""""""""""""""""""卷#&$'!#主控芯片的差分引脚主要与b 9/Q 接口的&'根信号线和C :U 8模块的数据线连接&以实现接口的控制和数据传输%外围电路还包括+8:b 下载电路*<-U :=外部存储模块以及时钟和复位电路%+8:b 下载调试电路使用@F Z #&<N ."#F 5Z 9b :配置芯片&系统外部时钟采用)#=晶振%此外&使用a (<)&&'$"Q 58F ,)存储芯片设计<-U :=外部存储模块&防止因Z 9b :芯片内部缓存不足造成数据丢失的现象%主控模块还外接了M >-小灯等外围电路&用来作为数据读写的指示灯%传统的b 9/Q 接口电路模块一般由专用b 9/Q 接口芯片和总线收发器组成%本方案使用Z 9b :芯片模拟b 9/Q 接口功能&因此无需b 9/Q 接口芯片和总线收发器%但b 9/Q 接口工作电压是)N &而Z 9b :芯片的最高电压为$;$N &故在Z 9b :芯片与b 9/Q 接口之间添加=.<5^模块实现电平转换%F !硬件控制程序设计硬件控制程序是设计的核心与难点%在设计之前&需要对/>>>(%%总线协议和b 9/Q 接口芯片的内部结构做深入研究%F D C !S <<<M ]]总线介绍/>>>(%%总线')'(自提出以来&一直被广泛应用于测试*控制等领域%它由数据线*三根握手线*五根接口管理线以及地线组成%三根握手线配合工作&通知总线何时传输数据&何时接收数据&确保数据传输准确无误%接口管理线:8^控制总线上传输的是数据还是指令&>./提示总线何时传输结束等&/Z F 设置所有的设备于静止状态&U >^使能设备进行远程编程&<U ?提醒控制器是否需要服务%在工作时&测试系统存在$种角色&即控者负责发送各种命令&讲者发送数据&听者接收数据%典型的b 9/Q 专用接口芯片^:8**&(的内部电路主要分为两部分%一部分面向b 9/Q 总线&主要包括b 9/Q 接口的十种功能以及各种缓冲器和译码器%另一部分面向微处理器&通过编写驱动程序让微处理器访问")个可寻址寄存器&其主要类型有数据类寄存器*中断类寄存器*地址类寄存器%^:8**&(的内部结构',%(如图)所示%b 9/Q 接口共定义了&#种接口功能&分别是源方和受方挂钩功能*讲者*听者*控者*器件清除功能*服务请求功能*并行轮询功能*远控-本控功能*器件触发功能%其中前五种是基本接口功能&后)种是辅助接口功能%基本功能是所有带b 9/Q 接口的设备必须具备的&保证测试系统中各仪器之间能相互通信&辅助功能让测试系统更便捷*更智能%F D E !Q2S K 接口功能的程序设计与仿真该方案的硬件程序使用N E R 4O K P 硬件描述语言进行开发&软件采用@4O 42Y 的/<>%整体设计采用自顶向下的设计思想&将整个系统拆分成若干个子功能模块&其中包括串图)!^:8**&(内部结构口数据收发模块*数据读写控制模块*中断模块以及b 9/Q 接口功能模块&每个子功能模块又有不同的状态&同一时刻只允许存在同一种状态&不同的状态又通过相互联系的小状态机进行切换&且状态的改变与之前设备所处的状态关联&这样就构成了一个相互排斥又相互联系的状态机%通过各模块的接口功能状态机的联系&最总形成一个顶层b 9/Q 接口功能状态机%b 9/Q 接口功能的实现依赖于各个功能模块的实现&由于篇幅有限&该章节主要对b 9/Q 接口的讲者!8"*听者!M "功能*Z /Z .模块的设计进行详细描述&并利用=K H E 5O S 4I 软件进行仿真验证%$;";&!讲功能!8"设计讲功能'*&#(的主要作用是将用户发送的程控指令或者数据通过总线发送到测试系统中的仪器中&或者将仪器自身的工作状态以及参数等信息通过数据总线传输到9F 端%只有当系统控者寻址讲者或者设备通过6K 2指令将自身设置为讲者时&才赋予这种功能%同一时刻&一个测试系统中只存在一位讲者%讲功能的状态分为8/-<!讲者空闲态"*8:-<!讲者被寻址态"*8:F <!讲者活动态"*<9:<!串行活动态"*<9/<!串行空闲态"*<9=<!串行模式"共'种&按照协议功能又分为讲者数据传输和串行轮询两组事件&分别如图'!A "和图'!X"所示%讲者状态图如图)所示%事件!A "中&在设备上电后&讲功能同时进入8/-<和<9/<两种状态&此时不具备数据传输能力%当设备被寻址为讲者!即=8:m &"或设备通过6K 2指令设置自身为讲!投稿网址 \\\!0S 01O J3[!1K I Copyright ©博看网. All Rights Reserved.第%期刘!阳&等)基于Z 9b :的/>>>(%%""""""""""""""""""""""""""""""""""""""""""""""""""""接口协议实现及驱动程序开发#&$,!#图'!讲功能状态图者&且:F -<为活动态时&讲功能进入被寻址态&此时讲者准备好发送数据%:8^信号线决定系统传输的数据类型&当:8^为假时&表示b 9/Q 总线上传输的是数据&当<9=<是活动态时&设备进入<9:<状态$当<9=<为假时&讲者进入8:F <状态&此时配合<V 功能将数据传到b 9/Q 数据总线%当设备处于<9:<或8:F <状态时&若:8^为真&说明系统控者发送命令&讲功能返回寻址态%事件!X "中&若<9>为真&即允许串行查询&听者进入串行轮询模式状态&并参与串行轮询%当系统活动控者发送<9-命令&即禁用串行轮询%听者进入串行轮询空闲状态%讲功能的N E R 4O K P 设计包括了图)中两组状态&每种状态的转换都通过分析当前的状态机来转换&结合各状态之间相互排斥又相互联系的特征&8/-<和<9/<采用并行语句执行%!X"状态的具体实现的核心部分代码如下所示)1A S E !1B R R E 264S 6A 6E 4""84<8:8>4"4<9/<)4L !E W E 26"4&"1B R R E 264S 6A 6E 4"+m 84<8:8>4"4<9=<$84<8:8>4"4<9=<)4L !E W E 26"4$"1B R R E 264S 6A 6E 4"+m 84<8:8>4"4<9/<$E O S E 4L !E W E 26"4""1B R R E 264S 6A 6E 4"+m 84<8:8>4"4<9/<$H E L A B O 6)1B R R E 264S 6A 6E 4"+m 84<8:8>4"4<9/<$E 2H 1A S EA S S 4P 2E W E 26"4&m <9>!&s X &d :F -<!&s X &$A S S 4P 2E W E 26"4"m <9-!&s X &d :F -<!&s X &$A S S 4P2E W E 26"4$m /Z F !&s X &$通过编写8E S 6X E 21G 仿真文件&使用=K H E O S 4I 仿真后波形如图,所示%根据分析可以看出&讲功能的每个状态严格按照状态图进行变换&且同一时刻只存在一种活动态%$;";"!听功能!M "设计听功能'&&(的主要作用是接收仪器发送过来的状态信息或者主控设备的指令%同一时刻&一个测试系统中可以存在多位听者%图,!讲功能仿真波形听功能的状态分为M /-<!听者空闲态"*M :-<!听者被寻址态"*M :F <!听者活动态"*M 9/<!听者主空闲态"*M 9:<!听者主被寻址态"&其中后两种为扩展听者!M >"状态%听者状态如图%所示%图%!听功能及扩展听功能状态图状态图!A "是听功能的状态图&当设备上电后&听功能同时进入M /-<和M 9/<两种状态%当设备被寻址为听者!=M :m&"或者设备通过O K 2指令设置自身为听者&且:F -<为活动态时&听功能进入被寻址态&此时听者准备好接收数据%若:8^为假&表示b 9/Q 总线上传输数据&此时听者变为M :F <状态&并且配合:V 功能从数据总线上接收数据%若:8^为真&表示b 9/Q 总线传输命令&听者由活动态变为被寻址态%当控者发出B 2O 命令&宣布测试系统内所有的设备取消听者状态&且:F -<为真时&听者进入空闲态%状态图!X "是扩展听功能的状态图&在M 9/<状态下&听功能可以识别它的主地址&但无法响应它的副地址%当听功能被寻址且处于接收数据状态时&听功能进入被寻址主状态&此时听功能可以识别并响应它的副地址%听功能的=K H E O S 4I 仿真波形如图*所示%$;";$!Z/Z .模块设计为提高系统传输数据的稳定性&避免因控制端和数据端传输速率差异造成的数据丢失现象&设计Z /Z .模块作为数据缓冲区%Z /Z .模块连接读写控制端和数据总线端%读写控制部分由F O 3*U E S E 64Z 4L K *U E A H *D R 46E *Q B L L E R 4L B O O 组成&H A 6A 442',)#(和H A 6A 4K B 6',)#(连接数据总线%当转换器身份为讲者时&从Z /Z .中取数据放入总线&若Z /Z .!投稿网址 \\\!0S 01O J3[!1K I Copyright ©博看网. All Rights Reserved.!!计算机测量与控制!第$#""""""""""""""""""""""""""""""""""""""""""""""""""""卷#&$%!#图*!听功能仿真波形数据为空&则读写控制端写入准备发送的数据%当转换器身份为听者时&将总线上的数据存入Z /Z .&若Z /Z .存在数据&则通知读写控制端读取数据%Z /Z .的U 8M 视图如图&#!A "所示%=K H E O S 4I 仿真波形如图&#!X"所示%图&#!Z /Z .U 8M 视图与仿真波形F D F !内部寄存器设计^:8**&(芯片的工作主要通过配置内部寄存器来完成%设计中通过读写控制模块对各个寄存器进行配置&从而控制接口的数据传输%设计的寄存器主要有地址寄存器*b 9/Q 总线寄存器*b 9/Q 状态寄存器*接口功能寄存器*b 9/Q 控者寄存器*读写控制寄存器&中断控制寄存器%其中&中断寄存器/<U #与听*讲功能相关&其结构如表&所示%表&!/<U #寄存器,')($"&#/<U #/^8#/^8&Q /Q .>^-<9:<U M F=:F/<U #可读寄存器的Q /*Q .*>^-位分别代表数据接收位*数据发送位*数据传输结束位%当设备为系统活动控者或者讲者时&Q .位置&&此时可以向系统内其他设备发送命令或数据$当设备为听者时&当数据接收寄存器接收到数据时&Q /位置&$当接收到结束符#Y #:时&>^-位置&&结束本次数据传输%F D M !Q2S K 数据传输数据传输是硬件控制程序的核心部分&也是该协议转换器要实现的最主要功能%在各个子功能模块完成的基础上&构建从C :U 8模块到b 9/Q 接口模块的数据通道%数据的传输主要依靠设备的听*讲功能以及读写控制模块&还有Z /Z .存储模块%听讲功能控制数据传输的方向&Z /Z .模块控制数据的存取%读写控制模块直接配置状态寄存器&进而配置b 9/Q 的接口功能&并配合Z /Z .模块完成数据的存取%在程序中设计了b 9/Q 4U E A H 和b 9/Q 4D R 46E 两个资源文件&用来实现b 9/Q 的读写操作%在b 9/Q 4U E A H 模块中&输入输出端口名分为b 9/Q 接口*外部接口*Z /Z .模块$部分%b 9/Q 接口部分用来判断当时是否处于听活跃状态&外部接口模块负责产生数据中断等信号&Z /Z .模块则提示是否存在数据以及数据的存取%b 9/Q 4D R 46E模块的结构与b 9/Q 4U E A H 模块基本类似%读写的逻辑结构如图&&所示%图&&!b 9/Q 读-写流程图M !软件驱动程序设计M D C 
了缩 短 开 发周 期 ,一般 都 采 用专 用 的接 口器 件 。
本文 就 是采 用P X 司 的P I0 2 把 P I 线上 L公 C95 来 C总
的操 作转换 为对 局部 总线 的操作 ,同时通 过 双 口 R M实 现和 下位 机 的存 储 转 接 。针 对 一 般P I A C 总 线开 发时 由于 软硬件 分离使 开发 的软硬件 不 能很 好结 合 的现象 ,本文 结合 实例介 绍 了应 用程 序并 给 出 了如 何 通过 D ieSu i开发 的P I 备 驱 动 r rtdo v C设 程序来 访 问P I C 设备卡 硬件 资源 的具 体程 序 。
Ap .2 07 r 0
(C 基 地址 寄 存器 ,局 部 范 围寄 存 器 ,局 部基 地 PI 址 寄 存器 ,局 部 总线 区域 描 述符 )来实 现 的 。这 个组 定 义 了 每个 空 间 以及 相 应 局部 空 间的 特性 。 它们 将局 部端 的 芯 片通过 局 部端 地 址 ( 局部 配 在 置 寄存 器 中设 置)翻译 成 P I 线 地 址 ,也 就 是 C总 将本 地 的芯 片 映 射 到系 统 的 内存 或 I ] 0口。而 片 选信号 寄存 器则 是用 来选 定这 些局 部 端所 接 的芯 片 的。这 样 ,用程 序 操作 这 一段 内存 ( ] )实 或I 0 际上 就 是 对本 地 芯 片 的操 作 。其 映射 关 系 如 图 1 所 示 。这些 寄存 器 的 内容 必须 在芯 片 复位 时通 过
E PO E R M访 问。
在 P I 置 寄 存 器 中 的设 备I C配 D、制 造 商 I D、 版 本号 、首 区类代 码 、类别 代码 、指 令 寄存 器 和
计算机C++USB上位机开发

第10章 上位机程序开发在USB设备开发中,上位机程序是用于与用户进行接口的。
上位机程序通过USB设备驱动程序和外部的USB硬件进行通信,USB固件程序执行所用的硬件操作。
一般来说,根据选择开发平台的不同,可以使用Visual C++、Visual C#和LabVIEW等开发上位机程序。
本章首先介绍了Visual C++中控制USB设备的相关函数,接着介绍了Visual C#中读写USB设备的主意函数,最后介绍了在LabVIEW中如何读写USB设备。
本章内容包括:Visual C++读写USB设备;Visual C#读写USB设备;LabVIEW读写USB设备。
10.1 Visual C++读写USB设备在USB设备开发过程中,上位机程序可以采用广泛应用的Visual C++来实现。
对于Cypress公司的EZ-USB系列芯片,其提供了全面的CY3684开发包。
在该开发包中,可以使用CYIOCTL控制函数类和CyAPI控制函数类来实现Visual C++环境下对USB设备的读写。
10.1.1 CYIOCTL控制函数类CYIOCTL控制函数类为Cypress公司的EZ-USB FX2LP系列USB接口芯片,提供了简单的控制接口。
在使用Cypress公司提供的驱动程序基础上,只需在主机Visual C++程序中加入头文件cyioctl.h,然后便可以调用相应的控制函数。
为了能够使用这些函数,主机程序必须首先获得USB设备的控制句柄。
可以通过以下的代码在程序中获得连接到主机的USB设备句柄。
CCyUSBDevice *USBDevice = new CCyUSBDevice(); //USB设备HANDLE hDevice = USBDevice->DeviceHandle(); //打开设备句柄其中,hDevice即为获得的USB设备句柄。
在退出程序的时候,需要释放该USB设备句柄,使用如下的语句即可:delete USBDevice;在主程序获得USB设备的控制句柄后,便可以调用CYIOCTL控制函数类提供的接口控制函数,下面分别进行介绍。
基于NI-VISA的PCI板卡驱动程序开发

基于NI-VISA的PCI板卡驱动程序开发张艳华科0引言驱动程序是计算机与设备通讯的特殊程序,操作系统只有通过这个接口,才能控制硬件设备的工作并实时、准确的将信息传递给主机。
PCI总线是PC机广泛采用的外设总线架构,在构建基于PC的信息处理系统中,常常被选择为数据传输通道。
传统的PCI设备驱动程序开发平台有WDM、VC、Linux等,但在这种平台上进行驱动程序的开发,需要设计人员熟知操作系统的内核结构,且操作起来比较繁琐,对缺少驱动开发经验者显得比较困难。
本文介绍一种简单、快速的PCI接口驱动程序开发方法。
使用NI-VISA的Driver Wizard 向导可以方便的生成具有产生中断功能的驱动程序,在NI Labwindows/CVI环境下,可对中断事件进行检测和处理。
1基于NI-VISA的驱动程序1.1NI-VISA概述NI-VISA(Virtual Instrument Software Architecture,以下简称为"VISA")是美国国家仪器NI(National1nstrLlrnent)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。
VISA总线I/0软件是一个综合软件包,它不受平台、总线和环境的限制,可用来对USB、GPIB、串口、VXI、PXI和以太网系统进行配置、编程和调试。
VISA是虚拟仪器系统I/O接口软件,基于自底向上结构模型的VISA创造了一个统一形式的I/O控制函数集,并且对于初学者来说这些函数集是简单易用的。
1.2基于VISA的驱动程序开发架构“驱动程序”通常是指安装于操作系统上,供应用程序调用以操作硬件设备的一组函数。
驱动程序提供面向应用程序的API接口函数,把应用程序对API函数的调用翻译成硬件可以理解的底层寄存器操作。
驱动程序封装了具体的硬件操作,软件设计者不需要了解具体的操作细节就可以开发基于硬件的应用程序。
基于VISA的驱动又称为“仪器驱动”,这是由于VISA广泛应用于虚拟仪器的开发。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
第三步: 第三步: 安装DriverStudio。 安装 。 DriverStudio安装后的设置: 安装后的设置: 安装后的设置 1)使用 工具定义BASEDIR环境变量并启动 )使用SetDDKGo工具定义 工具定义 环境变量并启动 MSVC 5.0或6.0 , 或
10
11
12
2)打开下列地址上的建立库文件工程 )
8
第二步: 第二步: 安装2000DDK(Driver Development Kits)。 安装 ( )。 注意: 注意: 1)如果本地机的操作系统为 )如果本地机的操作系统为Windows2000 请确认已经 安装了Windows SevicePack1或Windows SevicePack2 安装了 或 在安装DDK的时候请选择完全安装。 的时候请选择完全安装。 在安装 的时候请选择完全安装 2)安装中,不需要安装 )安装中,不需要安装64BIT IA64Binaries 3)安装好后,对于 )安装好后,对于2000DDK不需要手动配置环境变量 不需要手动配置环境变量 只需在开始菜单中点击Checked Build Envirment 则 ,只需在开始菜单中点击 DDK会自动调用 会自动调用setenv配置环境变量,并监测相应的 配置环境变量, 会自动调用 配置环境变量 SDK以及 以及Visual Studio IDE 以及
2.2 DriverStudio 2.7的安装 的安装 安装需要的软硬件环境 • PC-compatible Intel x86 系统 • Windows 2000, (Optional: 其中一些工具也支持 Windows 98 和 Windows 95.) •内存 最少 MB, 推荐使用 MB 内存: 推荐使用64 内存 最少32 •硬盘 完全安装需要 72 MB 硬盘:完全安装需要 硬盘 •针对 SoftICE的远程调试 NE2000-兼容网卡或 3Com 的远程调试: 兼容网卡或 针对 的远程调试 兼容 网卡 •针对 DriverWorks: Microsoft DDK,MS Visual C++ 针对
31
.cpp文件 文件
// MYFIRST.cpp - main module for VxD MYFIRST #define DEVICE_MAIN #include "myfirst.h" Declare_Virtual_Device(MYFIRST) ( ) #undef DEVICE_MAIN MyfirstVM::MyfirstVM(VMHANDLE hVM):VVirtualMachine (hVM) {} ) MyfirstThread::MyfirstThread(THREADHANDLE hThread): VThread(hThread) {} ( ) DWORD MyfirstDevice::OnW32DeviceIoControl (PIOCTLPARAMS pDIOCParams) ) { char* msg="欢迎进入虚拟机世界!"; char* caption="Hello World!";
16
设备名
动态装载
编程语言 生成调试用目标代码
17
18
19
与应用程序通 信的控制消息
20
21
设备类名 虚拟机类名 线程类名
22
23
24
25
26
27
28
29
头文件
// MYFIRST.h - include file for VxD MYFIRST #include <vtoolscp.h> #define DEVICE_CLASS MyfirstDevice #define MYFIRST_DeviceID UNDEFINED_DEVICE_ID #define MYFIRST_Init_Order UNDEFINED_INIT_ORDER #define MYFIRST_Major 1 #define MYFIRST_Minor 0 #define DIOC_MY_IO CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) // 定义一个句柄用于应用程序与 定义一个句柄用于应用程序与VxD通信 通信
13
3)选择Build|Batch Buபைடு நூலகம்ld(编译 批构件),打开下 )选择 批构件) (编译|批构件 面的窗口,从中选则需要编译的配置。 面的窗口,从中选则需要编译的配置。
注意不要选择IA64的各项,Checked是调试版本,Free 的各项, 是调试版本, 注意不要选择 的各项 是调试版本 是发布版本
3
2. 驱动程序开发工具包 驱动程序开发工具包DriverStudio
2.1 DriverStudio 2.7所包含的工具 所包含的工具 • VToolsD VToolsD 是一个用来开发针对 是一个用来开发针对Win9X (Windows 95 和 Windows 98)操作系统下设备驱动程序 操作系统下设备驱动程序(VxD)的工具。 的工具。 操作系统下设备驱动程序 的工具 VToolsD 中包括生成驱动程序源代码的工具,run-time 和 中包括生成驱动程序源代码的工具, interface 库,以及一些驱动程序样本,可以用来作为各种 以及一些驱动程序样本, 类型的设备驱动程序的基础部分。 类型的设备驱动程序的基础部分。 • DriverWorks DriverWorks对于 对于Windows NT下和 Windows 98 与 对于 下和 Windows 2000共同支持的 共同支持的Win32驱动模型 驱动模型(WDM)设备驱 共同支持的 驱动模型 设备驱 动程序的开发提供完全的支持。 动程序的开发提供完全的支持。DriverWorks中包含一个 中包含一个 非常完善的源代码生成工具(DriverWizard) 以及相应的类 非常完善的源代码生成工具 库和驱动程序样本,它提供了在C++下进行设备驱动程序 库和驱动程序样本,它提供了在 下进行设备驱动程序 4 开发的支持。 开发的支持。
2
对于WDM的开发,又分几种情况: 的开发,又分几种情况 对于 的开发 1)对于 对于Windows 98系统 对于 系统 • Visual C++ 5.0 • Windows 98DDK 2)对于 对于Windows Me/2000 对于 • Visual C++ 6.0 • Windows 2000DDK 3)对于 对于Windows XP 对于 • Visual C++6.0/.net • Windows XPDDK 同样,为了方便起见, 同样,为了方便起见,也可以使用第三方的开发 工具Driver Works,它也是将 工具 ,它也是将DDK的内容封装成类 的内容封装成类 而且提供一个快速方便地生成驱动框架的工具。 ,而且提供一个快速方便地生成驱动框架的工具。
5
• DriverMonitor DriverMonitor不仅可以显示 不仅可以显示WDM和VxD在操作系 不仅可以显示 和 在操作系 统核心层次输出的调试语句,还可以装载和卸载VxD 统核心层次输出的调试语句,还可以装载和卸载 驱动和NT4系统的驱动程序。 系统的驱动程序。 驱动和 系统的驱动程序 • EZDriverInstaller EZDriverInstaller是一个无需经过设备管理器或“添 是一个无需经过设备管理器或“ 是一个无需经过设备管理器或 加新硬件”功能就能为Windows 2000/XP动态加载和 加新硬件”功能就能为Windows 2000/XP动态加载和 卸载WDM驱动程序的小实用程序。 驱动程序的小实用程序。 卸载 驱动程序的小实用程序 • SetDDKGo SetDDKGo用来设置设备驱动程序创建的环境。当 用来设置设备驱动程序创建的环境。 用来设置设备驱动程序创建的环境 我们用Visual Studio(VC++)编译驱动程序源程序的 我们用 ( ) 时候,需要用SetDDKGo来设置环境变量,之后 来设置环境变量, 时候,需要用 来设置环境变量 SetDDKGo会自动启动 会自动启动Visual Studio(VC++)编译环 会自动启动 ( ) 境。 6
软件接口与 Windows98/2000/XP驱动程序编写方法 驱动程序编写方法
1
1. 驱动程序的开发环境
对于VxD的开发,需要的开发环境是: 的开发,需要的开发环境是: 对于 的开发 • Visual C++ 5.0/6.0 • Windosw 95DDK 如果想加快开发步骤,建议使用第三方的VToolsD开 如果想加快开发步骤,建议使用第三方的 开 发工具,它将DDK的东西全部封装成 的东西全部封装成C++的类,可 的类, 发工具,它将 的东西全部封装成 的类 以直接用Visual C++编写程序,而无须使用汇编。而 编写程序, 以直接用 编写程序 而无须使用汇编。 能够方便快速地建立VxD程序 且它提供的 QuickVxd能够方便快速地建立 能够方便快速地建立 程序 的框架。 的框架。
• DriverNetworks DriverNetworks 是针对 是针对Windows网络驱动开发人员 网络驱动开发人员 的一个模块。在它的核心部分, 的一个模块。在它的核心部分,DriverNetworks 是一 个针对NDIS drivers 和 TDI clients (DriverSockets)的 个针对 的 C++ 的类库。DriverNetworks 中也有 的类库。 中也有Quick Miniport Wizard 用来直接开始一个 用来直接开始一个NDIS Miniport 或 Intermediate Driver 工程。它可以让你快速的生成所有 工程。 采用DriverNetworks C++ 类库编写的 类库编写的NDIS驱动程序的 采用 驱动程序的 编译, 编译,安装和调试所需要的文件 。 • SoftICE SoftICE 是一个功能极其强大的内核模式调试器,它 是一个功能极其强大的内核模式调试器, 支持在配置一台单独的计算机或两台计算机下进行设 备驱动程序的调试。 备驱动程序的调试。