USB设备驱动
USB设备驱动(精选10篇)
USB设备驱动 第1篇
关键词:USB2.0,DriverStudio,设备驱动程序
引言
USB总线是1995年微软、IBM等公司推出的一种新型通信标准总线, 特点是速度快、价格低、独立供电、支持热插拔等, 其版本从早期的1.0、1.1已经发展到目前的2.0版本, 2.0版本的最高数据传输速度达到480Mbit/s, 能满足包括视频在内的多种高速外部设备的数据传输要求, 由于其众多的优点, USB总线越来越多的被应用到计算机与与外外设设的的接接口中, 芯片厂家也提供了多种USB接口芯片供设计者使用, 为了开发出功能强大的USB设备, 设计者往往需要自己开发USB设备驱动程序, 驱动程序开发一直是Windows开发中较难的一个方面, 但是通过使用专门的驱动程序开发包能减小开发的难度, 提高工作效率, 本文使用Compuware Numega公司的Driver Studio3.2开发包, 开发了基于NXP公司USB2.0控制芯片ISP1581的USB设备驱动程序。
USB设备驱动程序的模型
USB设备驱动程序是一种典型的WDM (Windows Driver Model) 驱动程序, 其程序模型如图1所示。用户应用程序工作在Windows操作系统的用户模式层, 它不能直接访问USB设备, 当需要访问时, 通过调用操作系统的API (Application programming interface) 函数生成I/O请求信息包 (IRP) , IRP被传输到工作于内核模式层的设备驱动程序, 并通过驱动程序完成与UBS外设通信。设备驱动程序包括两层:函数驱动程序层和总线驱动程序层, 函数驱动程序一方面通过IRP及API函数与应用程序通信, 另一方面调用相应的总线驱动程序, 总线驱动程序完成和外设硬件通信。USB总线驱动程序已经由操作系统提供, 驱动程序开发的重点是函数驱动程序。
USB设备驱动程序的设计
使用DriverStudio3.2开发USB设备驱动程序
该驱动程序的主要功能包括:从控制端点0读取规定个数的数据、向端点0发出控制命令、从端点2批量读数据、向端点2批量写数据, 驱动程序的开发采用Driver Studio 3.2驱动程序开发包及V C++6.0, 使用开发包中的向导程序DriverWizard就可以方便的生成驱动程序框架、模块及部分程序源代码, 开发者只需要在功能模块中加入自己的实现程序就能完成复杂的USB设备驱动程序设计, 下面介绍使用DriverWizard生成ISP1581驱动程序的过程:
(1) 启动Driver Wizard, 选择DriverWorks Project创造一个名为USBDIO的VC++项目;
(2) 在驱动程序类型中选择WDM Driver, WDM Function Driver, 在硬件设备所支持的总线类型中选择USB (WDM Only) , 在USB Vendor ID (厂商识别码) 中填写0741, 在USB Product ID (产品识别码) 中填写0821;
(3) 增加USB设
备端点, 设置端点2为批量输入/输出传输方式;
(4) 在驱动程序支持的功能项中选择Read、Write、Device Control、Cleanup;
(5) 选择自动产生批量读及批量写程序代码;
(6) 在I/O请求IRP处理方式中选择None, 即IRP不排队;
(7) 在接口的打开方式中选择Symbolic link:Usbdio Device, 即应用程序以符号链接名打开设备;
(8) 定义应用程序调用DeviceIoControl函数对WDM驱动程序通信的控制命令, 结果如图2所示。
(9) 最后选择完成并确认生成新的项目信息, 向导程序就会在usbdio目录中生成一个名为USBDIO的项目文件, 其中包括了ISP1581驱动程序框架、模块及部分源代码。
USB设备驱动程序的编程
在使用DriverWizard生成驱动程序框架、模块及部分程序源代码后, 开发者只需完成图2中三个控制代码所对应的三个功能模块的编程:模块USBDIO_IOCTL_ID_CODE_Handler的功能是从控制端点0读取数据, 模块USBDIO_IOCTL_TEST_COMMAND_Handler的功能是向控制端点0发送一个控制命令, 模块USBDIO_IOCTL_DMA_COMM AND_Handler的功能是向控制端点0发送一个要求USB设备进行DMA传输的控制命令, 下面是第一个模块的编程实例。
对象I包含了应用程序下传的IRP内容, 包括命令或数据等参数, 函数BuildVendorRequest用来分配并初始化一个用于厂商请求的URB (USB Request Block) , 该URB将作为下传IRP的一个参数, 通过函数SubmitUrb发送给总线驱动程序, 以便完成与硬件的通信。
在初始化URB时需要了解USB的传输方式及传输协议, 该功能使用了USB的控制传输方式, 该方式包括三个阶段:设置阶段、数据阶段和状态阶段, 其中数据阶段可选, 开发者主要关注设置阶段中的8个关键字节的定义, 8字节分成了5个字段, 定义了传输请求及相关信息, 这8个字节的格式如图3所示。
BmRequestType:1字节, 用来指定数据流动的方向, 请求的类型, 以及接收者。
bRequest:1字节, 用来指定请求。
wValue:2字节, 主机用来传输信息给设备, 开发者可以根据情况自己定义。
wIndex:2字节, 主机用来传输信息给设备, 开发者可以根据情况自己定义。
wLength:2字节, 包含数据阶段中接下来要传输的数据字节数目。
以上字段的应用已经在程序注释中标出, 在此不再赘述。
USB设备驱动程序的安装及调用
USB设备驱动程序的安装
驱动程序编译完成后会生成一个名为USBDIO.SYS的文件, 即USB设备驱动程序, 另外在使用向导程序WizardDriver生成驱动程序时会产生一个名为USBDIO.INF的驱动程序安装程序, 对此程序只需稍做修改就能正常使用, 具体是将类改为USB, 即Class=USB, 由于本驱动程序使用符号链接名打开设备, 所以删除ClassGUID选项, 注意设备标识符必需为:%Device Desc%=USB D IO_DDI, USBVID_0471&PID_0821, 其中0471是USB控制芯片的厂商识别码, 0821是USB设备标识码。
驱动程序安装过程是:将U S B设备加电, 连入计算机的USB接口, 这时候会看到Windows操作系统提示发现新硬件, 提问是否安装驱动程序, 选择是, 然后选择驱动程序所在文件夹, 选择文件USBDIO.INF即可完成安装。
USB设备驱动程序的调用
为了完成对驱动程序的调用, 笔者使用VC++6.0编写了USB应用程序包, 程序包共由五个功能模块组成, 用户通过调用这些模块即可方便的完成对U S B外设的控制及读写, 这些模块如下。
int CTRLReadData (unsigned char usbSelect, unsigned char*rbuffer, unsigned char numData) , 主要功能是读取ISP1581控制端点0发来的数据, 数据存放在缓冲区rbuffer中。
int CTRLSendTest Command (unsigned char usbSelect, unsigned short int testCommand) , 主要功能是发送测试命令, 变量testCommand定义了测试命令。
int CTRLSendDMACommand (unsigned char usbSelect, unsigned chard ma Di rection, unsigned char ramSelect, unsigned long dmaLength) , 主要功能是发送D M A传输命令, 变量dma D irection定义数据传输方向, ramSelect定义将要操作的USB外设的存储器, dmaLength定义了数据传输总数。
int DMARead (unsigned char usb Select, unsigned char*rbuffer, int len, int waitTime) , 主要功能是计算机批量读取ISP1581中的数据, 而ISP1581以DMA方式从外部R A M读取数据。
int DMAWrite (unsigned char usb Select, unsigned char*rbuffer, int len, int waitTime) , 主要功能是计算机批量写数据到ISP1581, 而ISP1581将以DMA方式写数据到外部RAM。
结语
USB设备驱动程序开发是Windows编程中较难的一个方面, 要求开发者不但要有良好的Windows编程知识, 还要掌握USB控制芯片工作原理、USB传输协议、USB固件等相关知识, 使用DriverStudio3.2进行USB设备驱动程序开发可大大减少工作量和工作难度, 笔者所设计的U S B设备驱动程序, 已经应用到某雷达的自动测试设备中, 驱动程序在计算机应用程序控制下可以顺利的发送各种测试命令, 批量输入或者输出大量数据, 达到设计要求。
参考文献
[1]武安河.WIindows2000/XP WDM设备驱动程序开发[M].北京:电子工业出版社, 2005.
[2]萧世文, 宋延清.USB2.0硬件设计[M].北京:清华大学出版社, 2006.
[3]王跃钢, 韩心中.基于WDM模式的USB设备驱动程序开发[J].微计算机信息, 2008, 22 (8-3) :305-307.
[4]马官营, 杨明, 吴晓琳.Windows2000通用设备驱动程序设计[J].计算机应用, 2003, 23 (6) :179-180.
USB设备开发简介 第2篇
USB设备的开发一般包括三个方面:设备端硬件接口设计、固件(即要写到设备内部只读存储器中去的运行程序)编写,及主机端设备驱动程序的开发,这里仅就设备端硬件接口设计作一些介绍。
1.USB设备接口设计方案
USB设备接口设计有两种方案可选:采用普通单片机加专用USB接口芯片;采用带USB接口的单片机,即专用USB控制器芯片。
目前有多种类型的USB接口芯片,例如USBN9602(NationalSemiconductor公司)、PDIUSBDl2(Philips公司)和USS820/825(Lucent公司)等。采用普通单片机加USB接口芯片方案的优点是:开发人员可以利用现有单片机开发系统开发设备的应用程序,而不必再投资购买新的单片机开发系统;缺点是:硬件设计比较复杂,调试麻烦。
第二种方案中所采用的LISB控制器芯片有两类:一类为完全从底层开发的微控制器芯片,如Cypress的CY7C63XXX系列;一类是基于通用单片机开发的USB控制器芯片,如与Intel8051兼容的8x930A/8x931A(Intel/Cypress公司)、EZ-USB(Cypress公司)。第二种方案的优点是设计简单。例如,EZ-USB单片机集成了加强的8051微控制器、智能USB引擎、USB收发模块和RAM等,它提供了24个I/O端口、16位地址线、8位数据线、1个PC机接口和l对USB接口。所集成的智能USB引擎可以完成USB协议所规定的80%~90%的通信工作,减轻了USB外设开发人员的开发负担;所提供的开发工具能自动生成固件框架,开发者只须根据需要填些相关函数体;固件和驱动程序可以分别独立调试,极大地提高开发速度。该方案的缺点是需购买新的单片机开发系统,投资较大。
如果要深入理解USB通信协议、USB设备工作机制以及USB设备驱动开发模型,最好选择第一种方案,即采用USB接口芯片+传统单片机+设备功能电路的模块化设计方法。设计出的USB设备的功能框图如图10.47所示。
2.USB芯片PDIUSBDl2简介
采用第一种方案时需要熟悉USB接口芯片。这里对PDIUSBDl2(简称D12)作一些简单介绍,使读者对该类芯片有一个基本认识。
D12全面支持USB规范1.1,并且与大多数设备类兼容,图像设备类、大容量存储设备、通信设备、打印设备、人机接口设备。D12还具有SoftConnect、GoodLink、可编程时钟输出,以及低频石英振荡器等特征,从而极大降低系统实现成本,并简化高级USB功能的实现,
该芯片采用双列直插封装,有28个信号引脚。其中包括2个USB数据信号(D+、
D-)、8个双向数据信号、1个中断输出信号、1个命令/数据口选择输入、读和写输入信号、GoodLinkLED指示灯信号,以及与DMA请求相关的信号引脚。
D12提供三组端点,每组有一个用于输入的端点和一个用于输出的端点。其中端点0(组)为设备缺省支持的控制端点;端点l(组)为普通端点,可以作为块传输或中断传输端点;端点2(组)称为主端点,除了支持块传输或中断传输外,还支持等时传输,此外,它采用双缓冲区结构,因此具有更高的传输速率,并支持DMA方式(与单片机之间的数据传送)。端点0和端点1的最大包尺寸为16字节,而端点2的最大包尺寸为64/128字节。
D12提供三组命令:初始化命令、数据流命令和一般命令。初始化命令在USB设备被枚举时使用,用来使能端点并为其分配地址、设置端点的传输方式以及进行其他初始化方面的操作。数据流命令用来管理端点与微处理器之间的数据交换。一般命令实际是两条:一条是发送给下游设备的恢复命令,用来激活被挂起的设备;一条是读当前帧的编号。
作为例子,下面看几条数据流命令的功能。
①选择端点命令:选择某端点,并将内部指针指向该端点缓冲区的开始。
②读缓冲区命令:从所选择端点缓冲区读取若干字节,每读取一个字节,缓冲区指针加1。
③写数据缓冲区命令:向端点缓冲区写入数据(最多130个字节)。
④读中断寄存器命令:该命令之后需读入两个字节。字节1用来判断总线事件,即哪个端点发生中断或总线状态变化;字节2的最低位指出DMA操作是否完成(高位保留)。
⑤SETUP确认命令:当控制端点接收到一个SETUP包时,该端点将被冻结,缓冲区中一直保留最后一个SETUP包。发出该命令将解除冻结,继续进行SETUP事务(向主机返回包)。设置该命令是考虑到控制传输的特殊性(对设备进行配置)。
USB设备驱动 第3篇
关键词:Usb,测试,复合设备,传输模式,驱动
1 引言
一个成功的Usb设备控制器需要完善的Usb测试方案,而完整的测试一个Usb设备控制器,需要分别对功能和性能进行检测。功能是前提,就是测试特定配置下Usb设备能否正常工作,具体到实际上就是数据传输能否完成,传输是否正确;性能建立在功能之上,即Usb设备正常工作情况下数据传输的速度和稳定性,因此主要讨论对Usb设备功能的测试。
2 Usb特性划分
要了解需要测试哪些功能,需要先分析Usb设备控制器的特性,在协议层上,一个Usb2.0的控制器具有如表1所示的特性。
3 测试方案讨论
3.1 Usb设备测试节点划分
由表1中Usb设备特性可以看出,一个Usb设备按功能层次从高到低划分如图1所示。
对Usb设备的功能测试,需要覆盖图1中5个测试节点:
1)速度模式。目前产品应用上主要是高速和全速传输,因此我们把设备配置按速度分成两大类进行测试。
2)端点号。一个Usb控制器最多可以有0~15五个物理端点,其中端点0专用于控制传输,端点1~15另外三种传输模式都支持,并且支持在不同的时间配置成其中任意一种传输模式,所以每个端点在传输模式上面一层监测。
3)控制传输。Usb设备接入主机后即进行设备枚举过程,使主机得到设备的端点和传输模式等配置信息,并使设备得到主机分配的地址。而该过程即为端点0与主机间的控制传输过程,因此通过检测设备枚举正常与否即可判断控制传输是否正常。
4)其余三种传输模式。设备枚举成功后,设备与主机间的数据传输根据设备的具体功能,遵循这三种模式中的一种,比如u盘遵循bulk传输,Usb接口的视频采集设备和音响遵循ISO传输,Usb鼠标键盘都是遵循Intr传输。这样也需要分别对这三种传输模式进行测试。
5)端点传输包大小(MaxPkgSize)。Usb设备端点从主机处接收数据和向主机发送数据是以数据包的形式进行的,而每次发送的数据包的大小就是MaxPkgSize,大多数的Usb设备控制器,端点0的包大小确定为64字节,其余端点都可按照Usb协议的规定,在配置端点传输模式的同时,选择适当的包大小,当然,每次传输数据包越大,整体传输速率就越快。
3.2 Usb测试架构
文中Usb测试主机端选用安装Windows操作系统的PC机,这样整体测试环境就分成了三个部分:
最底层就是运行在测试板上的Usb设备驱动程序,主要完成对Usb控制器的配置并在该配置下与主机进行测试性的数据通讯。例如:可以设计一个设备驱动程序,配置该Usb设备为高速传输,生产商id为开发者想Usb开发者论坛申请的id号,产品id由开发者自己决定,设备类型为自定义类,配置端点0包大小为64字节,并把物理端点1配置成两个逻辑端点,既支持bulk传输的数据收,又支持相应的数据发,包大小为512字节。这样当设备插入主机并与之顺利进行设备枚举,并且主机给设备分配了地址n,那么主机就会知道,该设备的通讯地址是n,而且开启了端点1可以进行bulk传输。但是因为我们开发的是测试模块,规定的设备类是自定义,主机发送数据和向设备要求数据仍然需要再上层测试模块的支持,这样就到了中间层和第一层。
Usb驱动程序分为两类,标准驱动程序和用户自定义驱动程序,标准驱动程序是Usb开发者组织已经规定好并且在通用操作系统上业已嵌入的驱动程序,支持通用Usb设备类比如Usb大容量设备类:u盘,人体工学类:Usb鼠标,键盘,音视频设备类:Usb视频头。这样我们开发时只需要按照相应的协议文档处理主机发来的命令和请求即可实现这些通用设备类的功能了,而这些通用设备都不需要再设计主机驱动,并且只有一部分需要设计应用程序。
用户自定义类,顾名思义是当开发者需要实现特殊的Usb功能时,自己设计主机驱动程序和主机应用程序的设备类。从Usb测试的复杂要求来看,我们只能自己设计主机驱动和应用程序,以实现Usb测试的完整覆盖。
主机驱动和应用程序的实现步骤并非研究的核心内容,因此这里仅简单介绍二者开发的步骤和注意事项。
1)主机驱动:windows系统下的主机驱动开发多采用开发套件win.ddk+win.driver studio,ddk提供主机驱动所需的开发库,而driver studio作为一个友好的图形界面驱动架构生成工具,提供了Usb驱动开发选项,开发者只需填入驱动支持的Usb设备生产商id,产品id,端点0的包大小,启用的其他端点的端点号,启用传输模式,即可生成一个简单的Usb设备驱动框架,供开发者根据自己的要求修改。
2)应用程序:需要采用主机驱动文件中的interface.h头文件,该头文件里提供了驱动程序的类型码DEFINE_GUID,用于得到DevInterface供CreateFile()函数生成设备HANDLE。而应用程序与主机驱动的通讯由DeviceIoControl实现,该接口函数除需要设备HANDLER,还需要interface.h头文件中的操作码,这样通过DeviceIoControl传到主机驱动的数据才能被正确的处理函数收到并进行处理。应用程序除与主机驱动进行通信外,还要设计与设备协商的规范,这个规范就类似于通用Usb设备类的命令规范了。
3.3 测试复杂度给三个测试模块带来的压力
Usb协议规定一个Usb设备逻辑分层为:Usb deviceUsb configurationUsb interfaceUsb endpoint,从Usb device向下每一层都可以包含多个下一层结构,而Usb大多数应用都是采用单configuration,单interface下对应多endpoint的一般性配置结构。
从之前测试节点的分析来看,要完成对一个Usb设备,假定这个设备控制器设计上包含0~4五个端点,支持高速和全速传输,支持所有的传输模式以及相应的包大小,要实现完全覆盖测试,在设备驱动部分:如果采用一般性配置,单接口对应四个端点,并且对高速传输每种传输模式测试四种包大小,全速传输每种模式测试一种包大小,那么需要生成的驱动数目为(高速)((传输模式数目3)*(包大小种类4))+(全速)((传输模式数目3)*(包大小种类1))共15个,也就是说,需要编译至少15个二进制文件下载到测试目标板运行才能实现完全覆盖测试。
如果说设备驱动程序的数目已经说明了Usb控制器测试的复杂度,那么上层的Usb测试主机驱动和主机应用程序的开发则会更加复杂。因为要完整测试三种传输模式,如果采用单接口配置,那么需要准备三个主机驱动程序,每个驱动程序测试一种传输模式,而因为每个驱动程序均需要按照Usb设备的生产商id和产品id号分配DEFINE_GUID,一方面设备驱动向主机传送的产品id号需要按传输模式配置成三种,一方面主机应用程序与任一种主机驱动通讯时都要通过相应的DEFINE_GUID生成设备HANDLE,这样整个测试结构便如图3一样复杂。
4 Usb复合设备简化测试的讨论
如此复杂的测试结构必然带来更复杂的测试流程,对于一次流片几千片的产量不具有可实施性。分析测试复杂性原因,关键点在于设备的三种传输模式,当设备任一端点的传输模式确定后,在主机层,由于主机驱动的数据传输是通过Usb urb(即每次传输的数据块)的形式进行的,包大小和速度模式均与主机驱动无关,只要设计urb大小大于等于该速度和传输模式最大包大小就可以了,而对速度和包大小的测试完全可以通过主机命令的形式传递给设备驱动让设备驱动去设置。可以看出,问题的突破点在于能否让一个主机驱动集成三种传输模式,或者说,可以在三种传输模式中做任意选择。
因此考虑使用Usb协议的多接口特性,即Usb composite device(Usb复合设备),根据Usb协议的定义,一个Usb设备可以被配置成多个接口,而每个接口又可以配置成多个Alternate Setting,该特性体现到Usb设备枚举过程中传递的Usb描述符上就是Usb InterfaceAssociation描述符和Usb Interface描述符,InterfaceAssociation描述符中bInterfaceCount项告诉主机该设备接口数目,而Interface描述符中的bInterfaceNumber和bAlternateSetting分别告诉主机存在接口号为bInterfaceNumber和该接口下配置号为bAlternateSetting的配置。整个Usb设备枚举过程如下:Get Usb Device Desc(without Addr)–Set Addr–Get Usb Device Desc(with Addr–Get just Config Desc–Get All Config Desc(Config Desc+InterfaceAssociation Desc(告诉主机有4个接口)+Interface Desc(接口0,配置0)+Endpoint Desc(端点1,传输模式ISO)+Interface Desc(接口0,配置1)+Endpoint Desc(端点1,传输模式BULK)+Interface Desc(接口0,配置2)+Endpoint Desc(端点1,传输模式INTR)++Interface Desc(接口3,配置0)+Endpoint Desc(端点4,传输模式ISO)+Interface Desc(接口3,配置1)+Endpoint Desc(端点4,传输模式BULK)+Interface Desc(接口3,配置2)+Endpoin Desc(端点4,传输模式INTR)–[+Get String Desc]--Set Config。这样4个接口分别对应4个端点,而每个接口的三个配置分别对应需要测试的三种传输模式,当主机需要测试任一端点的任一种传输模式时,只需要发送Usb标准主机命令Set_interface让设备在驱动层调整寄存器配置满足相应传输模式,就可以进行数据传输测试。
设备驱动层的简化带来上层主机驱动结构的改变,最大的改善就是只需要一个主机驱动即可以实现覆盖测试了,这里要提到几个必需的ddk库函数:
1)KUsbLowerDevicE类中m_Lower.Initialize(this,Pdo),初始化一个KUsbLowerDevice类m_Lower;KUsbInterface类中的m_Interface.Initialize(KUsbLowerDevice,InterfaceNumber,ConfigurationValue,Initial Interface Alternate Setting),初始化一个KUsbInterface类m_Interface,接口号为InterfaceNumber,属于配置ConfigurationValue,初始化接口配置号是Initial Interface Alternate Setting;这几个函数都在在Usb主机驱动加载后即运行。
2)KUsbInterface类中的m_Interface.SelectAlternate(AlternateSetting),使能接口m_Interface的配置AlternateSetting。
在主机驱动初始化函数中,通过上述第一组函数创建并初始化四个接口类,那样就可以通过四个驱动操作码调用第二组函数对相应四个接口的配置进行选择,在主机应用程序上层,可以自行设计协商过程通过主机驱动对设备驱动进行操作,图4是一个自定义协商示例,当然开发者也可以根据自己的情况做相应调整。
如果按照这种测试方案,重新分析之前的Usb测试,测试四个端点,并且对高速传输每种传输模式测试四种包大小,全速传输每种模式测试一种包大小,整体测试程序架构就为:
设备驱动:1个;主机驱动:1个;应用程序:只需要从一个驱动classid创建驱动处理handler;
可见采用优化的方案后测试代码复杂度大大简化,实际操作性也得到了体现。
5 测试拓展分析
5.1 测试数据选择
Usb数据包传输过程中,实际最可能发生的是crc错误,Usb控制芯片开发中常常出现设备给主机发送数据或者设备从主机接收数据过程中crc16错误导致数据传输失败的情况,因此可以对包大小为PkgSz的数据传输准备(216*PkgSz)的数据,即从第1个包到第216个包的crc16结果可以顺序覆盖所有0到0xffff的数据,这样可以实现对Usb crc16的完全覆盖。
5.2 从测试功能向产品开发的实现
Usb composite设备实现测试的优势同样可以体现在产品的开发上,如果开发者用心设计测试主机的自定义协商过程,使其具备健壮性和可移植性,那么在产品开发时完全可以以测试架构为蓝本做进一步设计,这无疑缩短了产品开发的周期。
6 结论
成熟的产品开发需要完善的产品测试体系,Usb设备作为一种协议复杂,功能多样化的设备,如何实现对其功能性的完整测试是每个Usb开发者需要认真思考的问题,探讨应用Usb复合设备的概念简化了整个Usb测试的架构,为Windows测试平台上Usb测试提供了一个选择,而Linux平台上的测试方案,仍然值得去进一步探讨。
参考文献
[1]Intel,Lucent,Microsoft,NEC,Philips.Universal Serial Bus Specification Revision2.0[S].2000.
[2]Intel Corporation.USB Interface Association Descriptor Device Class Code and Use Model.Revision1.0[S].2003.
[3]Intel Corporation.USB ENGINEERING CHANGE NOTICE.Title:Interface Association Descriptors,Applies to:Universal Serial Bus Specification,Revision2.0[S].2004.
严控USB设备,还我数据安全 第4篇
注册表控制法
控制写入权限
为了防止他人随意修改保存在USB设备中的重要数据,我们可以修改系统注册表的相关键值,让普通用户只能访问USB设备中的数据内容,而不能随意改动其中的内容。
使用“Win+R”快捷键,打开系统“运行”文本框,输入“Regedit”命令,单击“确定”按钮后,开启注册表编辑器的运行状态。依次展开注册表编辑界面左侧的“HEKY_LOCAL_MACHINE\System\CurrentControlSet\Control\StorageDevicePolices”分支(如图1所示)。
在目标分支下手工创建一个双字节键值“WriteProtect”,同时将其数值调整为“1”,重新启动Windows系统,这样用户日后只能对接入的USB设备进行读取操作,而不能进行写入操作。当有用户悄悄修改USB设备中的重要数据时,系统会弹出“磁盘有写保护”之类的提示。
控制病毒运行
考虑到USB设备感染病毒、木马的现象十分普遍,为了防止保存有重要数据的USB设备,在插入计算机系统后,自动激活运行病毒、木马程序,从而引起泄密事件发生,我们必须主动出击,想办法控制USB设备中的病毒、木马程序自动发作运行,下面就是具体的控制步骤:
首先按照前面的操作,打开本地系统的注册表编辑窗口,在该窗口左侧显示区域,依次展开注册表分支HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2,用鼠标右键单击该分支选项,执行快捷菜单中的“权限”命令,切换到如图2所示的权限编辑对话框。
其次将这里所有用户账号的访问权限都调整为拒绝,再按F5功能键,刷新系统注册表,这样USB设备日后即使不小心感染了病毒、木马程序,它们在插入计算机时,其中的病毒、木马程序也会由于操作权限不足,而不能激活运行,那么保存在USB设备中的重要数据,也就不容易被病毒、木马程序破坏或泄露出去了。
倘若想控制USB设备中AutoRun病毒的自动运行时,只要打开系统注册表编辑界面,将鼠标定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer节点上,打开NoDriveTypeAutoRun键值的设置对话框,选中“十六进制”选项,并输入数值“4”,确认后保存设置操作,再刷新系统注册表即可。
隐藏设备分区
如果不希望用户访问USB设备中的重要数据时,可以尝试将本地硬盘分区之外的盘符全部隐藏起来,这样日后有人即使偷偷插入了USB设备,他们也不能从“我的电脑”或“计算机”窗口中,看到USB设备对应分区的“身影”。
首先执行“Regedit”命令,打开注册表编辑界面,找到该界面左侧中的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer节点选项,用鼠标右键单击目标节点,执行快捷菜单中的“新建”|“二进制值”命令,将新创建的键值取名为“NoDrives”,该键值默认数值为“00 00 00 00”(如图3所示),该数值表示不隐藏任何磁盘分区。
“NoDrives”的数值包含四个字节,每个字节的每一位数值控制着从“A”盘到“Z”盘的显示隐藏状态,当某个位数数值为“1”时,对应 磁盘分区就会被禁止显示。要是本地计算机硬盘包括C、D、E、F、G、H这几个分区,那么我们将“NoDrives”的数值设置为“02 ff ff ff”时,就能将B分区、I到Z分区隐藏起来,重新启动Windows系统,再插入USB设备时,我们将无法在“计算机”或“我的电脑”窗口中,找到USB设备所使用的磁盘分区,这样就不能访问到保存在该设备中的数据内容了。当然,通过计算机窗口的地址栏,输入USB设备的磁盘分区符号,还是能够访问到该设备中的内容,为此,我们还应该在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer节点选项下面,手工创建一个“NoViewOnDrive”二进制键值,同时将该键值数值也设置为“02 ff ff ff”,这样任何方式也不能访问到USB设备中的内容了。
组策略控制法
停用自动播放
当USB设备连接到本地计算机中时,Windows系统会自动打开对应设备窗口,以利于用户快速访问其中的文件。而USB设备自动打开窗口的过程,很容易被网络病毒利用,那么带毒的USB设备插入计算机时,既会将病毒传染给Windows系统,又容易引起重要数据泄密事件。所以,为了保护系统和重要数据的安全,我们可以停用所有磁盘分区的自动播放功能:
首先逐一点选“开始”|“运行”选项,切换到系统运行对话框,输入“gpedit.msc”命令并回车,弹出系统组策略编辑界面,找到该界面下的“本地计算机策略”|“计算机配置”|“管理模板”|“系统”节点,用鼠标双击目标节点下的“关闭自动播放”选项,展开如图4所示的组策略属性对话框。
其次选中这里的“已启用”选项,打开“关闭自动播放”下拉列表,将其中的“所有驱动器”选项选中,单击“确定”按钮保存设置操作,这样USB设备日后插入到本地计算机后,对应设备窗口就不会自动打开了,那么即使该设备中隐藏有病毒、木马程序,它们也没机会激活运行了。
限制样本病毒
很多病毒在恶意传播之前,一般都是先激活样本病毒程序,之后才会进行病毒传播扩散。根据这种病毒传播原则,我们可以上网查询病毒公告,及时获取那些利用USB设备传播的病毒程序样本,并下载获取对应病毒样本文件,再利用系统组策略设置,来限制样本病毒程序在本地计算机中自动运行,下面就是具体的操作步骤:
首先按照前面的操作步骤,展开系统组策略编辑界面,找到该界面左侧的“本地计算机策略”|“计算机配置”|“Windows设置”|“安全设置”|“软件限制策略”|“其他规则”节点,用鼠标右键单击目标节点选项,点击右键菜单中的“新散列规则”命令,弹出如图5所示的设置界面。
其次按下设置界面中的“浏览”按钮,切换到文件选择对话框,导入之前获取得到的样本病毒程序文件,这样Windows系统会智能生成文件散列号码,并且还会自动显示相关样本病毒文件的版本信息以及其他方面的状态信息,接着将样本病毒程序文件“安全级别”选择为“不允许”,确认后本地计算机就能自动预防新型的通过USB设备传播的病毒了,日后即使USB设备感染了样本病毒,也不会在本地系统中造成安全威胁,更不会发生由样本病毒引起的数据泄密现象。
隐藏访问分区
USB设备插入到计算机系统后,Windows系统分配给它的分区符号往往是固定的,如果能让特定的磁盘分区隐藏起来,那么普通用户就不能随意访问到对应设备中的数据内容了。要做到这一点,可以进行如下设置操作:
首先执行“gpedit.msc”命令,打开系统组策略编辑界面,找到该界面中的“本地计算机策略”|“用户配置”|“管理模板”|“Windows组件”|“Windows资源管理器”节点,用鼠标双击目标节点下的“防止从我的电脑访问驱动器”选项,展开如图6所示的组策略属性对话框。
其次选中“已启用”选项,点击“选择下列组合中的一个”位置处的下拉按钮,从下拉列表中选择特定磁盘分区,那么保存设置操作后,Windows系统虽然可以正确识别并安装USB设备驱动,但是在计算机窗口或我的电脑窗口却不能访问它们的内容。如果希望隐藏USB设备分区时,还要在“本地计算机策略”|“用户配置”|“管理模板”|“Windows组件”|“Windows资源管理器”节点下,启用并设置好“隐藏我的电脑中的这些指定的驱动器”组策略,这样用户就不能看到它们的“身影”了。
隐藏文件法
隐藏设备数据
保存在USB设备中的重要数据文件,如果被设置成隐藏属性,那么日后用户即使能进入USB设备窗口,也不能看到其中的数据文件。在隐藏设备数据文件时,先将USB设备正确插入到本地计算机中,进入计算机或我的电脑窗口,获取USB设备的分区名称,假设该分区为“F:”。接着依次点击“开始”|“运行”命令,弹出系统运行对话框,输入字符串命令“attrib F: +r +s +h /d /s”,单击“确定”按钮后,USB设备中的所有数据文件都会被设置成隐藏属性,普通用户是不能随意删除、更改数据文件的。
限制隐藏文件
将重要数据文件设置成隐藏性质,还不能保证其安全性,因为一些专业用户可以进入Windows系统的文件夹选项设置对话框,切换到查看标签页面,选中“显示所有文件”功能,就能访问到隐藏文件了。为了防止专业用户查看隐藏文件,我们还需要控制Windows系统,不让其显示隐藏文件,以达到彻底隐藏重要数据的目的。
使用“Win+R”快捷键,打开系统“运行”文本框,输入“Regedit”命令,单击“确定”按钮后,开启注册表编辑器的运行状态。依次展开注册表编辑界面左侧的“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL”分支(如图7所示)。
找到目标分支下的“CheckedValue”双字节键值,并用鼠标双击之,在其后界面中,将默认数值由“1”修改成“0”,刷新系统注册表后,即使普通用户进入查看选项设置页面,选中“显示所有文件”选项,Windows系统也不会将隐藏文件显示出来。
伪装数据文件夹
通过上面的隐藏方法,隐藏USB设备中的重要数据,会影响其他隐藏文件的读取与访问。其实,我们可以在USB设备根目录下面,任意创建一个文件夹,假设该文件夹名称为“aaa”,日后将所有重要数据全部保存到这里。之后通过修改扩展名,对“aaa”文件夹进行伪装操作,让其变成“我的电脑”之类的特殊文件夹,这样其他人双击该文件夹图标时,将无法看到隐藏在其中的重要数据内容,所以,这在某种程度上能保护USB设备中的数据内容。在进行伪装操作时,只要在“aaa”文件夹名称后面,手工添加“.{20D04FE0-3AEA-1069-A2D8-08002B30309D}”这样的扩展名即可。
隐藏分区符号
每个USB设备插入本地计算机后,Windows系统都会为它自动分配一个分区符号,如果隐藏该设备分区符号,那么其他用户打开计算机或我的电脑窗口后,就不能访问到USB设备,这样该设备中的数据也会很安全。在隐藏分区符号时,首先将USB设备插入到本地计算机中,当该设备被成功识别后,用鼠标右键系统桌面上的“计算机”图标,执行快捷菜单中的“管理”命令,切换到计算机管理窗口,将鼠标定位到“存储”|“磁盘管理”节点上,选中该节点下的USB设备图标,点击右键菜单中的“更改驱动器号和路径”命令,打开如图8所示的设置对话框,选中USB设备使用的分区符号,点击“删除”按钮,最后进行确认操作,这样就能将USB设备分区符号隐藏起来了。日后,如果我们自己想访问USB设备中的内容时,只要重新进入“更改驱动器号和路径”设置对话框,为USB设备分配好合适分区符号即可。
权限控制法
授权特定用户
保护USB设备重要数据的目的是防止外人访问,而不是防止自己使用,所以我们不妨利用NTFS的权限管理功能,来限制他人随意访问USB设备。首先检查系统分区的格式,倘若发现是FAT32格式时,那么可以依次点击“开始”|“运行”命令,打开系统运行对话框,输入“Convert c: /FS:NTFS”命令,单击“确定”按钮后,将系统分区C盘转换成NTFS格式。接着进入本地计算机的用户管理界面,在这里为可信任用户账户设置一个复杂的登录密码。
完成上面的准备工作后,打开系统资源管理器窗口,逐一展开“Windows”|“Inf”文件夹,找到其中的“Usbstor.pnf”文件,用鼠标右键单击该文件,执行快捷菜单中的“属性”命令,切换到对应文件属性界面,选择“安全”标签,在对应标签页面中将可信用户账户添加进来,并授予完全访问权限。
之后,将其它需要访问本地计算机,但是不允许使用USB设备的用户账户导入进来,同时将它们的访问权限都调整为“拒绝”,确认后执行设置保存操作,这样其他用户日后在尝试访问USB设备时,由于访问Usbstor.pnf文件时权限不足而受拒,从而保证了USB设备重要数据的安全。
控制访问权限
USB设备故障解决方案 第5篇
通用串行总线 (Universal Serial Bus USB) , 是一种快速、灵活的总线接口。与其它接口设备比较, USB设备的特点是易用性。作为一种高速总线接口, USB适用范围广, 例如DC、智能手机、打印机和高速数据采集设备等。易用性还表现在USB接口支持热插拔, 并且大部分配置过程都由系统自动完成, 无需人工操作。
在我们日常使用时会遇到以下USB设备故障:1) 系统无法识别USB设备容量;2) USB设备目录出现乱码;3) USB设备文件传输受限;4) “无法识别的设备”故障;5) 插入后不出现盘符故障;6) USB设备无法正常退出。
1 USB故障解决方案
1.1检测不到盘符
解决方法:
1) 原因可能系统设置不当所致
可以在设备管理器中双击移动硬盘图标, 并且点击弹出窗口中的“属性”按钮, 此时可以看见断开、可删除、同步数据传输和Int 13单元4个选项, 其中“可删除”一项前面系统默认是没有打钩的, 只要勾选这个选项之后并重新启动计算机, 就可以在资源管理器中看见新增的USB设备盘符了。
2) 写保护/不能写保护
解决方法:可能U盘中毒, U盘里有文件运行是无法格式化的。先手动把能删的东西全部删除, 剩下的你打开任务管理器的进程, 看看里面有哪些不明运行文件, 如果不认识你可以对应U盘里删除不掉的文件, 看它的文件名, 和进程里的一样的全部结束进程, 然后你就可以格式化了。格式化之后U盘不像硬盘, 格式化后能直接使用, 它必须使用U盘量产工具软件。
3) 提示是否要格式化
解决方法:U盘提示没有格式化, 但格式化时显示无法完成格式化, 首先确定的是你的U盘完好无损, 只是主控芯片的固件程序错误导致, 可以通过以下方法修复。
(1) 下载U盘检测软件并安装; (2) 将U盘连接电脑, 并运行软件, 在磁盘列表中选择U盘盘符就会显示U盘的详细信息; (3) 对应检测到的主控芯片型号, 下载对应量产工具, 进行量产后U盘就能够正常使用。
4) 无法格式化
解决方法:打开磁盘管理对话框, 在对应的U盘盘符上单击右键, 选择“初始化磁盘”。初始化完成后, U盘的状态变成为“联机”状态。注意此时U盘的锁要处于打开状态, 否则会出现提示:“由于媒体受写保护, 要求的操作无法完成。”按照默认设置对磁盘建立新分区并对其进行格式化。格式化完成后, U盘状态显示为“状态良好”。这种修复方法一般都能将U盘恢复。但此方法也有弊端, U盘上原有的数据不能保留。
5) 不识别设备 (有盘符不能读盘或者是乱码)
解决方法:造成这种问题的原因很多, 排除闪存盘本身的质量问题以外, 应着重检查BIOS中的相关选项是否已经打开 (注:由于主板差异性大, 各主板的BIOS设置选项可能略有出入) :On Chip USB设成Enabled;USB Controller设成Enabled;
6) 无法写入文件
解决方法:左键点击开始运行输入regedit注册表编辑器HKEY_LOCAL_MACHINESystemCurrent Control SetControlStorage Device Policies项目添加DWORD键值:“Write Protect”改1为0退出编辑。即已修复。
7) 不能读取文件
解决方法:造成这种问题的原因很多种。可以先确认下是否所有文件都不能读取。如果其他文件可以读取, 说明你的文件中毒, 用杀毒软件杀下毒。如果是所有文件都不能读取, 可能你的U盘损坏可以用用UMSD工具修复。
8) 无法复制或移动文件
解决方法:先使用杀毒软件查杀病毒, 若无病毒, 可以使用UMSD工具修复, 若不能修复, 责备可能已损坏。
9) windows无法识别可移动存储设备
解决方法:造成该故障的原因有:
(1) 是USB接口未开启, 某些型号的计算机USB接口在BIOS中默认是关闭的或者是用户误操作关闭了USB接口; (2) 是主机箱面板上的USB接口未连接到插口上。主机箱前面板上的USB接口是通过USB连接线进行连接的, 如果在装机过程中未连接, 或者是在使用过程中, 因震动等原因造成了连接松动, 很容易出现可移动存储设备无法识别的问题; (3) 是USB接口供电不足, 如果用户是通过USB延长线连接可移动存储设备, 那么则有可能是供电不足引起的可移动劾无法识别。
10) 无法向可移动存储设备传输文件
解决方法:在对移动设备进行数据读写时, 出现“windows延缓写入失败”的错误提示。这种情况大多出现在可移动存储设备与磁盘之间复制大文件时。造成这种故障的原因多半是连接可移动存储设备的数据线质量不好或者连接处松动, 也有可能是计算机向可移动存储设备供电不足造成的。首先考虑更换一根新的数据线试试, 再次可以启用可移动存储设备的后定高速缓存, 方法如下:在资源管理器中右击移动设备盘符, 选择属性, 然后在“硬件”标签中选择可移动设备盘符, 单击属性按钮, 在“策略”标签中选择“为提高性能而优化”选项, 确定即可。
这些是USB常见的问题, 随着计算机的不断发展和USB可移动设备的广泛应用, USB可移动设备方面的使用量将会越来越大, 并且其使用将是一件十分频繁和非常容易出错的事情。在这样的情况下有一个实用完善的USB可移动设备故障解决方案是有其必然性的, 一个USB可移动设备故障解决方案就使在发生故障, 解决故障方面的工作量减少很多。
参考文献
[1]薛园园.USB应用开发技术大全[M].人民邮电出版社.
USB设备枚举过程及代码设计 第6篇
1 基本概念
主机使用轮讯总线方式实现枚举,主机控制端口提出相应的请求,设备作出相应的处理,这就是主机和设备之间的枚举过程,这也是一个命令(请求)的过程。USB定义了一些命令,所有USB设备在设备缺省控制通道(EP0)处对主机命令发出响应。这些命令是通过使用控制传输来达到的,命令及命令的参数通过Setup包发向设备,由主机负责设置Setup包(8个字节)内的每个域的值。所有的USB设备都要对主机发给自己的命令作出响应,规范定义了11个标准命令:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。
下面将使用Le Cory捕捉一个带有USB接口的扫描枪设备(如超市使用的条码扫描枪)的总线处理图,对其枚举过程进行分析,同时给出其枚举代码。
1.1 类定义
1.1.1 枚举代码类
假设上层类Usb Debug已经完成了主机请求数据包的捕获,并放在Data_Packet Setup Data结构体中,而枚举信息则放入其包含的DEVICE_REQUEST Device Request结构体变量中,这个结构提变量包括bm Request Type(特定请求的特征)、b Request(特定请求)、w Value(传递参数给设备)、w Index(指定接口或端点)、w Length(控制传输的数据阶段中传输数据的字节大小)。
1.1.2 特定请求响应函数
Type为bm Request Type的bit[6:5],它表示了请求所属的类型,USB标准中定义了所有USB设备必须支持的标准请求,此外,群组和供应商还定义了一些其他的请求,函数只对标准请求进行处理,其它情况均返回STALL握手包,而不是ACK或者NAK包,表示没有能够识别该请求。Req表示执行get_status()、clear_feature()等中的哪个请求,从而进行处理。
1.2 过程分析与代码设计
图1是Le Croy USB总线分析仪捕获的USB总线处理过程,通过此图可以来帮助理解设备枚举代码是如何工作的。
1.2.1 插入设备并初始化
当主机用轮询方式检测到USB端口有新设备时,主机就会给HUB发送总线复位命令,要求复位,设备完成初始化。主机根据D+与D-之间的电压差识别是否有新设备接入,并根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)。主机使用缺省的CONTROL端点EP0(图1“ENDP”)向设备发送请求,最初向默认地址0(图1“ADDR”)发送请求。
1.2.2 复位
主机先发送Get_Descriptor-Device请求(图1Transfer 0),以确定设备EP0缓冲区的数据包最大长度(64字节)。然后主机发送总线复位(数据包76),对设备进行复位。这样便设置了USB总线复位IRQ和其寄存器位。而设备根据主机请求通过特定请求响应函数setup_handler选择进行相应类型的响应处理。
1.2.3 Set_Address
在Transfer 1中,主机使用Set_Address请求,给外设分配特定地址,将分配地址装入功能地址寄存器。以后设备只响应指向地址1的请求。在主机进行总线复位或者设备断开之前,这一地址始终保持有效。注意,Transfer 1之后,总线处理过程中的ADDR由0变成了1。
inline void Usb Enum::set_address(void){
enum_Bus State=USB_ADDR_ASSIGNED;//返回addressed state
Status Ack Stat(1);设置ACKSTAT位终止该请求}
如上代码,这是所有请求中最简单的请求,程序需要做的所有工作就是设置ACKSTAT位来终止请求。USB控制器会对其进行处理,它以新的地址自动更新内部地址寄存器,以后设备仅仅响应指向该地址的请求。如图2,它并没有像Get_Descriptor操作一样有个OUT操作。
1.2.4 Get_Descriptor
在Transfer 2至13中,主机请求各个描述符。设备需要从8个设置字节中确定发送哪个描述符,使用该信息来访问描述符数组之一,将这些字符装入端点FIFO,准备回送给主机。
图3展开了图1中的Transfer 7,展示了数据包层次的处理过程。
整段代码从取得描述符类型开始,后通过Switch语句选择相应操作。在此,主机要求64字节,但是程序仅回传了18字节。到底怎么回事?其实以上处理过程是很正常的USB事件,这是由一个简单的规则决定的,总是在(a)主机请求的字节数,以及(b)实际具有的字节数之间取较小的字节数目回送。一个设备描述符包括18个字节,而主机要求64个字节,因此固件正确地回送了18个字节,这在代码中也有所体现。而数据包的返回由data_transmit函数完成。
1.2.5 Get_Status
主机给设备挂载驱动,主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备。设备是通过get_status函数返回主机请求的描述符数据包。
需要返回的数据类型由bm Request Type字段的bit[4:0]决定指定。如代码,通过bit[4:0],决定返回设备、接口或端点之一的状态。而w Value和w Length必须为0和2,不然请求无效。
如果该设备以前在系统上成功枚举过,操作系统会根据以前记录的登记信息而非inf文件挂载驱动。当操作系统给设备指定了驱动之后,就由驱动来负责对设备的访问。
1.2.6 Set_Configuration
设备驱动选择一个配置,驱动根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置作为工作配置,设备通过如下的set_configuration代码实现。
该请求中的w Value域的低字节表示设置的值,如果设置值等于0,表示设备进入地址状态,如果w Value为1值,那么表示设备进入配置状态,进行相应得配置。
至此,设备处于配置状态,配置完成后设备可使用。
2 枚举出错问题解决
2.1 上电前设备枚举
扫描枪在PC启动前就通过USB接口连接在PC上,然后启动PC机,这样可能会枚举不成功,其实原因很简单,就是主机发送Get Descriptor请求给设备的时候设备还没上电,上电前插入的设备在Get Descriptor的时候会失败,失败后usb驱动会执行再继续进行尝试,在失败3次后端口失效,造成无法识别设备,这样的情况可以在驱动代码加个延时,延迟Get Descriptor的发送时间,这当然要根据每种类型的主板给USB的上电时间。
2.2 设备的特殊设置
在set_configuration时加入特殊操作时也会出现问题,譬如USB模拟RS232,并且模拟RTS电平,要求在插入设备时设备RTS拉高,即PC端CTS电平拉高,这主要适用于一些特殊要求,譬如说工厂需要根据CTS(设备RTS)信号是否为高来判断此设备是否安全连接在PC机上,拉高RTS可以在set_configuration进行操作,但必须在get_status执行之后,所以可以加个全局bool变量,在get_status成功后使其为true,然后在set_configuration中以这个全局变量的值作为RTS拉高这个操作的条件;如果不在get_status之后执行配置会导致枚举的失败。
3 结束语
分析了主机对USB设备枚举的全过程,并以C++类定义了USB设备枚举时所有响应主机请求的操作,可以作为USB驱动中枚举过程的一个通用接口。
摘要:USB枚举程序是USB设备固件程序的基础和核心,主要针对USB设备驱动的这一核心进行了研究。使用LeCroyUSB总线分析仪捕获了USB接口扫描枪总线处理过程图,通过解析此图从而详细分析了主机对USB设备枚举的全过程。并针对主机在枚举过程中每个不同请求,主要设计了设备如何响应这些请求的枚举代码框架,即枚举类,包括SetAddress、GetDescriptor、GetStatus、SetConfiguration等设备响应主机请求时进行的操作。与此同时,也分析了一些枚举出错的案例及可用解决方法。
关键词:USB,枚举,枚举代码,枚举出错,总线处理
参考文献
[1]陈启美,吴永辉,丁传锁,等.USB主机——硬件及软件[J].电力自动化设备,2001,21(6):55-58.
[2]陈启美,吴永辉,丁传锁,等.USB协议层[J].电力自动化设备,2001,21(5):59-63.
[3]程斓,杨子杰.基于PDIUSBD12的USB设备固件程序开发[J].计算机应用,2001,24(7):150-152.
[4]张希英,樊光辉,李传珍.USB通信技术[J].北京广播学院学报,2004,11(4):55-64.
[5]唐劲飞,可永敏,穆连运,等.基于Windows的USB设备开发[J].舰船电子工程,2009,29(11):140-142.
[6]张海峰,赵爱玲.USB总线的初始化分析[J].计算机网络与通信,2007,29(2):32-34.
[7]赵建领,薛园园.USB应用开发实例详解[M].北京:人民邮电出版社,2009.
USB设备驱动 第7篇
随着电子技术的不断进步,嵌入式Linux产品得到了广泛应用。作为一种方便快速稳定的接口通信模式,USB接口在嵌入式产品,如PDA和手机等中也得到了越来越广泛的应用。与主设备端的USB设备驱动程序不同,从设备的USB驱动程序称之为USB器件驱动程序。为了提供对USB器件驱动的支持,Linux提供了一组API函数支持,从而简化了作为USB从设备的嵌入式Linux系统USB驱动开发的难度。Linux-2.6.10同时提供了网络USB器件驱动程序、串口USB器件驱动程序等。但使用上述驱动在降低了从设备端USB器件驱动程序开发难度的同时,在Windows环境下,主设备端必须相应地开发USB网络驱动和USB串口驱动。相对于Linux的开发源代码,Windows环境下开发适合用户功能的驱动程序更为困难,从而对系统开发又提出了新的要求。本文介绍了字符设备USB器件驱动程序开发,通过将从设备设计成一个字符设备,降低了主设备端驱动的开发难度,从而加速了产品开发。
1 USB器件驱动程序软件系统框架
我们使用的硬件平台MPC8343的USB口提供了两种工作模式,MPH模式和DR模式。其中MPH模式用于主控制器工作模式,而DR模式能够工作在主模式、从设备模式或者OTG模式下。驱动程序需要控制MPC8343的一组DR控制寄存器以实现USB从设备工作模式以及接口控制。
Linux-2.6.10中
我们使用的嵌入式Linux-2.6.10开发包中提供了MPC8343的USB DR控制器驱动程序。该驱动程序提供对于USB底层传输控制寄存器操作支持,USB接收发送终端以及错误中断处理以及回调处理,DMA传输支持,同时提供对于MPC8343实现USB传输的数据结构端点队列头(Endpoint Queue Head)和端点传输描述表(Endpoint Transfer Descriptor)的队列建立、入队和出队操作支持,并通过指针赋值的形式将
在DR控制器驱动程序之上是用户的USB器件驱动程序,该驱动程序的任务包括定义设备描述符、接口描述符、端点描述符,以完成USB设备枚举过程,完成USB_gadget_driver结构体中函数指针的具体实现并初始化,完成USB数据发送接收回调返回函数以及提供对用户应用程序的调用接口。
2 USB字符设备驱动程序设计
USB字符设备驱动程序和网络USB器件驱动程序以及串口USB器件驱动程序的不同主要体现在提供给用户应用程序的调用接口设计上。加载了网络USB器件驱动程序之后对从设备端的上层应用而言,USB协议将不再对上层应用可见。对于从设备上层应用而言,该USB口就变成了网口。同样,加载了串口USB器件驱动程序以后,对应用而言即是串口。USB字符设备驱动程序的设计同样是对上层应用屏蔽USB接口协议,使得从设备端上层应用而言成为一个字符设备。
USB字符设备驱动程序主要完成USB_gadget_driver结构体中函数指针的具体实现并初始化,以及字符设备file_operations结构体中函数指针的具体实现和初始化。下面分成与DR驱动相关部分、和上层应用的字符设备接口以及设备的加载三部分予以介绍。
2.1 DR驱动相关部分
USB字符设备驱动程序中主要包含两个数据结构:USB_char_dev和USB_char_buf。其中USB_char_dev中主要定义了输入输出端点、接收和发送队列头、接收和发送缓冲区队列头以及USB设备状态等。USB_char_buf结构体中定义了输入输出缓冲区和一个队列头。
USB_char_dev结构体主要内容定义如下:
与DR驱动相关部分主要是实现结构体USB_gadget_driver的初始化如下,只列出了其中最重要的三个函数。
其中U S B_b i n d函数被D R驱动程序调用,实现USB_char_dev设备输入输出端点初始化,接收和发送队列头初始化,接收和发送缓冲区内存空间分配以及初始化入队操作,设置USB设备状态,同时设置USB回调函数,响应USB枚举过程中主机提出的各种设置。USB_unbind函数则完成U S B_b i n d函数中申请资源的释放工作。USB_setup函数则用来设置在数据包建立阶段对主机的所有通信命令的应答和解析工作,即完成设备的整个枚举过程。
2.2 与上层应用相关的字符设备驱动部分
与上层应用相关的字符设备驱动部分主要是完成字符设备文件结构file_operations中open、write和read等函数。字符设备打开操作定义为USB_open,首先判断USB设备的当前工作状态,如果设备当前没有连接则返回,否则将USB_bind中初始化分配的USB_char_dev指针赋值给文件的私有数据结构,并完成字符设备的其他操作。
字符设备"读"取操作定义为USB_read,主要功能是从文件私有结构中获取USB_char_dev设备指针,判断当前USB设备的连接以及工作状态,从空闲的接收队列中得到一个接收请求,同时从空闲的接收缓冲区中获取一个在USB_bind中预先分配的接收缓冲区,设置接收完成回调函数并将当前"读"请求送入到输出端点的请求队列中。当"读"请求的结果返回时将从USB端口中读取的数据拷贝到用户缓冲区并返回。
字符设备"写"操作定义为USB_write,主要功能是从文件私有结构中获取USB_char_dev设备指针,判断当前USB设备的连接以及工作状态,从空闲的发送队列中得到一个发送请求,同时从空闲的发送缓冲区中获取一个在USB_bind中预先分配的发送缓冲区,并将用户需要发送的数据拷贝到发送缓冲区,设置发送完成回调函数。
2.3 设备的加载
USB字符设备驱动程序定义成内核模块形式,主要完成设备驱动的注册。作为USB字
符设备驱动程序,它既是一个USB gadget驱动程序,同时对于从设备的上层应用而言又是一个字符设备驱动程序,因此在模块加载过程中既需要将其作为USB gadget设备驱动注册,也需要作为一个字符设备初始化并注册。模块初始化函数主要内容如下:
3 结论
本文主要介绍了基于MPC8343的Linux环境下USB gadget驱动程序软件的框架,并在此基础上设计实现了USB字符设备驱动程序,降低了主设备端USB驱动程序的编写难度,同时提供了较高的数据传输速度,经过实测,USB2.0接口环境下数据传输速率在50 Mb/s左右,基本满足了我们的传输速度要求。
参考文献
[1]CORBET J,et al.Linux设备驱动程序(第三版)[M].魏永明耿岳钟书毅,译.北京:中国电力出版社,2006.
带USB接口医疗设备的日常维护 第8篇
1设置BIOS
开机的时候按F2或者Del进入BIOS设置, 选择“Integrated Peripherals”选项, 展开后将“USB 1.1 Controller”和“USB 2.0 Controller”选项的属性设置为“Disabled”, 即可禁用USB接口, 并给BIOS设置一个密码, 这样使他人无法通过修改注册表使用USB设备。
该方法是完全禁止所有的USB接口的使用, 只能用在那些不需要用USB接口的医疗设备上, 该类设备得使用PS/2接口的鼠标、键盘, 如医生处方工作站、手术室中的腔镜图像工作站等。
2禁止USB存储设备的启动
先用Win键+R键打开“运行”窗口运行“regedit”命令后, Windows的注册表编辑器就打开了, 然后依次点击“HKEY_LOCAL_MACHINESYSTEMCurrentCntrolSetServicesUSBSTOR”项目, 在其右边的窗口双击“Start”的DWORD值, 在弹出的编辑对话框中将其数值数据修改为十六位进制数值“4”, 点击“确定”按钮, 并关闭注册表编辑器, 重新启动计算机, 使设置生效。重启后, 如有人将USB存储设备连接到计算机时, 虽然USB设备上的指示灯在正常闪烁, 但在资源管理器当中就是无法找到其盘符, 因此也就无法使用USB设备了。如果在设备维修维护需要使用USB存储设备时, 可将“Start”注册值由“4”改为“3”, 重新启动计算机, 即可使用USB设备。
该方法适用于Windows XP、Windows 2000、Windows 7操作系统, 可以禁止U盘或移动硬盘在医疗设备上使用, 杜绝重要信息的流失, 防止病毒的传播。
3有选择性地禁止安装USB驱动程序
在Windows XP/ 2000/ 7的资源管理器中, 进入到“系统盘:WINDOWSinf”或“系统盘:WINNTinf”目录中, 找到名为“Usbstor.pnf”的文件, 右键点击该文件, 在弹出菜单中选择“属性”, 点击切换到“安全”标签页, 在“组或用户名称”框中选中要禁止的用户组 (如是Windows 7应先选择“编辑”) , 接着在用户组的权限框中, 选中“完全控制”后面的“拒绝”复选框, 最后点击“确定”按钮。
再使用以上方法, 找到“Usbstor.inf”文件, 并在安全标签页中设置为拒绝该组的用户访问, 其操作过程同上。完成了以上设置后, 该组中的用户就无法安装USB设备驱动程序, 这样就无法使用USB设备。
该方法适用于在同一台设备上, 某些用户不必使用USB设备, 只纯粹在机器上操作;但又有些用户不得不使用USB接口传输数据, 这部分应严格控制用户的数量, 并要保证其所使用USB设备的安全性。
4直接拔掉USB连接线, USB接口就无法使用, 该方法的适用范围类似“设置BIOS”
USB设备驱动 第9篇
通用串行总线(Universal Serial Bus,USB)在USB-IF(USB Implementers Forum,USB实施者论坛,USB标准制定者组织)的治下,可谓是最成功的通用标准,特别是近两年来,SuperSpeed USB,也就是我们所俗称的USB 3.0(已改名为USB 3.1 Gen1)大提速,已经接近越过了高清视频这道槛,在最后一个没有侵入的领域向领导者发起了进攻。真正促使USB超越对手的两项重要标准/技术落地,即SuperSpeed+(俗称USB 3.1 Gen2,以下简称USB 3.1)和C型接口。有关USB新标准的演进过程,详见CHIP 7月刊《USB-C:终结USB杂乱无章的状况》一文的介绍。
通用性、高速度和供电能力是USB在每个时代都能脱颖而出的法宝,即便今天也是如此。USB-C接口的出现,一统大中小3种尺寸、AB两个类型的排列组合,接口无方向、线缆无方向甚至大小设备通吃,通用特性更加强大;速度是每代USB必提升的指标,3.0/3.1 Gen1就达到5Gb/s的水平,基本可以满足最苛刻的性能应用,而USB 3.1 Gen2再次倍增速度至10Gb/s,除了可应付SSD组成阵列之类的“变态”要求,更是打通了超高清视频这一领域,进而取代HDMI 2.0、DP 1.4和Thunderbolt 3.0这些昂贵的解决方案;USB从诞生之日起,就将供电特性与数据传输能力整合在一起,“剪断”了5V 500mA功耗下设备的电源线,如今通过USB Power Delivery特性实现多电压、最大100W的电力传输能力,从电线中解放主流个人设备。以上3个特性可以进行随意组合,令设备设计更加个性化、差异化。
当苹果用MacBook Pro大炫两个Thunderbolt性能优势的时候,质疑之声迭起,对大尺寸的笔记本电脑和台式电脑来说,接口数量往往是过剩的,因此菊花链串接多设备的优势难以体现。同样的问题也出现在USB接口上,理论上串接127个设备的情形根本不会出现在现实中。
但是,在机身越来越纤薄的智能手机和平板电脑上,情况就大有不同。就算是较小的Type A型USB接口,其外插头的尺寸也要达到4.5mm×12mm之巨,这才催生了MiniUSB和MicroUSB等几个小型化的接口标准。苹果率先在iOS设备上开始使用具有正反向通用特性的Lightning接口,USB却无动于衷。毕竟与两侧共16个针脚的Lightning接口相比,数据和供电同传的USB接口只有4个针脚,哪怕是速度提升到5Gb/s级别的USB 3.0接口也仅有9个针脚,因此USB低成本和通用性的优势被很好地延续至今。
4988元的起价不算高,配备Core m3处理器、4GB内存和128GB SSD。
然而,时代变了,USB 2.0的性能和供电能力已经难以满足主流移动设备的需要,MicroUSB 3.0只薄但很宽的造型令手机产品都望而却步,只有三星在Galaxy Note 3上稍作尝试。甩掉兼容性的包袱,USB-C保持了MicroUSB小巧的尺寸,以两侧对称布置的24个针脚实现了正反可插的特性,以及双倍速度、双倍供电等诱人特性,因此首先被电脑看中。第一代采用USB-C接口的产品代表机型就是苹果MacBook,它只有一个USB-C接口的设计被广为诟病,设备少、应用局限、扩展和充电冲突都是问题。
随着USB-C 3.1标准的正式落地,新一代的平板电脑开始集成两个甚至更多该接口,以取代诸如电源、视频输出和扩展等接口。
华为MateBook:接近成功的梦想
作为华为首款PC产品,推出伊始,MateBook就被寄予厚望。当喧嚣散去,回归平板电脑本质的MateBook仍能带给我们相当多的新意和打动,源自移动需求的设计初衷,让这款产品更加注重移动体验,性能、规格、功能等描述PC的文字对它略显苍白。
MateBook给人最大的外观差异化就是,采用整体包裹机身的键盘盖设计,让MateBook看起来更像是公文包,提升精致与商务感。不过这一切是有代价的,层层包裹后,让原本设计师绞尽脑汁控制644g重的主机,在附加507g的键盘盖之后,达到了1.15kg重,比12英寸的MacBook(920g)要重不少,已经接近常规12英寸轻薄笔记本电脑的参数。解决方案就是,用户也可以选择弃掉键盘盖来使用。
加上标配的二合一键盘保护套的MateBook更有商务范,扩展坞风格也保持一致。
除了键盘盖的包裹,小巧的扩展坞+触控笔“荷包”设计(254g重)也是吸引眼球之处,其具有5V/9V/12V等3种电压输出的智能电源适配器采用与机身相同的USB-C接口,同时白色的设计+质感不错宽线缆用料,都是讨人喜欢的细节之处。
和众多追求极致轻薄的平板/笔记本电脑一样,MateBook机身上也仅保留一个USB-C接口,接口扩展功能都交给了扩展坞,除了最高的Core m7处理器版本赠送外,其他版本均为选配,不过就实用功能上看,多花这588元还是很有必要的。这款扩展坞集合了包括标称0.5A/0.9A输出的USB 3.0接口、RJ-45网卡接口、仅供充电的USB-C接口,另一端还提供了HDMI、VGA等视频输出接口。除了USB-C扩展坞外,“荷包”中还带有一个USB-C转MicroUSB-B的转接线、USB-C转USB-B的转接头,以满足对各类USB设备的兼容能力;它同时还是电磁笔MatePen的笔袋,外出便携性很高,但如果能再将充电宝功能加入其中,则会令整体实用度再度提升。
任重道远
无论是MacBook还是MateBook,受限于偏消费的定位,在新技术、新特性引入时都有着较重的成本考虑因素,就是所谓的主流产品不激进。再加上它们都很轻薄,性能、供电等问题都不突出,因此USB 3.1的高速、USB Power Delivery的供电以及USB 4K显示输出等功能都缺失。
机房维护中的USB设备管理探索 第10篇
在机房的日常维护中,需要面对各种形式的病毒,这些病毒很多是通过U盘或移动硬盘传播的;此外,在计算机等级考试、职称计算机考试等上机类考试中,需要计算机管理屏蔽机房中的USB接口,防止考生通过U盘等存储设备舞弊,保证考试系统正常运行。在禁用USB接口的同时还需要考虑到不能影响USB接口的鼠标、打印机等。
1 通过BIOS禁用USB接口
根据主板的类型,按住键盘上的F2或Del键可以进入BIOS设置,选择“Integrated Peripherals”选项,打开后将其中的“USB1.1 Controller”和“USB 2.0 Contr01ler”选项的属性设置为“Disabled”,即可禁用USB接口。
这种方法的特点完全禁止了当前计算机的所有USB接口,这意味着连接到当前计算机USB接口的所有设备均不能使用了,包括移动存储设备U盘、打印机和USB接口的鼠标和键盘,所以应该谨慎使用这种方法。
2. 隐藏移动存储设备盘符
点击开始,打开运行,输入regedit命令,点击确定可以打开注册表编辑器,逐次展开[HKEY_CURRENT_USERsoftwareMicrosoftwindowsCurrentVersionPoliciesexplorer],点击右键新建一个二进制值“No Drives”,其缺省值均是00 00 00 00,这个值表示显示所有盘符。键值由四个字节组成,各个字节的每一位分别对应计算机中从A:到Z:的一个盘,当相应位取值为1时,隐藏计算机中相应的盘符。第一个字节代表从A到H的8个盘,即01为A盘,02为B盘,04为C盘依次类推,第二个字节表示I盘到P盘,第三个字节表示Q盘到X盘,第四个字节表示Y盘和Z盘。如果要隐藏C盘,就只需把键值改为04 00 00 00;如果要隐藏D盘,就将键值改为08 00 00 00;C盘和D盘同时隐藏,则改为0C 00 00 00。
假设机房的电脑分区情况如下:A:(3.5软盘)、C:、D:、E:、F:、G:、H:(光盘),那么将新建的“No Drives”值设为“02 ff ff ff”,就隐藏了B、I到Z盘。当重启计算机再插入U盘,那么在我的电脑列表里是看不到U盘盘符的,但如果在运行框里输入I:(U盘盘符),就可以访问U盘。因此,这种方法只是向用户屏蔽了盘符的显示,计算机管理员仍然可以利用这个特点私下使用。
3. 禁止安装USB驱动程序
打开Windows资源管理器中,切换到“C:windowsinf”目录,找到usbstor.pnf文件,右击这个文件,在弹出的快捷菜单中选择“属性”,切换到“安全”选项卡,在“组或用户名称”框中选中要禁止的用户组,然后在用户组的权限框中选择“拒绝”复选框,最后单击“确定”按钮。再以同样的方法,找到“usbstor inf”文件,同时在安全标签页中设置该组的用户访问权限为拒绝。这样设置后,该用户组中的用户就不能安装USB设备的驱动程序了,从而达到禁用USB设备的目的。
这种方法的特点是磁盘格式必须是NTFS文件系统才能使用访问控制列表(ACL),同时只针对在本机上没有使用过的USB存储设备,因为已经使用过的USB存储设备已经自动安装好了驱动程序。
4. 禁止U盘或移动硬盘的启动
点击开始,打开运行,输入regedit命令,点击确定可以打开注册表编辑器,逐次展开[HKEY_LOCAL_MACHINESYSTEM CurrentCntrolSetServicesUSBSTOR],在当前打开页面的右侧窗格中找到名为“Start”的DWORD值,Start键值是USB设备的工作状态开关,默认值为“3”表示手动,设置为“2”表示自动,设置为“4”表示停用。这里我们点键单击选择修改,在弹出的对话框中将其数值数据修改为十六位进制数值“4”。最后单击“确定”按钮同时关闭注册表,重启计算机,即可使设置生效。此时用户如果把USB存储设备插入到计算机上,虽然USB设备上的指示灯以正常状态在闪烁,但在资源管理器无法找到其盘符,这样也就无法使用USB存储设备了。
这里可以用一个脚本程序重启桌面进程刷新注册表,这样就不需要重启了,新建一个记事本,添加内容:taskkill/f/im explorer.exe&&start explorer.exe,将记事本保存为刷新注册表bat,运行即可。
这种方法的特点是:操作简单可行,只禁用存储设备,不涉及其他设备。
结语
本文通过设置注册表的特定键值,可以根据需要禁用或启用USB移动存储设备。利用VC写的程序可以快速修改机房的注册表配置并使之在windows环境下不用重启计算机即可运行。这在很大程度上简化了机房的USB设备管理工作,降低了管理人员的劳动强度,使工作效率得到了提高。
摘要:在机房管理过程中, 不可避免地涉及了反病毒工作, 其中U盘传播的病毒占了很大的比例;禁用U盘设备不仅能够防止病毒传播, 在各类上机考试中还有助于防止考生借助U盘或移动硬盘作弊, 提高考试系统的安全性。
USB设备驱动
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。