windows USB设备驱动开发-双角色驱动

news2024/11/22 22:25:38

在USB的通讯协议中,规定发起连接的一方为主机(Host),接受连接的一方为设备,这可以用U盘插入电脑举个例子,当U盘插入电脑后,电脑这边主动发起查询和枚举,U盘被动响应查询和数据存取。

USB 双角色驱动程序堆栈体系结构

Windows 现在支持 USB 双角色控制器,从Windows 10开始 ,包括家庭版、专业版、企业版和教育版和Windows 10 移动版。USB 双角色功能使系统成为 USB 设备 或 USB 主机成为可能。 可在 USB-IF 规范中找到 USB 双角色的详细规定。

此处的重要一点是,双重角色功能允许移动设备(如手机、平板手机或平板电脑)将自身指定为设备或主机:

  • 当移动设备处于 功能 模式时,它将连接到电脑或充当附加移动设备主机的其他设备;
  • 当移动设备处于 主机 模式时,用户可以将其设备(如鼠标或键盘)附加到其中。 在本例中,移动设备托管附加的设备;

通过在 Windows 10 中提供对 USB 双重角色的支持,我们提供以下优势:

  • 通过 USB 连接到移动外围设备,与蓝牙等无线协议相比,USB 提供更大的数据带宽;
  • 在连接到其他 USB 设备并与其他 USB 设备通信时通过 USB 充电的选项 前提是 存在所需的硬件支持;
  • 允许最有可能拥有移动设备(如智能手机)的客户完成所有工作。 此功能将提高有线停靠方案中的工作效率,其中移动设备停靠并因此托管外围设备;

下表显示了 Windows 桌面 SKU 和移动 SKU 上可用的 主机 类驱动程序列表。

表中的类驱动程序是根据设备类遥测数据以及为Windows 10选择的关键方案选择的。 我们计划包括有限数量的系统更新、第三方主机驱动程序支持,以支持Windows 10 移动版上的关键设备。 对于桌面版Windows 10,这些驱动程序将在 OEM 网站上或通过 Windows 更新 (Windows Update) 提供。

对于Windows 10 移动版,未包含在支持列表中的第三方驱动程序在 Windows Update上不可用。 USB 主机堆栈 + HID 的磁盘占用空间一直很小。 这就是为什么并非所有类驱动程序,并且极少数第三方驱动程序包含在Windows 10 移动版的支持列表中。 希望提供第三方驱动程序的 OEM 可以使用板支持包 (BSP) 将其添加到移动设备的 OS 映像。

下表显示了 Windows 移动 SKU 上可用的 函数 类驱动程序。

windows会动态监视设备附件数据,以确定是否需要提供其他类驱动程序支持,因为设备类的受欢迎程度列表随时间而变化。

驱动程序实现

Microsoft USB 角色开关 (URS) 驱动程序允许系统实施者利用其平台的双角色 USB 功能。

URS 驱动程序旨在为使用单个 USB 控制器的平台提供双重角色功能,这些控制器可通过单个端口在主机和外围角色中运行。 外围角色也称为功能角色。 URS 驱动程序根据平台中的硬件事件管理端口的当前角色,以及相应软件堆栈的加载和卸载。

在具有 USB micro-AB 连接器的系统上,驱动程序使用硬件中断来指示连接器上的 ID 引脚的状态。 此引脚用于检测控制器是否需要在连接中承担主机角色或函数角色。在具有 USB Type-C 连接器的系统上,OEM 实现者应通过使用 USB Type-C 连接器驱动程序编程接口提供连接器客户端驱动程序。 客户端驱动程序与 Microsoft 提供的 USB 连接器管理器类扩展 (UcmCx) 进行通信,以管理 USB Type-C 连接器的所有方面,例如 CC 检测、PD 消息传送等。 对于角色切换,客户端驱动程序将 USB 类型 C 连接器的状态传达给 URS 驱动程序。

下图显示了使用 URS 驱动程序的双角色控制器的 USB 软件驱动程序堆栈。

请注意,URS 驱动程序永远不会同时加载上图中显示的函数堆栈和主机堆栈。 URS 驱动程序 将加载函数 堆栈 或 主机堆栈 ,具体取决于 USB 控制器的角色。

硬件要求

如果要开发利用 URS 驱动程序的平台以提供双角色 USB 功能,则必须满足以下硬件要求:

1. USB 控制器: 这些驱动程序由 Microsoft 作为内置驱动程序提供。

Synopsys DesignWare Core USB 3.0 控制器。 INF:UrsSynopsys.inf。

Chipidea High-Speed USB OTG 控制器。 INF:UrsChipidea.inf。

2. ID 引脚中断:非 USB 类型 C 系统的 ID 引脚中断可通过以下两种方式之一实现:

  • 两个边缘触发的中断:一个在连接器上的 ID 引脚接地时触发,另一个在 ID 引脚浮动时触发;
  • ID 引脚接地时处于活动级别的单个双活动中断;

