USB设备驱动

2024-05-19

USB设备驱动(精选十篇)

USB设备驱动 篇1

Linux是一种日趋成熟完善的操作系统, 其源代码公开、结构清晰、功能强大等特点而广泛使用, 越来越多的软硬件厂商开始使用Linux平台来开发自己的产品, 基于该平台的设备驱动程序的需求也愈来愈多[1,2]。

通用串行总线 (USB) 是一种外部总线结构, 特点是接口统一、易于使用、方便扩展、支持热插拔和即插即用[3,4]。Linux的2.6 内核支持USB2.0 规范。分析了Linux 中USB 协议的具体实现机制, 并开发了一个特定USB 设备驱动驱动程序。

1 USB体系结构和驱动层次

1.1 USB体系结构

USB总线体系结构采用分层的星型拓扑来结构连接所有设备, 包括主机、设备、连接三个部分, 最多支持7层如图1所示。USB主机完成主机和USB设备之间的数据传输, 在数据传输过程中处于主导地位, USB设备只能响应USB主机的命令。按照USB设备功能的不同, 可以分为两大类:USB集线器和USB功能设备[5]。USB集线器为USB主机连接多个功能设备提供了USB端口, 在USB系统中USB集线器可以级联5级。USB功能设备用于扩展USB主机的功能, 满足用户需求的独立外部设备。此外, USB总线拓扑结构中允许把USB集线器和USB功能设备组合在一起的复合设备出现。USB连接是指USB设备与主机连接及通信的方式, 包含总线拓扑、层次关系、数据流模型、USB调度等等。

1.2 USB驱动层次

在Linux系统中USB驱动层次如图2所示。

在主机侧, USB主机控制器驱动用于USB控制器来控制USB设备的行为, 而USB设备驱动控制USB设备与主机通信与设备通信的方式, 这两层是驱动程序主要实现的。USB核心在USB驱动程序开发中是非常重要的, 它实现的USB驱动管理和协议处理的主要工作。在USB核心中定义了一些重要的数据结构、宏和功能函数, 分别为USB设备驱动和USB主机驱动提供编写驱动程序的接口[6]。设备侧的驱动在USB固件中实现。

2 USB驱动程序结构

所有USB驱动程序都必须创建的主要结构体是struct usb_driver。该结构体必须由USB驱动程序来填写, 包括许多调用函数和变量, 它们向USB核心代码描述了USB驱动程序[7]。在<linux/usb.h>中的定义如下:

struct usb_driver {

struct module*owner;

const char*name;

const struct usb_device_id*id_table;

int (*probe) (struct usb_interface*intf,

const struct usb_device_id*id) ;

void (*disconnect) (struct

usb_interface*intf) ;

int (*ioctl) (struct usb_interface*intf,

unsigned int code, void*buf) ;

int (*suspend) (struct

usb_interface*intf u32 state) ;

int (*resume) (struct

usb_interface*intf) ;

};

主要的工作由probe () 和disconnect () 函数, 即探测和断开函数完成, 它们分别在设备被插入和拔出的时候被调用, 用于初始化和释放软硬件资源。对usb_driver的注册和注销通过这两个函数完成:

int usb_register (struct usb_driver

*new_driver) ;

void usb_deregister (struct usb_driver

*driver) ;

usb_driver起到了牵线的作用, 即在probe () 里注册设备, 在disconnect () 函数中注销设备, 原先对设备的注册和注销一般直接发生在模块加载和卸载函数中。

3 USB串口设备驱动程序的实现

USB设备驱动程序主要包含usb_driver结构体中的成员函数和tty_operations结构体中的操作。usb_driver结构体中最主要的函数探测和断开函数分别为usb_serial_probe () 和usb_serial_disconnect () 。USB串口设备驱动的tty_operations结构体封装了设备驱动的成分, 其结构体实例serial_ops定义如代码如下:

static struct tty_operations serial_ops = {

.open =serial_open,

.close =serial_close,

.write =serial_write,

.ioctl =serial_ioctl,

.set_termios =serial_set_termios,

.throttle =serial_throttle,

.unthrottle =serial_unthrottle,

.chars_in_buffer

=serial_chars_in_buffer, ……

};

它们实现了USB串口设备的打开、关闭、写、控制等各项功能, 是串口设备的各种操作可以得到执行。

4 结束语

Linux操作系统以其免费、源代码开放、效率高等特点, 广泛的应用于嵌入式系统中。USB的快速发展使其不断取代了串并口等传统外部接口成为外部设备与PC之间数据传输的主要通道。本文的对USB驱动程序的研究和开发对Linux嵌入式系统开发有一定的参考。

参考文献

[1]陈胤.Linux操作系统的应用现状和推广策略[J].计算机时代, 2006 (4) :42-44.

[2]宋磊, 甄奇, 张涛.一种基于Linux的嵌入式软件开发支撑环境[J].军事通信技术, 2008, 28:1-5.

[3]肖踞雄, 翁铁成, 宋中庆.USB技术及应用设计[M].北京:清华大学出版社, 2003:4-9.

[4]杨伟, 刘强, 顾新.Linux下USB设备驱动研究与开发[J].计算机工程, 2006, 32 (19) :283-284.

[5]马尾.计算机USB系统原理及主从机设计[M].北京:北京航空航天大学出版社, 2004:172-187.

[6]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社, 2008:563-564.

USB设备配置简介 篇2

一个USB设备可以有几种配置。比如,一个最大需求200mA电流的设备和一个总线供电的LJSB设备相连时,它只能获得100mA电流。在这种情况下,这个设备就不被支持,主机软件也不会激活这个设备。为了避免出现这个情况,设备的设计者可以提供一种可选的配置,把设备对总线电流量的要求减少到100mA(当然,应采取措施保证在100mA时也能工作,比如,关闭某些功能)。

一个USB设备可以有几个接口。比如,USB数字电话有两个接口:音频接口(发送器和接收器)和人机接口(拨号装置)。又如,CD-ROM有三个接口:音频接口、视频接口和大容量存储接口。在USB系统中,一个接口实现一种功能。也可反过来说,设备中具有某种独立功能的部分构成一个接口。

端点的概念在前面已经提到,端点是主机和设备之间通信流的终点。比如,设备的一个输出寄存器就是一个输出端点。一个设备可以有多个端点,而端点总是属于某个接口的,这是因为端点是根据接口的需要设置的,一个接口可以有多个端点,

认识了USB设备的逻辑构成,就可以扫描一下USB设备的描述符。在USB系统中,设备的描述符包括:

①设备描述符:每个设备有一个设备描述符,它包含了设备的一般信息,并且标出了一个设备所支持的可能的配置的数量(一个或几个)。此外,它还包含了缺省通信管道(端点0)的信息。

②配置描述符:一个设备对它所支持的每一种配置都有一个配置描述符。它包括关于配置的一般信息,并且定义了当使用这些配置时的接口数量。

③接口描述符:提供了关于接口的一般信息,也指出了特定的接口所支持设备类。此外,它还指出了该接口进行通信时所使用的端点描述符的数量。

④端点描述符:一个端点描述符定义了一个通信点。端点描述符包含了一些信息,例如,端点支持的传输类型(指块传输、中断传输、等时传输和控制传输)以及支持的最高传输速率。

⑤字符串描述符:可选的描述符,由UNICODE(统一字符编码标准,用16位二进制数表示一个字符)字符串组成。它提供了那些可显示出来供人们读取的信息。可以为制造商、产品、序列号、配置和接口等定义字符串描述符。例如,为某个接口定义一个字符串描述符,并在接口描述符中设置指向该字符串描述符的指针。这样,可显示出与这个接口有关的说明信息。

⑥设备类定义描述符:可用来定义新的设备类,以便在标准设备类的基础上增加一些新的功能。

轻松掌控USB设备 篇3

优盘装不了大容量文件

将保存在计算机系统中的文件,拷贝到优盘之类的USB设备中,可以说操作很简单,只要用鼠标将目标文件从计算机硬盘中拖放到优盘中即可。可是,最近小张却遇到难题了,他想用优盘到同事的计算机中复制一个3GB左右的高清电影时,却怎么操作都不成功。同事说他的优盘可能使用了不合适的分区格式,必须使用NTFS分区格式,才能支持2GB以上大小的文件传输。小张认为这不是多大难事,恰好自己的优盘没有保存重要数据,直接使用NTFS分区格式对优盘进行格式化,不就解决问题了嘛!

想到做到,小张立即将优盘插入到同事的Vista系统中,双击系统桌面上的“计算机”图标,用鼠标右键单击其后界面中的优盘分区图标,选择右键菜单中的“属性”命令,切换到优盘设备属性对话框,点击“常规”标签,在对应标签页面中发现优盘当前的分区格式真的是FAT32文件系统。返回优盘的右键菜单,执行“格式化”命令后,看到格式化对话框的“文件系统”位置处,只有FAT、FAT32这两种分区格式,而没有自己熟悉的NTFS分区格式。那怎样才能将优盘格式化成NTFS分区格式,从而成功复制大容量文件呢?

