在阅读了许多有关 USB 的文章(包括官方的 USB 2.0 规范)后,我想问两个我仍然不明白的问题。
端点到底是什么?它们的用途是什么?让我解释一下:据我所知,端点是数据的来源或目的地。我不想无礼,但我的头很痛,因为我真的不明白为什么。我的意思是,USB 是串行总线,因此它只应该关心将数据传送到正确的目的地。目的地是设备。为什么要以端点的形式在一个设备中包含多个目的地?我的意思是,USB 设备可以按照开发人员想要的任何逻辑结构以它想要的方式管理数据,那么为什么要将它添加到传输规范中呢?
在 PC 上的 USB 主机中,USB 主机会将适当的驱动程序加载到设备。因此,假设我插入一些 USB 自定义类设备。USB 主机驱动程序将获取其 ID 等,在知道设备后,它应该加载其驱动程序。但我认为设备驱动程序存在于内核中,那么如何额外加载驱动程序?
此外,假设我的 USB 主机通过 PCI 连接到 PC。因此,我的 USB 主机设备将生成一些 PCI 中断以引起操作系统的注意,然后操作系统必须首先加载 USB 主机驱动程序。这个过程是不是太慢了?我的意思是,是的,即使 USB 3.0 也比 CPU 可以处理的速度慢得多,但仍然……
答案1
1、端点到底是什么?它的用途是什么?让我解释一下:据我所知,端点是数据的来源或目的地。但是,WTF?我不想无礼,但我的头很痛,因为我真的不明白为什么。我的意思是,USB 是串行总线,所以它应该只关心将数据传送到正确的目的地。目的地是设备。为什么要以端点的形式在设备中包含多个目的地?
是的,“端点”只是一个 USB 概念,即与设备的连接的端点。
设备可以有多个端点的原因是,可能同时进行多种通信,例如控制数据和实际设备数据。为了区分这些,需要多个端点(有点像 FTP 使用的数据+控制通道)。
“USB 简介”很好地解释了这一点:http://www.beyondlogic.org/usbnutshell/usb3.htm
2、在 PC 上的 USB 主机中,USB 主机会将适当的驱动程序加载到设备中。因此,假设我插入了一些 USB 自定义类设备。USB 主机驱动程序将获取其 ID 等,在知道设备后,它应该加载其驱动程序。但我认为设备驱动程序存在于内核中,那么如何额外加载呢?
通常,只有低级 USB 驱动程序内置于内核中。高级驱动程序(尤其是特定于供应商的驱动程序)是按需加载的。其工作原理取决于操作系统,但大多数现代操作系统都可以在运行时将驱动程序加载到内核中,例如使用模块的 Linux 或使用 Windows 驱动程序模型的 Windows。
此外,假设我的 USB 主机通过 PCI 连接到 PC。因此,我的 USB 主机设备将生成一些 PCI 中断以引起操作系统的注意,然后操作系统必须首先加载 USB 主机驱动程序。这个过程是不是太慢了?我的意思是,是的,即使 USB 3.0 也比 CPU 可以处理的速度慢得多,但仍然……
这个问题不太清楚。是的,操作系统必须加载驱动程序,是的,这可能需要几秒钟,但只做一次。而且 PCI 不会成为问题,因为 PCI 甚至比 USB 3.0 快得多。
答案2
如果我理解正确的话,也许这些问题可以阐明一些事情:
USB 集线器应如何声明自己?
模拟多种设备(例如键盘+触控板)的设备应如何声明自己?
对于第二项,我只能从我对 Linux 的了解来谈谈,但驱动程序在第一次需要时会从磁盘加载到内核(如果它是模块化的),但从那时起它就在内存中。这意味着响应时间很快,但设置时间可能会很慢。这对我来说似乎是正常的/可以接受的。