2010-06-10 80 views
2

我有一个USB连接的嵌入式设备。当用户将设备插入其PC(Windows,OSX)时,操作系统如何发现要安装的驱动程序?我如何获得我的驱动程序被选中?他们是否可以驻留在某个中央服务器上(由OS供应商运行)?当你插入一个新的USB设备时会发生什么?

回答

6

这是针对Windows:

当USB设备插入到系统中,USB总线驱动程序通知。 总线驱动程序向设备发送标准USB请求(USB_DEVICE_DESCRIPTOR)。通过此设备报告其名称和类型。 (形式bDeviceClass/bDeviceSubClass/bDeviceProtocol)。

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

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

+0

你给微软一个副本的方式是什么(如他们的称谓)? – Will 2010-06-10 09:37:23

+1

WHQL。不,这不是第一步。 – Christopher 2010-06-10 09:42:07

+0

了解:)。 – Will 2010-06-10 09:56:58

7

对于OS X:

那么我想象的第一部分是类似于Windows。但是,驱动程序(或者说驱动程序堆栈)是通过名为driver matching的进程选择的。每个驱动程序都捆绑了一个特殊的XML字典文件,该文件描述了该驱动程序所用的设备。

字典中的一个键是IOProviderClass键,它告诉操作系统粗略地说明了驱动程序适用于哪些设备。已加载的驱动程序可以提供“nubs”,这是其他驱动程序可以连接的接口。哪些驱动程序尝试附加到结点由IOProviderClass键确定。

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

这个新驱动程序本身可能会为其他驱动程序提供nubs附加。例如,连接USB磁盘驱动器将导致USB堆栈为SCSI块设备驱动程序创建一个结点以连接到该结点。通常情况下,这会导致苹果的标准SCSI块设备驱动程序被加载,这反过来会为BSD驱动程序(每个分区一个)提供nubs,从而在dev文件系统中创建BSD设备节点。

如果您希望将您的驱动程序选定为高于其他驱动程序,您只需为驱动程序所用的设备添加键值对,从而使驱动程序获得非常高的分数。通常只需将密钥放入您的供应商ID /型号就足够了。不过,我认为你可以重写匹配方法(设备驱动程序是用一组受限制的C++编写的)来给你的驱动程序一个非常高的分数。

这是一个高层次的观点。不过,这是我做了这么多年的,因此请确保您阅读了当前的Apple文档

+1

对不起,我不能接受*两个*答案 – Will 2010-06-18 08:45:01

+0

@会:没问题。无论如何,我都很喜欢回忆起我的设备驱动日。 – JeremyP 2010-06-18 10:36:36

相关问题