如何使用 WinUSB 与 USB 设备 通信设备

WinUSB 设备 (Windows Drivers)
此站点使用 Cookie 进行分析、显示个性化内容和广告。继续浏览此站点,即表示您同意使用。
WinUSB 设备
WinUSB 设备
在本主题中,你将了解在 Windows 8 中如何识别 WinUSB 设备。
如果你是开发设备的 OEM 或独立硬件供应商 (IHV),想要将 Winusb.sys 用作功能驱动程序,并且想要自动加载驱动程序而不必提供自定义 INF,本主题中的信息对你适用。
什么是 WinUSB 设备
WinUSB 设备是一种通用串行总线 (USB) 设备,其固件定义了某些 Microsoft 操作系统 (OS) 特征描述符,这些描述符将兼容 ID 报告为 "WINUSB"。
WinUSB 设备的用途是让 Windows 将 Winusb.sys 作为设备的功能驱动程序载入,而无需自定义 INF 文件。对于 WinUSB 设备,你无须为设备分发 INF 文件,对最终用户而言,这大大简化了驱动程序安装过程。相反,如果你需要提供自定义 INF,则不应将设备定义为 WinUSB 设备和在 INF 中指定设备的硬件 ID。
Microsoft 提供了 Winusb.inf,其中包含将 Winusb.sys 作为 USB 设备的设备驱动程序安装所需的信息。
在 Windows 8 之前,要将 Winusb.sys 作为功能驱动程序加载,你需要提供自定义 INF。自定义 INF 指定设备特定的硬件 ID,同时包括内置 Winusb.inf 的部分。这些部分是实例化服务、复制内置二进制文件以及注册设备接口 GUID(应用程序查找设备和与设备通讯必须使用 GUID)所必需的。有关编写自定义 INF 的信息,请参阅 。
在 Windows 8 中,内置 Winusb.inf 文件经过更新后可让 Windows 自动将 INF 与 WinUSB 设备匹配。
使用内置 Winusb.inf 安装 WinUSB 设备
在 Windows 8 中,内置 Winusb.inf 文件已更新。INF 包括引用称为 "USB\MS_COMP_WINUSB" 的兼容 ID 的安装部分。
[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB
更新的 INF 还包括称为 "USBDevice" 的新安装程序类。
"USBDevice" 安装程序类可供 Microsoft 未提供内置驱动程序的设备使用。通常,此类设备不属于定义良好的 USB 类(如音频、Bluetooth 等),并且需要自定义驱动程序。如果你的设备是 WinUSB 设备,则该设备很可能不属于 USB 类。因此,你的设备必须安装在 "USBDevice" 安装程序类下。更新的 Winusb.inf 便于实现该要求。
关于 USBDevice 类的使用:
不要对未分类设备使用“USB”安装程序类。该类预留用于安装控制器、集线器和复合设备。“USB”类误用可能造成严重的可靠性和性能问题。对于未分类设备,请使用“USBDevice”。
在 Windows 8 中,要使用“USBDevice”设备类,只需将其添加到你的 INF 中即可。
Class=USBDevice
ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF}
在设备管理器中,你将会看到一个新节点 USB 通用串行总线设备,你的设备就显示在该节点下。
在 Windows 7 中,除前面的行外,你还需要在 INF 中创建以下注册表设置:
;---------- 添加注册表部分 ----------
[USBDeviceClassReg]
HKR,,,,"Universal Serial Bus devices"
HKR,,NoInstallClass,,1
HKR,,SilentInstall,,1
HKR,,IconPath,%REG_MULTI_SZ%," %systemroot%\system32\setupapi.dll,-20"
在设备管理器中,你将会发现你的设备显示在 USB 通用串行总线设备下。不过,该设备类描述由 INF 中指定的注册表设置派生而来。
- Eliyas Yakub,Microsoft Windows USB 核心团队
注意,"USBDevice" 类不仅限于 WinUSB。如果你有设备的自定义驱动程序,则可在自定义 INF 中使用 "USBDevice" 安装程序类。
在设备枚举过程中,USB 驱动程序堆栈会从设备读取兼容 ID。如果兼容 ID 是 "WINUSB",Windows 会将其用作设备标识符,并在更新的内置 Winusb.inf 中查找匹配,然后将 Winusb.sys 作为设备的功能驱动程序加载。
下图适用于单接口 MUTT 设备,该设备被定义为 WinUSB 设备,因此,Winusb.sys 作为设备的功能驱动程序加载。
对于 Windows 8 之前的 Windows 版本,更新的 Winusb.inf 可通过 Windows 更新提供。如果你的计算机配置为自动获取驱动程序更新,WinUSB 驱动程序将使用新的 INF 程序包进行安装,无需任何用户干预。
如何更改 WinUSB 设备的设备说明
对于 WinUSB 设备,设备管理器会显示“WinUsb 设备”作为设备说明。该字符串是从 Winusb.inf 派生出来的。如果有多个 WinUSB 设备,所有设备都会获得相同的设备说明。
为了分别标识和区分设备管理器中的设备,Windows 8 在设备类中提供了一个新的属性,指示系统优先使用设备报告的说明(在设备的 iProduct 字符串描述符中),而不是 INF 中的说明。Windows 8 中定义的 "USBDevice" 类设置此属性。换句话说,如果设备在 "USBDevice" 类下安装,系统会查询设备的设备说明,并将设备管理器字符串设置为通过查询检索到的任何字符串。在这种情况下,INF 中提供的设备说明将被忽略。
注意前面图中的设备说明字符串:"MUTT"。该字符串通过 USB 设备的产品字符串描述符提供。
新类属性在 Windows 的较早版本中不受支持。在较早版本的 Windows 上,若要自定义设备说明,你必须编写自己的自定义 INF。
如何配置 WinUSB 设备
若要将 USB 设备标识为 WinUSB 设备,设备固件必须具有这些 。
支持扩展的特征描述符
为了让 USB 驱动程序堆栈了解设备支持扩展的特征描述符,设备必须定义存储在字符串索引 0xEE 处的 OS 字符串描述符。在枚举过程中,驱动程序堆栈查询字符串描述符。如果存在描述符,驱动程序堆栈会假定设备包含一个或多个 OS 特征描述符和检索这些特征描述符所需要的数据。
检索的字符串描述符具有 bMS_VendorCode 字段值。该值表示 USB 驱动程序堆栈必须用来检索扩展特征描述符的供应商代码。
有关如何定义 OS 字符串描述符的信息,请参阅 中的 "OS 字符串描述符"。
设置兼容 ID
匹配内置 Winusb.inf 和加载 WinUSB 驱动程序模块所需要的扩展兼容 ID OS 特征描述符。
扩展兼容 ID OS 特征描述符包含紧跟一个或多个功能部分的标题部分,具体取决于是否是复合设备。标题部分指定整个描述符的长度、功能部分的数量以及版本号。对于非复合设备,标题后紧跟一个仅与设备的接口关联的功能部分。该部分的 compatibleID 字段必须指定 "WINUSB" 作为字段值。复合设备有多个功能部分。每个功能部分的 compatibleID 字段必须指定 "WINUSB"。
注册设备接口 GUID
注册设备接口 GUID 所需要的扩展属性 OS 特征描述符。需要使用 GUID 从应用程序或服务查找设备、配置设备以及执行 I/O 操作。
在以前版本的 Windows 中,设备接口 GUID 注册通过自定义 INF 完成。从 Windows 8 开始,你的设备应使用扩展属性 OS 特征描述符报告接口 GUID。
扩展属性 OS 特征描述符包含紧跟一个或多个自定义属性部分的标题部分。标题部分描述整个扩展属性描述符,包含其总长度、版本号以及自定义属性部分的数量。若要注册设备接口 GUID,请添加将 bPropertyName 字段设置为 "DeviceInterfaceGUID" 且将 wPropertyNameLength 设置为 40 字节的自定义属性部分。 使用 GUID 生成唯一的设备接口 GUID,并将 bPropertyData 字段设置为该 GUID,如 "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}"。注意,GUID 指定为 Unicode 字符串,且字符串长度为 78 字节(包括 Null 终止符)。
bPropertyData78 字节
7B 00 38 00 46 00 45 00 36 00 44 00 34 00 44 00
37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31
00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D
00 34 00 39 00 41 00 46 00 43 00 36 00 42 00 46
00 45 00 34 00 37 00 35 00 7D 00 00 00
属性值为 {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}。
在设备枚举过程中,USB 驱动程序堆栈随后从扩展属性 OS 特征描述符检索 DeviceInterfaceGUID 值,并在设备硬件注册表项中注册设备。应用程序通过使用 SetupDiXxx API(参阅 )可检索该值。有关详细信息,请参阅。
启用或禁用 WinUSB 电源管理功能
在 Windows 8 之前,要配置 WinUSB 的电源管理功能,你必须在自定义 INF 的 HW.AddReg 部分中编写注册表项值。
在 Windows 8 中,你可以在设备中指定电源设置。你可以通过扩展属性 OS 特征描述符报告值,从而为该设备启用或禁用 WinUSB 中的功能。可配置的功能有两个:选择性暂停和系统唤醒。
选择性暂停允许设备在闲置时进入低能耗状态。系统唤醒是指在系统处于低能耗状态时,设备唤醒系统的功能。
有关 WinUSB 的电源管理功能的信息,请参阅 。
属性名描述
DeviceIdleEnabled此值设置为 1,以表示设备在闲置时可关闭(选择性暂停)。
DefaultIdleState此值设置为 1,以表示设备在闲置时可暂停(默认情况下)。
DefaultIdleTimeout此值设置为 5000 毫秒表示确定设备处于闲置状态所需等待的毫秒时长。
UserSetDeviceIdleEnabled此值设置为 1,以允许用户控制设备启用或禁用 USB 选择性暂停的功能。设备“电源管理”属性页面上的复选框“允许计算机关闭此设备以节约电源”,用户可选中或取消选中该复选框以启用或禁用 USB 选择性暂停。
SystemWakeEnabled此值设置为 1 允许用户控制设备从低能耗状态唤醒系统的功能。如果启用,“允许此设备唤醒计算机”复选框将显示在设备电源管理属性页面中。用户可选中或取消选中此复选框以启用或禁用 USB 系统唤醒。
例如,若要在设备上启用选择性暂停,请添加一个自定义属性部分,用于将 bPropertyName 字段设置为 Unicode 字符串,并将 "DeviceIdleEnabled" 和 wPropertyNameLength 设置为 36 个字节。 将 bPropertyData 字段设置为 "0x"。这些属性值会存储为 little-endian 32 位整数。
在枚举过程中,USB 驱动程序堆栈会读取扩展属性特征描述符并在该项下创建注册表项。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\&Device Identifier&\&Instance Identifier&\Device Parameters
下图显示了 WinUSB 设备的示例设置。
有关其他示例,请参阅 。
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。
(C) Microsoft 2017WinUSB (Winusb.sys) (Windows Drivers)
此站点使用 Cookie 进行分析、显示个性化内容和广告。继续浏览此站点,即表示您同意使用。
WinUSB (Winusb.sys)
WinUSB (Winusb.sys)
本节介绍 Microsoft 为所有 USB 设备提供的常规 WinUSB 驱动程序 (Winusb.sys) 及其用户模式组件。
在早于 Windows XP Service Pack 2 (SP2) 的 Windows 版本中,所有 USB 设备驱动程序都必须在内核模式下运行。如果所创建的 USB 设备的操作系统没有本机类驱动程序,则需要为该设备编写内核模式设备驱动程序。
Windows USB (WinUSB) 是一种常规的 USB 设备驱动程序,它是与用于 Windows XP SP2 的 Windows 驱动程序框架 (WDF) 同时开发的。WinUSB 架构由内核模式驱动程序 (Winusb.sys) 和公开 的用户模式动态链接库 (Winusb.dll) 组成。
使用这些功能,你可以通过用户模式软件管理 USB 设备。
Winusb.sys 也是将 UMDF 函数驱动程序链接到关联设备的一个重要部分。Winusb.sys 将作为上层筛选器驱动程序安装在设备的内核模式堆栈中。应用程序将与设备的 UMDF 函数驱动程序进行通信,以发出读取、写入或设备 I/O 控制请求。驱动程序将与框架交互,后者可将请求传递给 Winusb.sys。然后,Winusb.sys 将处理该请求,并将其传递给协议驱动程序,最后再传递给设备。将按相反的路径返回所有响应。Winusb.sys 还将用作设备堆栈的即插即用和电源所有者。
WinUSB 功能需要 Windows XP 或更高版本。可在 C/C++ 应用程序中使用这些功能与 USB 设备通信。Microsoft 未向 WinUSB 提供托管的 API。
本节介绍如何使用 WinUSB 与 USB 设备进行通信。本节中的主题提供有关为你的设备选择正确驱动程序的指南,有关安装 Winusb.sys 作为 USB 设备的函数驱动程序的信息,以及显示应用程序与 USB 设备之间如何通信的包含代码示例的详细演练。
本节包括下列主题:
Windows 对 WinUSB 的支持
下表概述了不同 Windows 版本中的 WinUSB 支持。
Windows 版本WinUSB 支持
Windows 10 及更高版本是?
Windows 7是?
Windows Server 2008是?
Windows Vista是?
Windows Server 2003否
Windows XP是?
Windows 2000否
是?:此 Windows 版本的所有 SKU 在基于 x86、x64 和 Itanium 系统上都支持 WinUSB。
是?:此 Windows 版本的所有 SKU 在基于 x86 和 x64 的系统上都支持 WinUSB。
是?:Windows XP SP2 的所有客户端 SKU 都支持 WinUSB。WinUSB 不是 Windows XP 自带的程序,必须通过 WinUSB 辅助安装程序进行安装。
否:此版本的 Windows 不支持 WinUSB。
WinUSB 支持的 USB 功能
下表显示 WinUSB 在不同 Windows 版本中支持的高级 USB 功能。
功能Windows 8.1 及更高版本Windows 7/Vista/XP
设备 I/O 控制请求支持支持
常时等量传输
支持不支持
批量、控制和中断传输支持支持
选择性暂停支持支持
远程唤醒支持支持
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。
(C) Microsoft 2017

我要回帖

更多关于 通信工程师设备与环境 的文章

 

随机推荐