几番尝试后,小张一脸茫然,不知道如何是好。毫无头绪之际,用手机将笔者呼了过来。经过一阵摸索,笔者很轻松地解决了问题,下面就是具体解决问题的步骤:

首先进入Vista系统的计算机窗口,找到优盘分区图标,并用鼠标右键单击该图标,执行右键菜单中的“属性”命令,进入优盘设备的属性对话框,点击“硬件”标签,切换到如图1所示的标签设置页面。

其次在“所有磁盘驱动器”列表中,选中与目标优盘设备相对应的名称,按下“属性”按钮,展开优盘硬件属性设置框,选择“策略”标签,展开策略标签设置页面,检查这里的“为提高性能而优化”选项是否处于选中状态,如果发现其没有被选中时,应该及时重新选中它,再单击“确定”按钮保存设置操作。

接着重新启动Vista系统,再次进入计算机窗口,用鼠标右键单击目标优盘分区图标,执行“格式化”命令,这次终于能看到NTFS分区格式选项了。在将优盘成功格式化成NTFS文件系统后,尝试将计算机系统中的大容量高清电影直接拖放到优盘窗口后,系统并没有出现错误提示,一段时间后,文件传输操作结束,这意味着优盘已经能够成功装载大容量文件了。

USB设备的管理另有他途

在计算机系统中使用USB设备是件很平常的事情,用常规的方法访问移动硬盘中的文件,或对移动硬盘执行卸载操作,是十分麻烦的。特别是在计算机系统连接多个USB设备的情况下,要将某个移动设备弹出来,需要经过几个环节才能完成,弹出的USB设备要是没有及时拔出来,再次要访问的话,还需要拔出后重新插上。对于频繁要使用USB设备的用户来说,如何才能对这些设备进行高效管理呢?

其实,巧妙使用外力工具“高级USB管理工具”,就能轻松实现一键管理USB设备的目的。将“高级USB管理工具”下载安装到本地计算机系统,插入USB设备后,用鼠标单击系统托盘区域处的控制图标,弹出USB设备列表(如图2所示),选中其中的目标设备选项,再单击之后的“浏览设备驱动器”按钮,就能访问指定USB设备中的文件内容了。

在访问完USB设备后,用常规的方法将其从系统中卸载掉时,往往要经过好几个步骤,现在有了“高级USB管理工具”后就方便多了。用鼠标单击系统托盘区域处的控制图标,从弹出的USB设备列表中,选择目标USB设备,执行“设备现在可以安全移除”命令,此时就能安全地将USB设备从系统中拔除出来了。

倘若USB设备已经被成功卸载,但是还没有从计算机系统中拔出来时,我们又突然改变注意,想要再次访问USB设备时,根本没有必要再将设备拔出、插入,只要用鼠标再次点击系统托盘区域处的控制图标,从弹出的USB设备列表中,选择已经卸载的USB设备,就可以将其工作状态恢复正常了。如果想提高管理效率,我们还能对专门的USB设备定义恢复、卸载功能键,要做到这一点,可以用鼠标选中USB设备列表中的特定设备,按下对应盘符下的“菜单”按钮,从中逐一点选“设置属性”|“设备管理”选项,将其后界面中的“使用单独的全局热键停止该设备”选项,再设置好合适的调用功能键,最后单击“确定”按钮保存设置操作。日后,只要插入特定的USB设备,就能使用事先指定的功能热键来卸载或恢复该设备了,整个过程不会对其他USB设备的工作造成任何影响。倘若我们有多个USB设备需要恢复、卸载时,可以按照上面的操作方法为它们依次设置好各自的调用功能键,以提高USB设备管理效率。

现在,不少用户已经不仅仅在本地调用USB设备了,他们常常会将一些重要数据文件保存到USB设备上,然后通过Internet或局域网进行异地访问或办公,此时借助“高级USB管理工具”,就能轻松实现一键运行USB设备中的应用程序。在进行这种管理操作时,可以先用鼠标点击系统托盘区域处的控制图标,从弹出的USB设备列表中,选择特定USB设备,按下“快速启动菜单”按钮,点击“添加程序”命令,定位到特定USB设备中某个应用程序的主执行文件上,按下“确定”按钮,日后只要插入特定USB设备,就能从快速启动菜单中看到之前定位的应用程序名称,点击该程序名称后,就能达到快速启动应用程序的目的了。

USB设备上有黄色感叹号

有的时候,USB设备插入到Windows 7系统环境下,对应设备不能正常工作。用鼠标右键单击系统桌面上的“计算机”图标,执行“管理”命令,展开计算机管理窗口,选中设备管理器分支,切换到系统设备管理器窗口时,会发现USB设备上有黄色感叹号标志,同时设备名称变成了“USB Device”,很多菜鸟用户对该现象不知道如何应对。

事实上,当系统设备管理器窗口的设备名称上出现黄色感叹号标志时,往往都是由于设备驱动程序发生了错误所造成的。对待这类问题,往往可以按照下面的操作步骤来解决:

首先可以选中设备管理器窗口中不能正常工作的USB设备,用鼠标右键单击该设备,执行右键菜单中的“卸载”命令,将目标设备从系统中卸载干净,之后执行右键菜单中的“刷新”命令,将系统设备列表刷新一下,这样Windows 7系统就能自动重新安装USB设备的驱动程序了。

倘若Windows系统无法自动搜索到USB设备的驱动程序,不妨利用Windows系统的补丁升级功能,来自动搜索匹配合适的设备驱动程序,成功安装后就能恢复USB设备的正常工作状态了。

当然,如果从网上无法搜索到相匹配的设备驱动程序时,我们可以采用手工方法,下载与Windows 7系统相兼容的设备驱动程序,比方说,某个USB设备只有Vista系统下的驱动程序,而没有Windows 7系统下的驱动程序,此时手工下载好适合Vista系统的驱动文件。接着,用鼠标右键单击出现问题的USB设备,点击右键菜单中的“属性”命令,弹出目标设备的属性对话框,选择“驱动程序”标签,切换到如图3所示的标签设置页面,单击“更新驱动程序”按钮,打开驱动文件选择对话框,导入之前下载好的驱动文件,按下“确定”按钮,完成设备驱动程序的更新操作,这样USB设备就能正常工作了。

USB设备数据不能访问时

在频繁插拔之后,USB设备很容易出现数据内容无法访问的问题。这不,小杨最近遇到一则问题,就是将USB设备连接到计算机系统的USB接口中后,尽管Windows系统能够正常识别出对应USB设备的分区符号,不过用鼠标双击该分区符号后,他看到该设备没有响应,再次双击鼠标时,系统弹出了无法访问的错误提示。见到这样的提示,小杨身上惊出了一声冷汗,毕竟他的USB设备中保存了太多的单位工作文档,这该如何是好啊?

为了不让数据丢失,小杨请来了笔者。对于这样的问题,在笔者看来基本就是小菜一碟,因为每年笔者总要处理好几起同样的USB设备无法读取问题。在处理这类问题时,笔者先从网上下载专业磁盘管理工具DiskGenius,使用WinRAR之类的解压工具将其释放到临时文件夹中,双击该文件夹中DiskGenius工具的主执行文件,切换到对应程序主操作界面。在该界面左侧列表区域,就能直观地看到所有磁盘分区的详细信息,其中包括已经连接到计算机系统中的USB设备对应分区符号。

接着用鼠标左键单击USB设备对应分区图标,这时DiskGenius工具就会自动强制访问USB设备中的目录分支,从该分支下面找到保存在USB设备中的重要文件或文件夹内容,然后用鼠标右键单击目标文件或文件夹,选择右键菜单中的“复制到”命令,弹出文件或文件夹保存对话框,设置好保存路径后,DiskGenius工具就能自动将USB设备中的重要文件或文件夹内容拷贝到指定路径。

倘若USB设备中的数据文件已经受到损坏而无法移动时,不妨用鼠标右键单击指定的USB设备,执行右键菜单中的“已删除或格式化的文件恢复”命令(如图4所示),这样DiskGenius工具就能自动恢复USB设备中受损的数据文件,当然数据恢复操作进程相当缓慢,可能需要等待很长时间,这点一定要有心理准备。如果数据受损程度非常严重,DiskGenius工具也有可能不会将USB设备中的数据恢复成功。

远程桌面不能连接USB设备

为了提高访问效率,有的用户可能会利用Windows系统内置远程桌面连接程序,来远程访问局域网中的共享资源。在远程桌面连接共享资源时,一般都要对保存共享资源的有关设备进行重定向。要做到这一点很容易,只要逐一点选“开始”|“程序”|“附件”|“远程桌面连接”选项,切换到远程桌面连接对话框,按下“选项”按钮,展开远程桌面连接设置区域,选择“本地资源”选项卡,在对应选项设置页面的“本地设备和资源”位置处,选中磁盘驱动器或打印机等选项,日后当远程桌面连接成功后,磁盘驱动器或打印机设备就会被自动重定向到远程主机系统中,这么一来用户就能轻松在远程系统中访问本地共享资源了。

