插入新的USB设备会发生什么?

时间:2010-06-10 09:23:11

标签: windows macos usb device-driver

我有一个带USB连接的嵌入式设备。当用户将设备插入PC(Windows,OSX)时,操作系统如何发现要安装的驱动程序?如何选择我的驱动程序?它们可以驻留在某个中央服务器上(由OS供应商运行)吗?

2 个答案:

答案 0 :(得分:7)

对于OS X:

嗯,我想第一部分与Windows类似。但是,驱动程序(或称驱动程序堆栈)由称为driver matching的进程选择。每个驱动程序都捆绑了一个特殊的XML字典文件,该文件描述了驱动程序所用的设备。

字典中的一个键是IOProviderClass键,它告诉操作系统大致说明驱动程序所用的设备系列。已加载的驱动程序可以提供“nubs”,这是其他驱动程序可以附加到的接口。哪些驱动程序尝试附加到nubs由IOProviderClass键确定。

因此,例如,当您将USB驱动器插入Mac时,已加载的USB控制器驱动程序会检测到此情况并为设备提供一个结点。通过驱动程序匹配选择低级USB驱动程序 - 检查字典中的键/值与从设备获得的值,例如,供应商ID,设备类型等,并为正确的IO提供程序类的每个驱动程序派生一个分数。得分最高的人附在小组上。

这个新驱动程序本身可能会提供其他驱动程序附加的小块。例如,连接USB磁盘驱动器将导致USB堆栈为要连接的SCSI块设备驱动程序创建一个nub。通常,这将导致Apple的标准SCSI块设备驱动程序被加载,这将为BSD驱动程序(每个分区一个)提供小块,这反过来又会在开发文件系统中创建BSD设备节点。

如果您希望在其他人之上选择您的驱动程序,您需要做的就是为您的驱动程序添加关键值对,从而使您的驱动程序获得非常高的分数。通常只需将密钥放入供应商ID /型号即可。但是,我认为你可以覆盖匹配方法(设备驱动程序是用一组有限的C ++编写的)来给你的驱动程序一个非常高的分数。

这是一个高级别的观点。但是,自从我做了这些以来已经很多年了,因此请确保您阅读了当前的Apple文档

答案 1 :(得分:6)

这适用于Windows:

当USB设备插入系统时,会通知USB总线驱动程序。 总线驱动程序向设备发送标准USB请求(USB_DEVICE_DESCRIPTOR)。有了这个,设备将报告其名称和类型。 (形式bDeviceClass / bDeviceSubClass / bDeviceProtocol)。

使用此信息,Windows会在系统中创建设备条目。这是硬件ID。系统现在尝试查找可以处理设备的通用驱动程序(HID / UVC)或专门注册自身以支持此硬件ID的驱动程序。

要将驱动程序注册为特定设备的处理程序,您必须将驱动程序安装到系统中,或者必须向Microsoft提供一个可以在其服务器上提供的驱动程序。