3. USB 控制器枚举: USB 双角色控制器必须是 ACPI 枚举的。

软件支持

URS 驱动程序需要一个允许通过连接器控制 VBus 的软件接口。 此接口特定于 SoC。 

Windows 不支持以下 USB OTG 功能:

  • 附件充电器适配器检测 (ACA) ;
  • 会话请求协议 (SRP) ;
  • 主机协商协议 (HNP) ;
  • (ADP) 附加检测协议;
ACPI 系统配置

若要使用 URS 驱动程序,必须为系统创建 ACPI 定义文件。 此外,还必须考虑一些与驱动程序相关的注意事项。

下面是 USB 双角色控制器的示例 ACPI 定义。

//
// You may name the device whatever you want; we don't depend on it being called 'URS0'.
//
Device(URS0)
{
    //
    // Replace with your own hardware ID. Microsoft will add it to the inbox INF,
    // or you may choose to author a custom INF that uses Needs & Includes directives
    // to include sections from the inbox INF.
    //
    Name(_HID, "ABCD1234")

    Name(_CRS, ResourceTemplate() {
        //
        // The register space for the controller must be defined here.
        //
        Memory32Fixed(ReadWrite, 0xf1000000, 0xfffff)


        //
        // The ID pin interrupts, if you are using two edge-triggered interrupts.
        //
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1001}
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1002}

        //
        // Following is an example of a single active-both interrupt.
        //
        // GpioInt(Edge, ActiveBoth, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x12}
        //

        //
        // For a Type-C platform, you do not need to specify any interrupts here.
        //
    })

    //
    // This child device represents the USB host controller. This device node is in effect
    // when the controller is in host mode.
    // You may name the device whatever you want; we don't depend on it being called 'USB0'.
    //
    Device(USB0)
    {
        //
        // The host controller device node needs to have an address of '0'
        //
        Name(_ADR, 0)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt.
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x10}
        })
    }

    //
    // This child device represents the USB function controller. This device node is in effect
    // when the controller is in device/function/peripheral mode.
    // You may name the device whatever you want; we don't depend on it being called 'UFN0'.
    //
    Device(UFN0)
    {
        //
        // The function controller device node needs to have an address of '1'
        //
        Name(_ADR, 1)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt (this could be the same as the one defined in
            // the host controller).
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x11}
        })
    }
}

下面是有关 ACPI 文件的main部分的一些说明:

  • URS0 是 USB 双角色控制器的 ACPI 定义。 这是将加载 URS 驱动程序的 ACPI 设备;
  • USB0 和 UFN0 是 URS0 范围内的子设备。 USB0 和 UFN0 分别表示将由 URS 驱动程序枚举的两个子堆栈,以及主机堆栈和函数堆栈。 请注意,_ADR是 ACPI 将这些设备定义与 URS 驱动程序创建的设备对象匹配的方式;
  • 如果控制器对两个角色使用相同的中断,则可以在两个子设备中描述相同的控制器中断。 即使在这种情况下,中断仍可描述为“独占”;
  • 可以根据需要对此 ACPI 定义文件进行添加。 例如,可以在 ACPI 定义文件中的任何设备上设置任何其他必要的方法或属性。 此类添加不会干扰 URS 驱动程序的操作。 还可以在相应设备的_CRS中描述任何堆栈中所需的任何其他资源;

URS 驱动程序将硬件 ID 分配给主机和函数堆栈。 这些硬件 ID 派生自 URS 设备的硬件 ID。 例如,如果 URS 设备的硬件 ID 为 ACPI\ABCD1234,则 URS 驱动程序为主机和函数堆栈创建硬件 ID,如下所示:

  • 主机堆栈:URS\ABCD1234&HOST
  • 功能堆栈:URS\ABCD1234&FUNCTION
INF 驱动程序安装包

如有必要,第三方驱动程序包可以依赖于此方案。如果你是 IHV 或 OEM,并且正在考虑提供自己的驱动程序包,请考虑以下事项:

1. URS 驱动程序包

每个平台上双角色控制器的硬件 ID 预期将添加到 URS 的收件箱 INF 中。 但是,如果由于某种原因无法添加 ID,IHV/OEM 可能会提供一个驱动程序包,其中包含需要/包含收件箱 INF 并与其硬件 ID 匹配的 INF。

在 IHV/OEM 要求筛选器驱动程序存在于驱动程序堆栈中的情况下,这是必需的。

2. 主机驱动程序包。

需要/包括 usbxhci.inf 且与主机设备硬件 ID 匹配的 IHV/OEM 提供的驱动程序包。 硬件 ID 匹配将基于上一部分所述的方案。

在 IHV/OEM 要求筛选器驱动程序存在于驱动程序堆栈中的情况下,这是必需的。目前windows正在使 URS 驱动程序为主机设备分配 XHCI 兼容 ID。