可是,远程桌面连接程序并不支持USB设备的重定向功能,也就是说,当我们尝试从局域网的其他计算机系统中远程访问本地计算机USB设备中的共享资源时,是无法实现的。在USB设备应用日益广泛的今天,如何才能解决远程桌面程序不能连接USB设备的问题呢?

经过上网搜索相关信息,笔者终于找到了解决方案,巧妙使用专业工具USB For Remote Desktop,就能很方便通过远程桌面程序访问USB设备中的共享资源,当然该工具有客户端、服务端版本之分。

为了通过远程桌面连接程序访问本地计算机中的USB设备,首先要从网络上下载获取USB For Remote Desktop客户端程序,按照默认设置将其正确安装到本地系统中,之后从系统“开始”菜单中点击“USB For Remote Desktop(workstation)”选项,来打开USB For Remote Desktop工具的客户端程序界面,如图5所示。选择这里的“My Computer”分支,在该分支下面就能看到连接到本地计算机中的所有USB设备,选中需要让人远程访问的某个USB设备,再从菜单栏中逐一点选“USB Device”|“Redirect”命令,稍微等一会儿,指定USB设备图标上就会弹出绿色感叹号标志,这说明重定向USB设备操作已经成功,这时指定USB设备已经能被远程系统识别到了。要是点击了“Redirect”命令后,指定USB设备图标上弹出红色感叹号标志时,就意味着重定向操作没有成功。

当然,为了提高操作效率,我们可以对USB For Remote Desktop客户端程序进行合适设置,让特定USB设备能够实现自动重定向目的。只要逐一点选主程序界面中的“Settings”|“Preferences”选项,切换到参数设置对话框,选择“Auto-Redirecting”选项卡,打开如图6所示的选项设置页面,将这里的“Enable auto-redirecting of USB devices”选中,按下“确定”按钮返回,这样接到本地计算机中的USB设备就能自动被重定向了。如果不想将某些USB设备自动设置成重定向状态时,不妨选中“do not redirect these devices”列表中的特定USB设备,那样一来该USB设备就不会被自动重定向了。

当完成USB设备的重定向操作后,下面我们就能在其他计算机系统中通过USB For Remote Desktop服务端程序,与客户端系统成功建立远程桌面连接,并通过远程连接访问USB设备中的共享资源了。启动运行USB For Remote Desktop服务端程序,在“Terminal Server”列表中找到连接在客户端系统中的USB设备,接着打开计算机窗口,就能象访问本地文件一样来远程访问USB设备中的共享文件了。

USB设备驱动 篇4

通用串行总线(USB)是一种广泛应用的计算机外围串行通信标准接口,与常用的计算机接口(如串口、并口等)相比,USB具有热插拔、即插即用、数据传输可靠、扩展方便、低成本等优点。USB技术从问世以来便得到了广泛的应用,成为当前计算机及嵌入式设备必备的接口之一。

随着无线通信数据传输速率的不断提高,最高可达2Mbps,串口通信(波特率为115200)逐渐不能满足测试系统的要求,因此将原有的串口通信移植为基于USB接口的通信方式,可以有效的提高数据传输速率,提升测试的效率。

1 ZX2930 EVB2.0板和USB通信系统的组成

ZX2930 EVB2.0板是一款专用于测试ZX2930数字基带芯片的数据源板,其主要由RF模块、ABB模块、电源管理模块以及数字基带ZX2930模块等部分组成,其原理框图如图2所示。

为了对数字基带ZX2930的工作参数进行测试,需要建立ZX2930与PC机之间的通信,其通信原理框图如图3所示,目前,ZX2930与PC机之间已成功建立了串口通信,然而随着数据业务的速率不断提高,急需将原有的串口通信由现有的USB通信所替代,因此研究基于vxworks的USB设备驱动有着深刻的现实意义。

2 USB设备驱动的初始化

USB设备驱动的初始化主要用于完成对USB PHY、USB设备中断寄存器以及USB发送FIFO和接收FIFO的清空等操作。针对与EVB2.0板来说,USB设备驱动初始化主要包括USB PHY的初始化,USB复用管脚的配置、USB发送中断寄存器的配置、USB接收中断寄存器的配置以及相应接收端点FIFO的清空和发送端点FIFO的清空等。其流程图如图4所示。

3 USB设备的中断服务

USB设备的中断服务程序主要用于处理PC机与USB设备通信过程中的各种中断,包括USB中断,端口0中断,发送中断intTx,接收中断intRx及DMA中断等。其中USB中断又分为:RESET中断,RESUME中断,SUSPEND中断和DIS-CONNECT中断等。其中SUSPEND中断是为了USB设备节能而专门设定的,当USB设备3ms没有工作,则USB设备自动进入SUSPEND状态。端口0中断主要用于建立PC机与USB设备之间的通信枚举以及处理控制传输过程中PC机向USB设备发送的控制指令和USB设备的返回指令等;发送中断inTx主要用于处理当USB设备将数据写满发送FIFO时,所产生通知PC机取数据的中断;接收中断inRx主要用于当PC机将数据写满接收FIFO时,所产生的通知USB设备取数据的中断。其中端口0中断服务程序是建立PC机与USB设备通信的关键,其不仅要完成PC机与USB设备通信过程中的枚举任务,而且还要完成控制传输过程中PC机向USB设备发送控制指令和USB设备向PC机发送返回指令等任务。其中断服务流程图如图5所示。由USB2.0的协议可知,PC机与USB设备的枚举过程主要分为以下几步[2]:

1)由图5可知,当USB HOST的D+和D-数据线上检测到有高电平产生时,便预示着有USB设备连接到了USB总线上。此时USB总线设备处于加电状态,除EP0端点外,其他所有的端口暂时都是无效的。除此之外,电流限制器防止USB设备从USB总线上汲取的电流大于100mA。

2)USB HOST在USB设备连接到总线上100ms后(等待电源稳定),通过USB总线向USB设备发送使能和复位命令。

3)当复位命令持续10ms撤消后,USB端口已经有效,这时USB设备处于缺省状态,并且可从VBUS上汲取小于100mA的电流,所有设备寄存器及状态已被复位。设备可对缺省地址产生响应。

4)Get_Device_Descriptor:PC主机首次使用该指令,查询接入USB总线的是什么样的设备。

5)Set_Address:PC主机分配一个IO地址给新连接的IO设备。

6)Get_Device_Descriptor:PC主机再次使用该命令,进而寻求新的地址。此时它应该得到与步骤4相同的响应,如果得到的是不相同的响应或者超时,则表明有错误产生。

7)Get_Configuration_Descriptor:设备驱动程序开始收集关于设备的信息,它的接口和端点。

8)USB HOST选择设备驱动程序。

9)Set_Cnfiguration:主机激活USB设备,此刻USB枚举正式完成。

根据PC机与USB设备枚举过程中所发送和接收的指令中是否包含数据位,可将USB设备的枚举过程的指令分为3类:

零数据请求指令(set feature,clear feature,set address,set configuration,set interface)等。特点:所有信息都包含在指令中。

写数据请求指令(set descriptor)。特点:指令后紧跟数据。

读数据请求指令(Get configuration,Get interface,Get descriptor,Get status,sync frame)。

4 PC对USB设备的读操作

根据USB协议[3]的规定,USB主机与USB设备之间共有4种不同类型的事务处理:控制传输、块传输、中断传输和同步传输。其中控制传输主要在枚举过程中进行,中断传输主要针对鼠标和键盘等低速设备、而同步传输主要针对于扬声器等对实时性要求高的设备,本文讨论的ZX2930 EVB2.0板与PC机之间的通信主要确保传送的质量,以及传送的数据量,因此在此重点讨论PC与USB设备之间的块传输方式。

在块传输方式下,PC对USB设备的读操作与控制传输过程中的Tx mode状态类似,当数据准备好后,数据将被写入发送FIFO中,并置位TxPktRdy数据位。当PC机取走该数据后,USB设备控制器将自动清零TxPktRdy位,这样下一个数据包便可以被写入发送FIFO中。通常情况下,数据包的大小不能超过TxMaxP寄存器中的值(该值与设备描述符中的wMaxPacketSize一致),当传递的数据包超过TxMaxP寄存器中的值时,则要按照多个USB数据包来传送,每个USB的数据包的大小依然是固定的TxMaxP,当USB数据包的长度小于TxMaxP时,则预示着数据传送的结束。当最后一个USB数据包的大小刚好是TxMaxP时,则由USB设备再自动重发一个NULL包,进而预示着数据传送的结束。

5 PC对USB设备的写操作

