天天热消息:USB接口驱动程序怎么开发?USB 驱动程序设计原理是什么?


【资料图】

提起USB 接口驱动程序开发大家在熟悉不过了,被越来越多的人所熟知,那你知道USB 接口驱动程序开发吗?快和小编一起去了解一下吧!

1 引言

随着微机技术水平的日益提高,传统的计算机接口已经不能满足当前计算机高速发展的需求,计算机业迫切需要一种新的通用型、高速总线接口,通用外设接口标准USB 就应运而生。

USB,全称是Universal Serial Bus(通用串行总线),是一种新型的、基于令牌的、高速的串行总线标准,由Compaq、Microsoft、Intel、IBM 等七家公司共同开发的, 旨在解决日益增加的PC 外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信标准[3],自1995年在Comdex 上亮相以来已广泛地为各PC 厂家支持。

现在市场上几乎所有的P C 机器都配备了US B 接口,USB 接口之所以能够得到广泛支持和快速普及,是因为它具备以下优点:

正由于上述优点, 开发USB 接口的设备已成为一种发展趋势。然而随着USB 技术的迅猛发展, 传统的USB1 . 1 接口已经不能适应用户的需求, 于是在1 9 9 9年在I nt e l 的开发者论坛大会上又提出了USB2 . 0 技术, 使得US B 不仅支持1 . 5Mb / s 的“低速”, 传输和12Mb/s 的“全速”传输,而且支持480Mb/s 的“高速”

传输,比USB1.1 标准快40 倍左右,速度的提高对于用户的最大好处就是意味着用户可以使用到更高效的外部设备, 而且具有多种速度的周边设备都可以被连接到USB 2.0 的线路上,而且无需担心数据传输时发生瓶颈效应。

2 USB 驱动程序设计

一个完整的USB 系统包括主机系统包括主机系统和USB 设备。

所有的传输事务都是由主机发起的。一个主机系统又可以分为以下几个层次结构, 如图1 所示。

USB 总线接口包括USB 主控制器和根集线器,其中USB 主控制器负责处理主机与设备之间电气和协议层的互连,根集线器提供USB 设备连接点。USB 系统使用USB 主控制器来管理主机和USB 设备之间的数据传输,另外它也负责管理USB 资源,如带宽等。应用软件不能直接访问US B 设备硬件, 而通过US B 系统和USB 总线接口与USB 设备进行交互。

图1 USB 通信模型层次关系。

USB 设备包含一些向主机软件提供一系列USB设备的特征和能力的信息的设备描述符, 用来配置设备和定位USB 设备驱动程序。这些信息确保了主机以正确的方式访问设备。通常, 一个设备有一个或多个配置( C o n f i g u r a t i o n ) 来控制其行为。配置是接口( Int er fa ce )的集合,接口指出软件应该如何访问硬件。

接口又是端点(endpoint)的集合,每一个与USB 交换数据的硬件就为端点, 它是作为通信管道的一个终点。

图1 显示了一个多层次结构的通信模型, 它表明了端点和管道所扮演的角色。

2.1 USB 驱动程序结构

1) USB 驱动程序体系结构

运行在核心态的USB 驱动程序是基于WIN32 驱动程序模型WDM(Windows Driver Model)的,它采用分层驱动程序模型,由USB 总线驱动程序和USB 功能驱动程序两部分组成, 总线驱动程序由操作系统提供, 用户只需要编写相应的功能驱动程序即可。

2) 处理流程

因为I /O 管理器把每一个设备对用户程序都抽象成文件,所以用户程序通过调用文件操作API 函数就可以实现与驱动程序中某个设备的通信。

用户程序发送的请求由I /O 管理器转换为具有不同主功能代码的IRP ( I /O 请求包) 发送给功能驱动程序。功能驱动程序接收该IRP,在回调程序中根据IRP中包含的具体操作代码, 构造相应的US B 请求, 把它放到一个新的IRP 中,并把这个新的IRP 传递给USB总线驱动程序。USB 总线驱动程序根据IRP 中所包含的USB 请求块执行相应操作, 再将操作结果通过IRP返还给功能驱动程序, 功能驱动程序接收此IRP , 将操作结果通过IRP 返还I/O 管理器。最后,I/O 管理器将此IRP 中的操作结果返回给应用程序。至此, 应用程序对USB 设备的一次I /O 操作完成, 其处理流程如图2 所示。

图2 W D M 型的U S B 驱动程序体系结构。

3 USB 设备驱动程序中关键代码实现

下面是以开发的A R M 读写驱动程序为例, 介绍USB 驱动程序中几个关键例程的实现。本驱动程序的主要功能是控制USB 设备上的ARM 并对ARM 板进行读写操作。

1) 初始化函数 DriverEntry()

设备驱动程序与应用程序不同,没有main()或WinMain()函数,而是有一个名为DriverEntry()的入口函数,它通常完成一些初始化工作。当设备驱动程序被加载时,操作系统调用这个入口。

2) 创建设备函数 AddDevice()

大多数的PDO 都是在PnP 管理器调用该程序入口点时被创建的。插入新设备后, 系统启动时, 总线枚举器会搜索总线上的所有设备,自动寻找并安装设备的驱动程序,并由驱动程序中的处理PnP 功能模块自动处理AddDevice()。本程序使用CreateDevice()函数创建设备对象,再使用RegiSTerDevicelnterface()函数将设备组成一个特定的设备接口,然后通过AttachDeviceToDeviceStack()函数关联设备栈。

3) ARM 的传输处理函数UsbTransmit()

该函数是实现本驱动程序功能的关键, 它用来与ARM 进行通信。分析发送的请求数据后根据命令的具体含义对ARM 进行读写操作。应用层通过调用标准的ARM 板函数来发送I/O 请求。

4 结束语

随着支持USB 的个人电脑的普及,大量支持USB接口外设的不断涌现, 以及USB 技术的发展和不断完善, 因此基于USB 驱动程序的开发也将成为这一发展趋势的重中之重。本文介绍了USB 的通信模型, 分析了基于WDM 的USB 驱动开发的关键所在,结合ARM驱动程序开发介绍了DDK 开发环境的构建,最终结合实际系统完成了基于DDK 的USB 接口WDM 驱动开发和调试。

关键词: USB接口 驱动程序