摘要
USB(Universal Serial Bus,通用串行总线)的初衷是简化外设的连接和使用,推动了计算机技术的发展。USB外设总线的核心在于操作系统对设备的自动识别、配置及热插拔特性,从而实现即插即用。本文以人工接口设备(Human Interface Device,HID)为例,从问题的起源、类驱动程序的设计、通信协议、描述符以及驱动开发等多个方面,探讨USB设备驱动的相关问题。

1. 问题的起源
用户在安装设备时,往往可能因驱动程序与系统或其他软件不兼容而耗费数天时间。如果操作系统自带相关驱动程序,设备即可插即用,这是理想的解决方案。
随着设备种类的不断增加,操作系统无法为所有设备预装驱动。然而,许多设备具备共性,通过将其归类并定义通用API接口,可以实现通用驱动程序的开发。
USB规范旨在通过分类方法实现这一目标。除了定义设备配置与数据传输的基本协议外,USB还规定了设备的机械与电气性能标准,并定义了通信、打印、图像、存储、音频和HID等设备类别。这种分类不仅支持单一功能设备,还支持多类别设备(混合设备)。
2. 类驱动程序
USB类驱动程序依赖于标准化的设备分类和API接口。在Windows 2000等操作系统中,部分USB类(如HID和音频类)已获得支持。USB驱动的分层模型如图1所示,采用标准的Windows驱动程序模型(WDM),通过核心USB驱动栈(USB Driver Stack)管理设备安装、启动以及数据交互。
HID类设备的支持
HID类设备(如键盘、鼠标、游戏控制器等)由操作系统内置驱动支持。多数USB设备包含HID类功能模块,如USB扬声器通过HID类管理音量控制,同时利用音频类传输音频数据。
层级抽象与通用性
USB驱动程序通过分层设计实现硬件抽象,类驱动程序无需关心底层接口(如ISA、PCI、SCSI等),甚至无需了解USB端口的具体实现。每层通过封装和API接口互相隔离,上层驱动只需调用下层的标准接口即可。
3. 通信协议
USB设备与主机通过管道(Pipe)通信,每个管道对应不同的端口(Endpoint),支持以下四种数据传输方式:
事务数据的组成
每种传输方式由多个事务数据组成,每个事务包括以下三个阶段:
信令包阶段(Token Packet phase): 定义事务类型和目标设备地址。
数据包阶段(Data Packet phase): 包含传输负载,单次事务可传输最多1023字节。
握手信号阶段(Handshake Packet phase): 确保传输的可靠性。
HID设备主要利用控制传输和中断传输两种方式。控制传输管道用于接收和响应命令;中断传输则实现如按键、鼠标移动等异步信号的实时传输。
4. 描述符
USB设备通过描述符传递其标识信息、性能、请求及协议等内容。描述符种类包括设备描述符、配置描述符、接口描述符、端口描述符和字符串描述符。对于HID类设备,额外定义了报告描述符(Report Descriptor),用于提供驱动程序解析的数据结构。
描述符的定义与实现
描述符通过固件编写,编译生成二进制格式存储于设备中。以下为利用EZUSB芯片设计的一个报告描述符示例:
ReportDescriptor: ; 生成的报告描述符
DB 6,0,0FFH ; Usage_Page (Vendor Defined)
DB 9,1 ; Usage (I/O Device)
DB 0A1H,1 ; Collection (Application)
DB 19H,1 ; Usage_Minimum
DB 29H,2 ; Usage_Maximum
DB 15H,0 ; Logical_Minimum (0)
DB 26H,255,0 ; Logical_Maximum (255)
DB 75H,8 ; Report_Size (8)
DB 95H,1 ; Report_Count (1) = Read Address
DB 81H,2 ; Input (Data,Var,Abs)
DB 19H,1 ; Usage_Minimum
DB 29H,2 ; Usage_Maximum
DB 95H,2 ; Report_Count (2) = Write Address+Data
DB 91H,2 ; Output (Data,Var,Abs)
DB 0C0H ; End_Collection
ReportLength EQU $-ReportDescriptor
5. 驱动程序的开发
开发USB设备驱动程序需实现以下功能:
设备的初始化;
即插即用的设备创建与删除;
Win32文件句柄请求的处理;
IOCTL功能的定义与实现;
IRP请求的调用处理;
调用其他驱动程序;
硬件的访问。
DriverEntry入口函数示例
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
NTSTATUS status = STATUS_SUCCESS;
DriverObject->DriverUnload = USBUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE] = USBCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBClose;
DriverObject->MajorFunction[IRP_MJ_READ] = USBRead;
DriverObject->MajorFunction[IRP_MJ_WRITE] = USBWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBDeviceControl;
RegisterForPnpNotification(DriverObject);
return status;
}
开发工具的选择
DriverStudio和WinDriver等工具可简化驱动程序开发,用户可根据提示定义设备功能,并通过修改示例代码完成定制化开发。
6. 结语
USB技术的广泛应用极大推动了计算机产业的发展。微软等厂商正不断完善USB驱动支持,将更多类驱动程序集成到操作系统中。通过基于标准的类驱动开发,设备兼容性和使用便利性将得到进一步提升。