在块传输方式下,PC对USB设备的写操作与PC对USB设备的读操作类似,当有数据写入Rx端点的FIFO时,USB设备控制器将自动置位RxPktRdy位,进而触发Rx中断,通知USB设备从FIFO中读取数据。在USB设备从FIFO中读取数据之前,USB设备首先读取RxCount寄存器中的值,进而决定读取多少数据量,当USB设备从FIFO中读取完数据之后,USB设备清除RxPktRdy位,进而通知PC机可以继续向Rx端点的FIFO中写数据。通常情况下,接收到的数据包的大小不能超过RxMaxP中的值(该值与设备描述符中的wMaxPacketSize一致),当传递的数据包超过RxMaxP中的值时,则要按照多个USB数据包来传送,每个USB数据包的大小依然是固定的RxMaxP,当USB设备接收到的数据包的长度小于RxMaxP时,则预示着数据传送的结束,当最后一个数据包的大小刚好是RxMaxP时,则由USB主机再自动重发一个NULL包,进而预示着数据传送的结束。

6 结论

结合USB的协议规范和USB设备驱动器的工作特点,编写基于Vxworks的USB设备驱动,并对之进行压力测试,测试结果显示该USB设备可以准确、及时的接收PC机发送给USB设备的每位数据,其数据传送速率平均可达633kbps,明显优于目前使用的串口115kbps。

根据USB2.0协议的规定,当USB设备工作在full speed模式下时,数据传输速率理论上可达12Mbps,目前实际测得的数据传送速率与理论值还有一定差距,该问题有待下一步深入研究。

参考文献

[1]李忠民.ARM嵌入式VxWorks实践教程[M].北京:航空航天大学出版社,2006.

[2]张弘.USB接口设计[M].西安:西安:西安电子科技大学出版社,2003.

无法识别USB设备故障原因 篇5

出现无法识别现象的原因一般是由以下几个方面所造成的:一是 USB 接口电压不足。这种 故障通常存在于移动硬盘身上,当把移动硬盘接在前置 USB 口上时就有可能发生系统无法 识别出设备的故障,原因是移动硬盘 功率比较大要求电压相对比较严格,前置的 USB 接 口是通过线缆连接到机箱上的,在传输时便会消耗大掉的电压,因此,在使用移动硬盘时,要注意尽量接在后置 主板自带的 USB 接口上,否则也可以通过外接的电源适配器来提供 单独供电。当然,在一些老的主板上,必须要使用独立供电才能供正常使用 USB 设备。二 是前置 USB 线接错。当主板上的 USB 线和机箱上的前置 USB 接口对应相接时把正负接反 就会发生这类故障,这也是相当危险的,因为正负接反很可能会 使得 USB 设备烧毁,严 重还会烧毁主板。三是主板和系统的兼容性问题。这类故障中最著名的就是 NF2 主板与 USB 的兼容性问题。假如你是在 NF2 的主板上 碰到这个问题的话,则可以先安装最新的 nForce2 专用 USB2.0 驱动和补丁、最新的主板补丁和操作系统补丁,还是不行的话尝试着刷新一下 主板的 BIOS 一般都能解决。四是系统或 BIOS 问题。当你在 BIOS 或操作系统中禁用了 USB 时就会发生 USB 设备无法在系统中识别。解决方法是开启与 USB 设备相关的选项。

二、U 盘插入电脑,提示“无法识别的设备”故障维修思路:对于此现象,首先的一点说明 U 盘的电路基本正常,而只是跟电脑通信方面有故障,而对于通信方面有以下几点要检查:(1)U 盘接口电路,此电路没有什么特别元件就是两根数据线 D+ D-,所以在检查此电路时只要 测量数据线到主控之间的线路是否正常即可,一般都在数据线与主控电路之间会串接两个小 阻值的电阻,以起到保护的作用,所以要检查这两个电阻的阻值是否正常。(2)时钟电路,因 U 盘与电脑进行通信要在一定的频率下进行,如果 U 盘的工作频率和电脑不能同步,那 么系统就会认为这是一个“无法识别的设备”了。这时就要换晶振了。而实际维修中真的有很 多晶振损坏的实例!(3)主控,如果上述两点检查都正常,那就可以判断主控损坏了.


为你的USB设备“加把劲” 篇6

USB即通用串行总线(UniversalSetial Bus),也称通用串联接口。它是一个使计算机周边设备连接标准化、单一化的接口,其规格是由Intel、NEC、Compaq、DEC、IBM、Mic rosoft、Northern Telecom等公司联合制定的。

我们都熟悉USB有一个显著优点,那就是支持热插拔,也就是说在开机的情况下,你也可以安全地连接或断开USB设备,这到真正的即插即用。USB接口版本已经从1.1发展到现在普及的2.0标准,传输率从12Mbit/s提高到480Mbit/s,不久就要推出传输速度更快的USB3.0标准。

USB接口很奇特

为什么USB设备能够支持热插拔呢?这还要从USB接口的结构说起。如图所示,USB设备与计算机的接口通常有4个针脚,我们以A型接口为例,两侧的针脚负责给USB设备供电,中间两根针脚负责数据的传输。细心的朋友可能发现了,USB接口两侧的针脚比中间两根针脚稍长,这样,我们每次插入USB接口时,都是首先给USB设备加电,再连接数据线了,拔出的时候,也是先断开数据线,再断开电源。所以USB设备都支持热插拔。

USB供电很重要

USB设备虽然使用方便,但是如果不注意正确的操作方法也会出问题。最经常出现的就是供电问题。USB设备为每个连接最多可以消耗500毫安(mA)的电流。如果某个USB设备试图消耗比这更多的电流,操作系统将调用相应的功能禁用该特定端口,直到系统电源关闭再打开为止。另外,如果设备消耗的电流不到50毫安,USB端口不会激活。

我们可以在Windows设备管理器中查看每个USB端口上设备所需要的电流大小,检查“USB Root Hub”(USB根集线器)属性中的“电源”选项卡,查看USB总线的功率消耗情况,如果是超出了主板的供电能力,就有可能出现小刘遇到的“电涌”情况。这时可以将暂时不使用的USB设备拔下。

小刘的电脑上插满了USB设备:鼠标、键盘、打印机、移动硬盘、摄像头,自然会导致供电不足,小刘将暂时不用的移动硬盘和打印机拔出,摄像头便能正常使用了。

小提示

有时会有这种情况:将一个损坏的USB设备插入,会导致系统停止响应(挂起),拔下或热启动都不能解决,这时必须通过关闭系统电源然后重新打开以重置总线。

为你的USB设备“加把劲”

USB设备驱动 篇7

1 USB设备驱动程序原理

USB设备驱动程序是一种典型的WDM(Windows Driver Model)驱动程序,在WDM驱动程序模型中,每个硬件至少包含两个驱动程序:USB总线驱动程序和USB功能驱动程序。总线驱动程序由操作系统提供,不用用户设计。因此,USB设备驱动程序的设计实际上是USB功能驱动程序的设计。用户只需编写相应的功能驱动程序即可。

目前开发WDM驱动程序的方法有[1]:1)使用微软的DDK工具开发。在实际运用中虽然利用DDK开发的驱动程序的代码编写比较简洁,结构清晰,效率也高,但缺点是难度较大,调试困难。2)使用NuMega公司的DriverStudio。开发。利用DriverStudio开发驱动难度适中,基础性的工作大多已由工具软件完成,于由于软件采用了封装技术,可能会产生一些难以察觉和理解的错误。3)使用KRFTech公司的WinDriver工具开发。利用该工具的开发难度较小,但只能开发硬件相关的驱动,实际开发的工作只是定制和调试系统所提供的通用程序而已,开发效率很低。本文将利用DriverStudio工具包开发WDM型USB设备驱动程序。

1.1 WDM驱动的分层结构

WDM驱动程序采用分层结构,可和其他驱动程序相联系,接收建立在其上的驱动程序提供的服务,也可向其他驱动程序发送IRP请求[2]。其层次结构如图1所示。这种分层的好处是把I/O分解成一系列可控制的任务,如果每个层次有一个标准的规范,就意味着整个层次可以被替换,而上面的层次感觉不出来,下面的层次隐藏了实现的细节。

WDM引入了功能设备对象FDO(Functional Device Object)与物理设备对象PDO(Physical Device Object)两个新类来描述硬件,一个PDO对应一个真实硬件。一个硬件只允许有一个PDO,但却可以拥有多个FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的PDO与FDO。在FDO的上面和下面还会有一些过滤驱动设备对象FIDO(Filter Device Object)。位于FDO上面的过滤驱动设备对象成为上层过滤器,位于FDO下方(但仍然在PDO之上)的为下层过滤器。

驱动程序之间使用IRP(I/O请求包)通信。Windows定义了一套驱动程序使用的IRP,每个IRP请求或执行一次输入/输出动作。我们可以把IRP理解为:驱动程序提出与设备上的某一端点建立一定方向的数据传输的请求。通常IRP先被送到最上层驱动程序,然后逐渐过滤到下面的驱动程序。功能驱动程序管理FDO(Functional Device Object)所代表的设备,总线驱动程序管理计算PDO(Physical Device Object)所代表设备的连接,过滤器驱动程序用于监视和修改IRP流。

1.2 I/O请求包的处理

