代码之家  ›  专栏  ›  技术社区  ›  Will

当你插入一个新的USB设备时会发生什么?

  •  3
  • Will  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   Christopher    14 年前

    这是Windows的:

    当USB设备插入系统时,会通知USB总线驱动程序。 总线驱动程序向设备发送一个标准的USB请求(USB设备描述符)。这样,设备就会报告其名称和类型。(BDeVICECSAS/BDEVICESUBStord/BDEVICE协议)。

    根据这些信息,Windows在系统中创建一个设备条目。这就是硬件ID。系统现在试图找到一个可以处理设备(hid/uvc)的通用驱动程序,或者一个专门注册来支持这个硬件ID的驱动程序。

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

        2
  •  7
  •   JeremyP    14 年前

    对于操作系统X:

    好吧,我想第一部分类似于窗户。但是,驱动程序(或者更确切地说是驱动程序堆栈)是由一个称为 driver matching . 每个驱动程序都与一个特殊的XML字典文件捆绑在一起,该文件描述了驱动程序所针对的设备。

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

    因此,例如,当您将USB驱动器插入Mac时,已经加载的USB控制器驱动程序会检测到这一点,并为设备提供一个nub。通过驱动程序匹配选择低级USB驱动程序-对照从设备获取的值(如供应商ID、设备类型等)检查字典中的键/值,并为右IO提供程序类的每个驱动程序派生得分。得分最高的一个附在NUB上。

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

    如果你想让你的驱动程序比其他的选择更高,你所需要做的就是为你的驱动程序所在的设备添加键值对,这会使你的驱动程序得到很高的分数。通常只需输入供应商ID/型号的密钥就足够了。但是,我认为您可以重写匹配方法(设备驱动程序是用C++的限制集编写的),以给您的驱动程序一个非常高的分数。

    这是一个高层次的观点。但是,我已经有好几年没有做过这些了, 所以一定要阅读当前的苹果文档 .