通用串行总线(USB)设备的驱动

 

2024-11-19 15:29:52

晨欣小编

摘要
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),支持以下四种数据传输方式:

  • 控制传输

  • 中断传输

  • 同步传输

  • 批量传输

事务数据的组成

每种传输方式由多个事务数据组成,每个事务包括以下三个阶段:

  1. 信令包阶段(Token Packet phase): 定义事务类型和目标设备地址。

  2. 数据包阶段(Data Packet phase): 包含传输负载,单次事务可传输最多1023字节。

  3. 握手信号阶段(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驱动支持,将更多类驱动程序集成到操作系统中。通过基于标准的类驱动开发,设备兼容性和使用便利性将得到进一步提升。


 

上一篇: 低电平有效指的是什么?
下一篇: LC谐振频率在线计算器,实现代码

热点资讯 - 仪器设备

 

电桥测试仪是什么?它的原理和作用是什么?
通信系统必须具备的基本要素有哪些
怎样解决射频电路中的杂波干扰问题
数字万用表(DMM)在电阻、电容测试中的应用与选择
LCR表:电感、电容、电阻测试的理想仪器
电容计的选购与使用指南:电容测试的必备工具
电阻测试仪的功能与应用:精准测量电阻的利器
ESR测试仪的工作原理与应用:如何有效测量电容的等效串联电阻
收起 展开
QQ客服
我的专属客服
工作时间

周一至周六:09:00-12:00

13:30-18:30

投诉电话:0755-82566015

微信客服

扫一扫,加我微信

0 优惠券 0 购物车 BOM配单 我的询价 TOP

请您留言

感谢您的关注,当前客服人员不在线,请填写一下您的信息,我们会尽快和您联系。

提交