I/O请求的整个处理过程简述如下:当I/O管理程序接收到一个来自用户模式应用程序的请求时,应用程序对设备I/O进行Win32调用。I/O管理器把这个请求转换为具有不同主功能代码的IRP发送给功能驱动程序,然后调用驱动程序中相应的Dispatch例程。每个代码有一个被驱动程序支持的Dispatch例程。表1列出常见的Win32设备I/O函数和对应的Dispatch例程。

而功能驱动程序在接收该IRP后,在回调例程中根据IRP中包含的具体操作代码构造相应的URB。把它放到一个新的IRP中,并把这个新的IRP传递给USB总线驱动程序。USB总线驱动程序根据IRP中所包含的URB执行相应操作,再将操作结果通过IRP返还给功能驱动程序。功能驱动程序接收此IRP,将操作结果通过IRP返还I/O管理器。最后,I/O管理器将此IRP中的操作结果返回给应用程序。至此,应用程序对USB设备的一次I/O操作完成。

2 基于USB驱动的安全机制

易丢失、明文传输、明文存储等特点使大多数的USB设备存在潜在的安全隐患。例如,很多USB设备中存储了很多敏感信息,如何在设备丢失后,敌手不能通过非法的主机获得设备中的信息。另外,数据是明文传输的,如何防止敌手在监听USB总线的时候不会得到任何敏感信息[3]。

2.1 基于认证和加密的安全机制

针对上述的安全问题,我们设计的安全机制见图2。

1)认证与密钥协商协议:每次USB设备枚举时,主机首先与设备进行双向认证并协商出用于总线会合加密的会话密钥,才能进行下一步数据通信。当用户将设备从主机上拔下时,该会话密钥过期并丢弃。

2)加密传输:在双向认证和密钥协商后,如果认证失败,双方都将禁止在总线上发送数据。如果认证成功,则利用枚举过程中协商出的会话密钥使用高效的分组密码算法来实现USB总线上传输的数据的加密。

2.2 一种基于USB的认证密钥协商协议

针对USB驱动提出的安全机制,本文提出了一种认证与密钥协调协议[4]。

在该协议里面,主机的计算能力是足够的,USB设备必须能够执行RSA的数字签名去处,并能执行AES加解密;设备有一个伪随机数发生器,具有存储协议过程中产生的中间数据的能力。

系统密钥产生中心选择满足安全要求的大素数p和一个本原元g,对于RSA签名算法,Si,每个用户都选择自己的公钥和私钥,假定协议过程每一个参与方都能够得到另一方的公钥的可信副本(采用证书技术或者基于身份的技术)。

协议步骤如下:

Step1:A(主机)随机选取r1,将r1发送给B(设备)

Step2:B随机选取xB和r2,计算yB=gxBmod p,并用自己的私钥对r1、yB签名,再将yB、SB(r1,yB)和r2一起发送给A

Step3:A接收到B发送的消息后,首先用B的公钥验证签名的正确性。如果验证失败,则拒绝B;如果验证成功,则接受B。然后随机选取xA,计算yA=gxAmod p,并用自己私密给消息r2、yA签名,将yA、SA(r2,yA)发送给B。

Step4:B接收到A发送的消息后,首先用A的公钥验证签名的正确性。如果验证失败,则拒绝A;如果验证成功,则接受A。

Step5:A计算KAB=yxABmod p,B计算KAB=yxBAmod p,会话密钥协商完毕。

3 基于安全机制的驱动程序实现

3.1 驱动程序设计

DriverStudio中的DriverWorks工具,提供了VC++下的开导DriverWizard,按照它的提示可以迅速地生成驱动程序的框架,开发者可以在此基础上根据各自的需要添加相应的代码[5]。除实现一般的功能外,要在设备驱动中实现安全策略需要做两方面工作:一是在USB设备枚举过程中配合设备固件程序,完成认证和密钥协商协议;二是用协商出的会话密钥来完成的安全数据传输。

普通的USB设备驱动程序的执行包括枚举、配置、等待、传递等过程,如图3 a),而实现总线安策略的驱动程序的执行过程如图3 b)。

3.1.1 认证与密钥协商协议的实现

从C程序编写的角度来分析,主机认证与密钥协商协议的执行大致可分为如下几步:

1)生成随机数r1,并发送r1;

2)接收数据yB、SB(r1,yB)和r2;

3)计算SB(r1,yB)对应的明文M;

4)比较M与r1,yB是否相等,若不相等,则中断通信;

5)生成随机数xA,计算并发送yA、SA(r2,yA);

6)接收数据(设备认证主机的结果),如果失败,则中断通信:

7)计算会话密钥KAB=yBxAmodp。

枚举过程后,主机给设备发送的IRP的此功能代码为IRP_MN_START_DEVICE,它所对应的DriverStudio驱动程序框架中的为OnStartDevice(),我们在该函数中加入如下代码,采用直接向下传递URB并接收其响就的数据的,与设备进行交互,实现枚举过程之后的认证与密钥协调协议:

3.1.2 驱动中数据加密传输的实现

认证成功后,Read和Write例程负责应用程序与设备之间交互数据的过程。在IRP向URB转化的过程中,对待送的数据进行AES加密。该过程只需要在Read和Write例程中的相应位置插入几行代码即可。

3.2 固件程序设计

固件程序主要完成通过USB接口传输指令以及通过微控制器执行指令两大功能。由于总线中加入了安全策略,相应的固件中需要增加认证与密钥协商、总线数据加解密及密码算法接口等几部分代码。在设备端,总线的上安全策略主要由固件程序的相应模块分别访问密码算法接口,并控制密码算法加速器来实现,如图4,由于篇幅限制,具体的实现就不再细说。

4 功能测试

驱动程序属于操作系统内核态编程,程序不能够直接将数据输出到屏幕上而是必须采用专门的技术来查看驱动程序运行中的数据。Driver Monitor软件则能够满足这一需要。此外,驱动程序与总线之间交互的数据还可以用Bus Hound软件来抓取。总线安全功能的测试验证,包括两方面内容:一是协议实现的验证;二是安全传输的验证。

4.1 认证与密钥协商协议的测试

在整个测试过程中,认证与密钥协议的成功与否直接决定了此后的数据传输过程,我们在驱动程序中对协议的每一步进行监控,确保测试的准确。当主机与设备双向认证成功时,显示如图5所示。

4.2 传输加密的测试

数据的传输需要经过应用程序、驱动程序、总线传到设备端的,这样USB总线上传输的数据是驱动程序加密应用程序的发送的数据的密文。我们采取的测试向量为:

明文:abccefgggiojjhvm

明文编码:61 62 63 65 67 67 67 69 6f 6a 6a 68 76 6d

密钥编码:37 34 32 33 30 38 36 32 33 31 39 35 35 30 0

密文编码:9d 26 cb 10 49 49 a0 4c 49 e5 02 00 d2 10 00 9b

用应用程序发送该明文,通过Bus Hound工具来获得总线上的数据,如图6所示。Device列中的19代表系统中的设备编号,0是缺省端点即控制端点,2代表OUT端点,DO代表Data OUT,后面Data列则是总线上传输的数据了,该数据的确是密文形式的。

5 总结

随着计算机及通信技术的不断发展及USB设备的迅速普及和日益增多,设计和开发相关驱动程序的需求也越来越大。而随着USB设备安全需要的增加,设计具有密码安全机制的驱动程序也势在必行。本文利用DriverStudio设计的具有认证与密钥协商及总线安全传输功能的驱动程序,经过DriverMonitor及Bus Hound工具的测试,能够很好工作并完成总线的安全保密任务。

参考文献

[1]Cant C.Windows WDM设备驱动程序开发指南[M].孙义,马莉波,国雪飞,等,译.北京:机械工业出版社,2000.

[2]李锦山,舒辉,董卫宇,等.基于驱动层的USB存储设备安全监控技术[J].计算机工程:2008,34(8):255-277.

[3]吴永英,邓路,肖道举,等.一种基于USB Key的双因子身份认证与密钥交换协议[J].计算机工程与科学,2007,29(5):56-59.

[4]武安河.Windows2000/XP WDM设备驱动程序开发[M].北京:电子工业出版社,2005.

USB设备驱动 篇8

USB端口已经成为便携式PC和平板电脑的标准配置,USB设备在为用户带来便利和快捷的同时也逐步成为了“用电大户”,直接影响着主机的续航时间和电池寿命。所以为USB设备编写的驱动程序应该采取积极的电源管理策略,及时地切换设备运行状态,以便有效地降低功耗。

1 主要技术介绍

1.1 WDF介绍

WDF(Windows Driver Foundation)是在WDM(Windows Driver Model)的基础上发展而来的新一代驱动程序模型。它提供了内核模式驱动程序框架(KMDF)和用户模式驱动程序框架(UMDF)两种模式[1],实现了完全集成的即插即用和电源管理模型。驱动程序框架管理着与操作系统内核相关的通信,通过隔离驱动程序与系统内核,降低了驱动程序对内核的影响,提高了系统稳定性[2]。

1.2 内核模式驱动程序框架