3. 功能驱动程序包

需要一个 IHV/OEM 提供的驱动程序包,它需要/包括 Ufxsynopsys.inf ,并且与外围设备硬件 ID 相匹配。 硬件 ID 匹配将基于上一部分所述的方案。

IHV/OEM 还可以在驱动程序包中包含Filter驱动程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1883728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《RepViT Revisiting Mobile CNN From ViT Perspective》

期刊:CVPR 年份:2024 代码:http://https: //github.com/THU-MIG/RepViT 摘要 最近,与轻量级卷积神经网络(CNN)相比,轻量级视觉Transformer(ViTs)在资源受限的移动设备上表现出了更高的性能和更低的延迟。研究人员已…

大聪明教你学Java | 深入浅出聊 RocketMQ

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言&#x1f4…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…

旋转变压器软件解码simulink仿真

1.介绍 旋转变压器是一种精密的位置、速度检测装置,尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。旋转变压器在使用时并不能直接提供角度或位置信息,需要特殊的激励信号和解调、计算措施,才能将旋转变压…

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统 一 文档简介二 平台构建2.1 使用平台2.2 百度智能云2.2.1 物联网核心套件2.2.2 在线语音合成 2.3 playback语音数据准备与烧录2.4 开机语音准备与添加2.5 唤醒词识别词命令准备与添加 三 代码准备3.1 sln-local/2-iot 代码…

2025第13届常州国际工业装备博览会招商全面启动

常州智造 装备中国|2025第13届常州国际工业装备博览会招商全面启动 2025第13届常州国际工业装备博览会将于2025年4月11-13日在常州西太湖国际博览中心盛大举行!目前,各项筹备工作正稳步推进。 60000平米的超大规模、800多家国内外工业装备制造名企将云集…

Unity Shader 软粒子

Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候,就需要一些粒子点缀,此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点,可以用Vertex Color与…

KUKA机器人不同运行方式

KUKA机器人有以下四种运行方式: 1、手动慢速运行(T1) 2、手动快速运行(T2) 3、自动运行(AUT) 4、外部自动运行(AUT EXT) 将示教器上的钥匙向右旋转,就会…

【数据结构之B树的讲解】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

专题五:Spring源码之初始化容器上下文

上一篇我们通过如下一段基础代码作为切入点,最终找到核心的处理是refresh方法,从今天开始正式进入refresh方法的解读。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

Study--Oracle-05-Oracler体系结构

一、oracle 体系概览 Oracle数据库的体系结构通常包括以下主要组件: 1、实例(Instance):运行数据库的软件环境,包括内存结构(SGA)和进程结构(Background Processes and User Proces…

Mysql面试合集

概念 是一个开源的关系型数据库。 数据库事务及其特性 事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。 事务特性: (1)原子性:即不可分割性,事务要么全部被执行,要么就…

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

3D Gaussian Splatting代码中的Gaussian_Module和Cameras两个类的代码解读

Gaussian_model 讨论Gaussian_model这个类,是因为里面包含了三维高斯分布的基本信息,里面定义了各种参量的构建方式、用于优化学习的激活函数、学习率设置方法和高斯点优化过程中的增加与删除方式及对应优化器的处理方法。这个类定义在scene文件夹中的g…

探索工业AI智能摄像机的高端科技

在当今快速发展的工业智能化领域,工业AI智能摄像机系列以其卓越的性能和多功能性在国内外备受关注(文末有国外工程师的评测链接)。搭载Raspberry Pi CM4支持的旨在广泛应用,涵盖从简单的条形码扫描到基于人工智能的工业环境中的缺…

数学知识——欧拉函数

数学知识(二) 20240628 求和N互质的个数公式 先分解N,再求个数fai n欧拉函数的证明:用容斥原理 不考 求质因子 p1, … , pk 1-N中与N互质的个数, 去掉质因子倍数 是pi的倍数的有N/pi个,但是会有既是p1也是…

【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体

目录 步骤 一、通过笔刷创建静态网格体 二、破裂静态网格体 三、“统一” 多层级破裂 四、“簇” 群集化的破裂 五、几何体集的材质 六、防止几何体集自动破碎 步骤 一、通过笔刷创建静态网格体 1. 可以在Quixel Bridge中下载两个纹理,用于表示石块的内外纹…

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

微信小程序-插槽slot

一.插槽slot 在页面使用自定义组件的时候&#xff0c;如果在自定义组件里面写子组件&#xff0c;子组件的内容无法显示。 <custom01> <text slotslot-top>你好&#xff0c;上方组件</text> 你好&#xff0c;组件 <text slotslot-bottom>你好&#xf…

小型语言模型的兴起

过去几年&#xff0c;我们看到人工智能能力呈爆炸式增长&#xff0c;其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数&#xff0c;已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而&#xff0c;虽然 LLM 的能力令人印象深刻…