内核模式驱动程序框架KMDF是随Windows驱动程序工具包WDK(Windows Driver Kit)一同被发行[3],为驱动程序提供基于对象的接口和内核模式驱动程序所需的基本功能。默认操作仅需少量的通用代码,剩下的大部分工作由框架内定义的对象及方法来实现,保证用户开发出的驱动程序与每个后续的Windows版本兼容[4]。该框架具有以下优点:

• 提供了比WDM更容易使用的驱动程序接口。

• 可处理WDM驱动程序需要人工处理的许多操作。

• 提供了支持多处理器环境所需的大部分同步代码。

1.3 选择性挂起

当计算机处于S0状态(全部硬件设备打开或正常工作)时,为了降低功耗,在不影响计算机工作状态的前提下将长时间处于“空闲”状态的USB设备切换至“睡眠”状态,并在必要时刻重新将其唤醒,这种工作机制被称为USB设备的“选择性挂起”。一个USB设备进入“睡眠”状态,不会影响连接到同一个USB集线器上的其它设备[5],其功耗状态可以用Dx表示,x取值0到3,数字越大表示功耗越小[6]。具体说明如下:

• D0:设备已开启并处于工作状态,以系统允许的最大功耗及最高性能运行。

• D1/D2:设备处于中度睡眠状态,设备已经被使用,但以较低的性能运行。

• D3:设备处于深度睡眠状态,设备仅保证唤醒所需的最小供电。

1.4 设备栈与电源策略所有者

一个物理设备的驱动任务通常由几个驱动程序共同完成。每个驱动程序对应一个设备对象,它们按层布局,组成一个设备栈。

电源策略所有者PPO(Power Policy Owner)是指在设备栈中能够管理设备的电源策略、控制设备功耗状态并向设备栈发送请求的那个驱动程序。在每个设备栈中只能有一个驱动程序作为PPO,虽然栈中的任何驱动程序都可以充当PPO,但通常由USB设备的KMDF功能驱动程序来完成这个任务。电源策略所有者负责启用和禁用以下功能:

• 设备自身处于“空闲”状态但系统保持S0状态时,设备进入“睡眠”状态。

• 设备在检测到外部事件时从“睡眠”状态自行唤醒。

• 设备在检测到外部事件时将整个系统从“睡眠”状态唤醒。

2 I/O队列

2.1 电源管理队列与非电源管理队列

基于KMDF框架的驱动程序通常是与框架通信,而不是直接与操作系统的内核组件,所有的读、写和设备I/O控制请求必须由队列对象处理。该队列对象从系统接收请求然后分发给驱动程序的回调函数,它可以支持电源管理特性,也可以不支持此特性。

当一个请求到达电源管理队列,KMDF框架确保将其分发至驱动程序之前设备处于D0状态。也就是说,当设备离开其工作状态(D0)时,电源管理的队列对象对请求进行排队,但是不会将请求分发给驱动程序,在设备重新进入D0之前一直等待。非电源管理的队列对象会无视设备状态而继续分发请求[7]。一般情况下,一个驱动程序设置一个非电源管理队列接收I/O设备的控制请求,同时设置一个或多个电源管理队列接收读、写和其它与功耗相关的请求。对于KMDF驱动程序,若要将一个队列对象配置为电源管理队列通常是在EvtDriverDeviceAdd回调例程中完成。

2.2 PPO在电源管理队列中的作用

电源管理队列处理传入“睡眠”设备请求的方式取决于驱动程序是否是设备栈的PPO。对于处在“睡眠”状态的设备,PPO的电源管理队列支持“上电逻辑”。当I/O请求到达时,队列的“上电逻辑”可以将设备切换到D0状态,然后向驱动程序分发请求,且不需任何特殊代码。非PPO的电源管理队列不支持“上电逻辑”,当I/O请求到达时,队列对象将请求排队,但是不启动唤醒过程。具体过程如图1所示。

2.3 电源管理队列的使用条件

电源管理队列为驱动程序的开发提供了便利,但对它的使用不是无条件的。在设备栈中,如果一个KMDF驱动程序处于PPO之上,则无法使用电源管理队列。因为在设备被挂起时,设备功耗已经被降为Dx,但系统仍然处于S0并且可以向设备发送I/O请求。框架却不会从电源管理队列提交请求,致使I/O请求将阻塞设备栈。例如,驱动程序A和驱动程序B组成一个简单的设备栈,驱动程序B是PPO。假设场景1中的驱动程序A使用非电源管理队列,场景2中的驱动程序A使用电源管理队列,设备最初都处于“睡眠”状态,通过图2比较两者的不同。

在场景1中,系统发送一个I/O请求,驱动程序A通过非电源管理的队列对象收到了这个请求。经过处理之后,向下传送。B的队列接收请求后唤醒设备,并将请求分发给驱动程序B,请求被迅速处理。

在场景2中,系统发送一个I/O请求,驱动程序A的电源管理队列接收到请求。因为驱动程序A不是PPO,不能唤醒设备。队列对象将挂起请求,整个设备栈则进入“死锁”状态。

3 选择性挂起的工作机制

在实现USB设备挂起与恢复的操作中,KMDF框架处理所有与底层驱动程序通信相关的工作,同时监视着每个设备对象的电源管理队列的所有I/O活动。

一个空闲计时器记录着设备处于“空闲”状态时间,默认的超时时间为5秒。如果直至“空闲计时器”超时,都没有任何I/O请求到达设备对象的电源管理队列,KMDF框架将发送控制请求,在I/O队列中的所有I/O请求被响应后,调用回调函数将设备从D0切换到Dx状态。对于不支持电源管理的队列对象,需要框架在驱动程序的EvtDeviceD0Exit回调函数中显性调用WdfIoTargetStop方法把设备切换到“睡眠”状态。设备被挂起后,框架在下列情况下将向设备栈发送“上电”请求,并调用驱动程序的回调函数来唤醒设备:

• 一个I/O请求到达驱动程序的电源管理队列。

• 用户通过设备管理器关闭USB选择性挂起。

• 驱动程序调用WdfStopIdle方法。

4 实现选择性挂起

KMDF功能驱动程序使用WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS结构来保存“挂起”策略的各种设置参数,结构的成员变量如下:

• IdleTimeout:表示空闲计时器的超时时间。如果设置为IdleTimeoutDefaultValue,则时间为5000毫秒。

• UserControlOfIdleSettings:设置为IdleAllowUserControl表示赋予用户更改设备“挂起”设置的权限。相反,IdleDoNotAllowUserControl表示禁止用户更改。

• Enabled:设置为WdfUseDefault,表示启用对选择性挂起的支持。

• DxState:表示被框架挂起设备的功耗状态。需要将其设置为PowerDeviceMaximum,以保证框架能够根据设备性能自动匹配正确的参数。

4.1 启用选择性挂起

驱动程序在EvtDriverDeviceAdd回调函数中,通过WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT方法完成对WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS结构的初始化工作,然后调用WdfDeviceAssignS0IdleSettings方法将设置的参数传送给框架。以下面的代码片段为例:

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings;

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleUsbSelectiveSuspend);

idleSettings.IdleTimeout = 25000;

WdfDeviceAssignS0IdleSettings(Device, &idleSettings);

在上例中,WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT方法有2个参数:一个是指向WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS结构的指针,另一个是为了支持选择性挂起而将枚举型变量设置为IdleUsbSelectiveSuspend。空闲计时器的超时时间被设置为25秒,同时DxState和UserControlOfIdleSettings参数使用框架的缺省值。然后,框架调用WdfDeviceAssignS0IdleSettings方法来启用“挂起”支持,并向框架注册各种参数设定。代码被执行后,当设备空闲时,框架将其切换到D3状态。如果要改变“挂起”策略的设置参数,只需重新进行参数初始化并再次调用WdfDeviceAssignS0IdleSettings方法即可。

4.2 阻止USB设备挂起

当系统处于S0状态,如果一个USB设备句柄正在被使用或设备正在充电,即使空闲超时,该设备也不允许被切换至“睡眠”状态。驱动程序通过调用WdfDeviceStopIdle方法阻止框架挂起一个空闲设备。如果空闲计时器没有超时,并且设备处于D0状态,框架将关闭空闲计时器。如果设备已经处于Dx状态,框架将把设备切换D0状态。当设备允许被挂起时,驱动程序通过调用WdfDeviceResumeIdle方法重启空闲计时器。

5 远程唤醒

KMDF框架可以向一个处于“睡眠”状态的USB设备发出唤醒信号,将其从低功耗状态切换至工作状态。如果系统处于工作状态S0,那么这个过程叫做“从S0唤醒”,如果系统处于睡眠状态(S1~S4),则叫做“从Sx唤醒”,它们统称“远程唤醒”。用户不需要编写任何代码就可以实现从S0唤醒,因为KMDF框架对其提供了很好的支持。然而,如果系统处于Sx状态,需要手工编写代码来实现远程唤醒。

5.1 查看设备信息

WDF_USB_DEVICE_INFORMATION结构中保存着设备硬件的特征信息,通过对其成员变量Traits进行识别可以判断设备是否支持远程唤醒。以下面的代码片段为例:

WDF_USB_DEVICE_INFORMATION deviceInfo;

WDF_USB_DEVICE_INFORMATION_INIT(&deviceInfo);

status = WdfUsbTargetDeviceRetrieveInformation(pDeviceContext->UsbDevice,&deviceInfo);

waitWakeEnable = deviceInfo.Traits & WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE;

在上例中,WDF_USB_DEVICE_INFORMATION_INIT方法完成对WDF_USB_DEVICE_INFORMATION结构的初始化工作,WdfUsbTargetDeviceRetrieveInformation方法通过设备对象的句柄将设备的硬件信息保存至结构变量中。如果变量waitWakeEnable的值为true则说明设备支持远程唤醒,否则为不支持。

5.2 启用远程唤醒

KMDF功能驱动程序只需完成“唤醒”设置的初始化工作,KMDF框架和底层的USB总线驱动程序负责发送请求并将设备切换回“工作”状态。“唤醒”设置的各种参数保存在WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS结构中,其主要成员变量设置如下:

• Enabled:设置为WdfUseDefault。

• DxState:设置为PowerDeviceMaximum。

• UserControlOfWakeSettings:设置为WakeAllowUserControl。

下例说明如何初始化唤醒设置并启用远程唤醒:

WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings;

WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);

status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings);

WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT方法来完成结构变量的初始化工作,所有参数均使用缺省值。WdfDeviceAssignSxWakeSettings方法负责将设置的参数传送给KMDF框架。如果操作成功,处于Dx状态的设备将被唤醒。

6 结 语

作为全新的驱动程序框架,KMDF在内核模式下为开发者提供了一个面向对象、基于事件驱动的开发平台,极大地简化了USB设备的功耗控制工作。文中介绍了选择性挂起相关技术、说明了I/O请求在不同类型设备栈中的分发流程、展示了KMDF框架下实现选择性挂起的步骤和相关函数指令。

参考文献

[1]李正平,徐超.WDF设备驱动程序的设计与实现[J].计算机技术与发展,2007,17(5):228-229.

[2]邹敬轩,蔡皖东.基于WDF过滤驱动的USB存储设备监控系统[J].计算机工程与科学,2010,32(3):42-43.

[3]胡晓力,田有先.KMDF框架研究与温室监控驱动开发[J].农机化研究,2008(6):177-178.

[4]Orwick P,Smith G.Developing Drivers with the Windows?Driver Foundation[M].Washington:Microsoft Press,2007:10-11.

[5]Microsoft Corporation.Selective Suspend in USB Drivers[M].Wash-ington:Microsoft Press,2009:4.

[6]Axelson J.USB Complete-The Developers Guide4th Edition[M].Mad-ison:Lakeview Research LLC,2009:399-407.

USB设备驱动 篇9

在油田开采中,及时准确地测量出油井的液面深度可以有效地保证采油设备的安全运行,并为优化生产提供重要的参数。研究涉及油田油井液面深度约300~3000m。动态液面测量系统采用微处理器控制发射声波,声波通过油管与套管之间环隙中的压缩天然气向井下传播。整根油管由上百个管段和接箍拼接而成。声波在传播过程中,每遇到1个接箍就会产生1个小的回波,最后到达液面会反射1个强的回波,同时由检波器提取声波信号并转化为电信号,信号经调理后进入DSP。利用DSP芯片强大的信号处理能力在微处理器内,通过软件实现滤波和图形识别。但是考虑到回波采集数据量较大(一台仪器一次测量就是1万个数据点),不方便数据显示和管理,故构造嵌入式系统提取各个井深测量仪的井深数据,建立数据的统一管理系统,方便数据显示与管理。见图1示。

1994年,由Compaq,Intel,Microsoft和NEC组成的联盟开始制定通用串行总线标准,即USB(Universal Serial Bus)。图2展示了USB通信模型之间基本的信息流与互连关系。由图可见,主机与设备都被划分成不同的层次。主机上垂直的箭头是实际的信息流。设备上对应的接口是基于不同实现的。在主机与设备之间的所有通信最终都是通过USB的电缆进行,然而,在上层的水平层之间存在逻辑的主机-设备信息流。主机上的客户软件和设备功能部件之间的通信是基于实际的应用需求及设备所能提供的能力。

2 基于DSP平台的动态井深测量仪USB固件驱动

动态井深测量仪基于德州仪器D S P处理器TMS320F2812,使用CCS为交叉编译环境,集成程序编辑、编译、连接、下载和仿真为一体。

动态井深测量仪上采用了Cypress公司的CY7C68001芯片实现USB设备接口。CY7C68001上集成了USB2.0收发器(物理层)、USB2.0串行引擎(链路层,实现底层通信协议)。CY7C68001则作为F2812的外设,USB的应用层协议由F2812编程实现。CY7C68001采用并行异步存储器接口与F2812相连接,主机可以唤醒F2812,也可以配置U S B。

CY7C68001有两个外部接口:

1.命令接口:用来访问CY7C68001寄存器、Endpoint0缓冲器及描述表。

2.FIFO数据接口:用来访问4个1K字节的FIFO中的数据。

图3描述出D S P程序中U S B设备固件部分的驱动流程图。

3 基于ARM下嵌入式Linux的USB设备驱动

3.1 USB协议

U S B包括U S B主控制器和根集线器,U S B连接设备时必须使用集线器(hub)。其中USB主控制器负责主机与设备间的电气和协议的互联,根集线器提供USB设备的连接点。一个完整的U S B系统包括主机系统和USB设备。所有传输事务都由主机发起[1]。

3.2 USB驱动程序的核心数据结构

Linux内核的USB系统提供了与USB设备驱动程序开发相关的一些非常重要的数据结构,在整个驱动开发中起着很重要的作用。

为USB设备文件提供了一个文件界面操作数据结构file_operations结构。其结构几乎全是函数指针,所以实际上是一个函数跳转表,例如read就指向USB设备的读文件操作的入口函数。其中一些主要的函数如下所示:

3.3 USB驱动程序设计

下面对U S B下井深测量仪的设备驱动进行一些简要分析。

(1)USB驱动程序的注册和注销。所有的USB驱动程序在装载时都必须向U S B系统注册,在载卸时向U S B系统注销。这两个过程分别在驱动程序的初始化和退出函数中进行。

(2)USB驱动程序的操作函数。dlm驱动程序的操作主要包括3个部分,即USB驱动程序dlm_driver、设备类驱动程序dlm_class和设备操作函数dlm_fops。dlm_driver描述了主机控制器如何探测设备、断开设备及得到设备信息;dlm_class包括设备的操作函数集和访问权限;dlm_fops描述了对设备文件的读写操作方法[3]。

(3)在Linux内核中,使用usb_driver结构体描述一个USB设备驱动,usb_driver结构体的定义如下所示。

故在动态井深测量仪驱动中实例化一个usb_driver结构体如下:

static struct usb_driver dlm_driver;

3.4 USB驱动程序编写实例

以下以动态井深测量仪(简称dlm)为例,说明USB驱动程序模块的具体编写。

(1)USB驱动程序的注册和注销

USB驱动程序首先要向Linux系统登记,这就是驱动模块初始化过程要完成的操作[4]。

上述dlm_usb_driver是一个struct usb_driver的结构体。当U S B驱动程序卸载时,要向系统注销。调用usb_deregister函数。

当设备插入时,为使Linux hotplug系统自动装载程序,系统就要创建一个MODULE_DEVICE_TABLE来说明这个U S B驱动程序所支持的硬件。USB_DEVICE宏根据制造商ID和产品ID生成一个usb_device_id结构体的实例,在数组中增加该元素将意味着该驱动可支持匹配制造商ID、产品ID的设备,即这里的动态井深测量仪设备中U S B设备芯片C Y 7 C 6 8 0 0 1的制造商ID0x04b4和产品ID0x0082。

USB_DEVICE宏利用制造商ID和产品ID提供了一个设备的唯一标识。当系统插入一个与I D匹配的U S B设备到U S B总线时,驱动程序会在U S B C O R E中注册。驱动程序中p r o b e函数也就会被调用。usb_device结构指针、接口号和接口ID都会被传递到函数中。

驱动程序需要确认插入的设备是否可以被接受,如果不接受,或者在初始化的过程中发生任何错误,probe函数返回一个N U L L值。否则返回一个含有设备驱动程序状态的指针。通过这个指针,就可以访问所有结构中的回调函数。

(2)USB设备的打开和释放

USB设备的打开是通过调用文件操作集中的open()函数来完成,它也是为设备的其他操作做好准备[5]。

(3)USB设备读数据函数

USB设备的读取函数主要是调用usb_bulk_msg()来从动态井深测量仪取数据,然而再拷贝数据到用户区。

(4)编译及挂载文件系统

在编译L i n u x内核时,选中“U S B d e v i c e filesystem”。usbfs动态跟踪总线上插入和移除的设备,通过它可以查看系统中USB设备的信息,包括拓扑、带宽、设备描述符信息、产品ID、字符串描述符、配置描述符、接口描述符、端点描述符等。内核中提供了USB设备文件系统(usbdevfs,Linux 2.6改为usbfs,即USB文件系统),它和/proc类似,都是动态产生的。通过输入命令:mount-t usbfs none/proc/bus/usb可以实现USB设备文件系统的挂载。这样,当我们连接井深测量仪和ARM终端时,查看/proc/bus/usb/devices文件得到当前U S B子系统的结构如下:

从该拓扑文件中可以看出,U S B设备驱动已经探测到动态井深测量仪这个设备,并读取了所有的设备信息和接口、端点信息,表明设备驱动已经成功加载了。

4 结束语

本文将U S B与嵌入式技术应用于石油领域,并对USB从机固件与主机设备驱动都实现了相应开发应用,使得数据通讯操作方便、快捷,为建立油井深度的数据库打下了良好的基础。

U S B总线标准从最初的U S B 1.0发展到现在的USB2.0和USB OTG,传输速度越来越快。Linux作为一种开源的GPL操作系统,其发展前景非常广阔。近年来嵌入式系统的发展,为USB设备与Linux操作系统的互联提供了良好的市场前景。

摘要:USB总线是一种快速、双向、同步、低成本、动态可连接的串行总线,其驱动程序是Linux内核的一个重要组成部分。随着Linux操作系统的广泛应用,特别是嵌入式设备的大量出现,USB驱动程序的编写越来越显得重要了。本文实现了基于DSP平台的USB从机固件开发以及基于ARM下嵌入式linux的USB主机设备类驱动开发。

关键词:嵌入式Linux,USB主机设备驱动程序,USB从机固件

参考文献

[1]Compaq,Hewlett2Packar Universal Serial Bus Specification Revision 2.[Z].[s.l.]Compaq Hewlett2packar,2000.

[2]CORBET J,RUBINI A KROAH HARTMAN GLinux Device Drivers[M].[s.l.]Third Edition.Sebastopol O’Reilly Media Inc,2005.

[3]DANIELP.BOVET,MARCO CESATI,Understanding the Linux Kernels[M].[s.l.]Third Edition.Sebastopol O’Reilly Media Inc,2005.

[4]毛德操,胡希明.LINUX内核源代码情景分析[M].浙江大学出版社,2001.

USB设备不能即插即用的对策 篇10

关键词:USB,PNP,问题,对策

在使用移动硬盘、U盘或手机下载mp3等USB设备时, 有些USB即插即用设备一插上系统就会发现并可以使用, 可有些USB设备插上后却“无法显示USB设备”, 这是什么原因呢?

1 设备的即插即用问题

即插即用 (Plug and Play) , 简称PNP。电脑安装了硬件之后, 必须安装相应的驱动程序及配置相应的中断、分配资源等操作才能使新硬件正常使用。但是随着多媒体技术的发展, 致使我们需要的硬件越来越多, 安装新硬件后的配置工作难度越来越大, 直接影响了多媒体技术的应用。困此在Windows操作系统中, 采用的有效方法是:内置常用硬件的驱动程序, 当你安装了硬件之后, 如果Windows中有这项硬件的驱动程序, 就会自动安装这就是所谓的PNP。PNP必须具备以下三个条件:第一是即插即用BIOS。BIOS提供一些基本指令来识别必要的设备, 并在加电自检过程中寻找PNP设备。第二是即插即用的操作系统, 例如WINDOWS。第三是即插即用的硬件, 即插即用的PC设备, 主要由PC主板上的总线及各类适配卡组成, 连接PC机的打印机、外部调制解调器和其他设备也可以支持即插即用。目前大部分的硬件都可以“即插即用”, 但是随着新产品的出现, 还是可能碰到无法“即插即用”的情况。

2 USB的工作原理

USB是一种用于将外围设备连接到主机的外部总线结构, 主要用在中速和低速的外设。同时USB又是一种通信规则、约定和标准, 负责主机和USB的外围设备之间的数据传输。从硬件方面看, USB接口的四根线, 两根传送的是5V的电源, 另外的两根是数据线。对于电压小于等于5V, 功率不大于500MA的外围设备可以直接通过USB总线供电, 而不必外接电源。从软件实现方面看, 每一个USB设备会有一个或者多个的逻辑连接点, 在USB的规范中用4位地址标识端点地址, 每个设备最多有16个端点。端点0都被用来传送配置和控制信息。USB把拥有一些共同的行为特征和工作协议的设备编为一类, 这样在编写驱动程序时就变得简单了很多。

USB初始化过程和一般设备驱动相类似, 首先是调用函数Driver Entry。在Driver Entry函数中, 分别指定各个IRQ的派遣函数地址ID、指定Add Device例行程序函数地址、指定Unload例行程序函数地址等。在Add Device例行程序中, 创建功能设备对象, 然后将该对象挂载在总线设备对象之上, 从而形成设备栈。然后再为设备创建一个设备链接, 便于应用程序可以找到这个设备。最后USB设备开始加载。其加载过程是当USB设备接入hub或root hub后, 主机控制器和主机软件能自动侦测到设备的接入。主机软件读取一系列的数据用于确认设备特征, 如设备端口地址ID工作方式, 电源消耗量等参数。接着主机分配给外设一个单独的地址。地址是动态分配的, 各次可能不同。在分配完地址之后对设备进行初始化, 初始化完成以后就可以对设备进行I/O操作了。

3 USB设备不能即插即用的原因

首先来自操作系统。一是操作系统是否支持PNP。WINDOWS98以前的产品就不支持, 必须加载驱动程序。二是操作系统是否有漏洞。Microsoft就曾专门针对通用即插即用中的漏洞问题发出安全公告MS07-019, 可能允许远程执行代码 (931261) 。其次是驱动程序。即插即用功能是软件中相当复杂的一个组块, 由于USB把拥有一些共同的行为特征和工作协议的设备编为一类方法编写驱动程序, 如果系统不能找到合适的设备驱动程序, 那么它就会在庞大的备选库中选择相近的设备驱动程序。再次是硬件资源冲突。如果你的相同的USB设备数量在一个以上, 那么你可能使计算机运行缓慢, 甚至提示你“Stop 0x000000CA error”信息。这个信息意味着你在即插即用方面遇到了致命性错误。再次端口地址ID出错。即插即用功能对硬件和驱动程序进行匹配的关键之处在于即插即用设备的ID, 这是微软公司和硬件制造商为每个设备所分配的数字串。每个ID代表的是唯一的即插即用设备。从理

论上讲, 不同的设备不应该具有相同的即插即用ID。但是在我们所说的情况中, 这个理论被打破了;这些USB设备都报告了相同的即插即用ID。结果就会引起冲突。最后是主板和系统的兼容性问题。

4 USB设备不能即插即用的对策

尽管USB的故障原因比较多, 但一般都不是USB接口或者USB即插即用设备本身的故障, 因此需要在排除的时候故障范围一下子缩小到了周围关联部分。第一, 操作系统尽量使用正版软件, 还要及时打补丁。第二, 修改CMOS。“PNP/PCI Configuration”菜单, 仔细检查各个选项, 发现“PNP OS Installed”已设置为“Yes” (即插即用已打开) , “Assign IRQ For USB”项设置为“Enable”。第三, USB接口电压不足。当把移动硬盘这样需较大供电的设备接在前置USB口上时就有可能发生系统无法识别出设备的故障。原因是移动硬盘功率比较大要求电压相对比较严格, 前置接口时可采用两个USB并行供电方式。大功率的电源应使用外接电源的硬盘盒。第四, 驱动程序不能很好匹配。尽管WINDOWS能支持USB设备, 但建议有条件的话最好安装USB设备的自带驱动程序, 减少出错可能。第五, WINDOWS设置问题。Windows XP默认开启了USB的节电模式, 致使某些USB接口供电不足, 使USB设备间歇性失灵。只要将USB节电模式关闭, USB设备就可恢复正常。方法是右击“我的电脑”选“属性”, 打开“系统属性”对话框, 切换到“硬件”选项卡, 打开“设备管理器”, 双击“通用串行总线控制器”, 会看到有好几个“USB Root Hub”, 双击任意一个, 打开“USB Root Hub属性”对话框, 切换到“电源管理”选项卡, 去除“允许计算机关闭这个设备以节约电源”前的勾选, 点击“确定”返回, 依次将每个USB Root Hub的属性都修改完后重启电脑, USB设备就能恢复稳定运行了。

结束语

即插即用的插是可以随意的, 但拔就要注意了。关键就在于拔的时候闪存是否还在工作中, 等读写完成后, 删除硬件。有些用户为图方便, 把买来的闪存一直插在电脑上, 不轻易取下, 但殊不知这样做并不妥当。总之, 只有正确的使用USB设备, 远离操作误区, USB即插即用设备才能实现快捷、方便、安全、高效之目的。

参考文献

[1]周立功.USB2、0与OTG规范及开发指南[M].

上一篇:复合式长寿命路面下一篇:省级电视媒介